1. 首页
  2. 文档大全

oracle异常和游标管理

上传者:bh****0 2022-05-29 14:25:32上传 PPTX文件 346.24KB
oracle异常和游标管理_第1页 oracle异常和游标管理_第2页 oracle异常和游标管理_第3页

《oracle异常和游标管理》由会员分享,可在线阅读,更多相关《oracle异常和游标管理(37页珍藏版)》请在文档大全上搜索。

1、异常和游标管理第七章第七章1第一页,共三十七页。目标n详细讨论异常n游标管理技巧2第二页,共三十七页。异常 8- 1n程序错误编译时编译时运行时运行时n异常处理运行时错误处理运行时错误3第三页,共三十七页。nPL/SQL 是如何处理异常的?错误引发异常错误引发异常每当引发异常时,都将控制权传递给异常处理每当引发异常时,都将控制权传递给异常处理程序程序异常处理程序处理异常异常处理程序处理异常异常8 - 24第四页,共三十七页。异常中涉及的步骤声明异常声明异常引发异常引发异常处理异常处理异常DeclareBeginExceptionEnd;异常 8- 35第五页,共三十七页。异常的类型预定义的异常

2、预定义的异常非预定义的异常非预定义的异常用户定义的异常用户定义的异常异常 8- 46第六页,共三十七页。预定义的异常由由 Oracle 为常见错误预定义为常见错误预定义在在 DBMS_STANDARD 程序包程序包中提供了这中提供了这些定义些定义不需要显式声明不需要显式声明预定义的异常7第七页,共三十七页。预定义的异常declare var_status order_master.ostatus %type;begin select ostatus into var_status from order_master; dbms_output.put_line(var_status);-exce

3、ption- when too_many_rows then- dbms_output.put_line(查询返回不止一行); end;n在Oracle中无法从引发异常的位置继续处理。8第八页,共三十七页。预定义的异常nexceptionn when thenn when thenn when others thennend; n预定义异常列表:参考课本page1709第九页,共三十七页。非预定义的异常指定与 Oracle 错误关联的异常关联是通过 PRAGMA EXCEPTION_INIT 编译指示建立的PRAGMA EXCEPTION_INIT通知编译器使异常名称与标准的oracle效劳器

4、错误编号关联。非预定义的异常10第十页,共三十七页。非预定义的异常declare dup_row exception; pragma exception_init(dup_row,-1422); var_status order_master.ostatus %type;begin select ostatus into var_status from order_master; dbms_output.put_line(var_status);exception when dup_row then dbms_output.put_line(返回行数超过一行);end;11第十一页,共三十七页

5、。用户定义的异常由程序定义的错误在声明局部中声明类型 EXCEPTION 声明用户定义的异常是使用 RAISE 语句显式引发的用户定义的异常12第十二页,共三十七页。用户定义的异常n参考课本举例page173.13第十三页,共三十七页。Raise_Application_Error创立用户定义的错误消息,用户定义的错误消息可以比指定的异常描述的更详细。既可以在可执行局部中使用,也可以在异常局部中使用错误编号必须介于 20000 和 20999 之间错误消息的长度可长达 2048 个字节定义错误消息定义错误消息14第十四页,共三十七页。定义错误消息定义错误消息declare dup_row ex

6、ception; pragma exception_init(dup_row,-1422); var_status order_master.ostatus %type;begin select ostatus into var_status from order_master; dbms_output.put_line(var_status);exception when dup_row then raise_application_error(-20001,返回行数超过一行,true); end;15第十五页,共三十七页。游标游标指向指向上下文区域上下文区域的句柄或指针的句柄或指针上下文区

7、域上下文区域 - - 用于用于 SQL 处理的内存区处理的内存区上下文区域的内容上下文区域的内容语句处理的语句处理的行数行数指向语句的语法分析表示的指向语句的语法分析表示的指针指针16第十六页,共三十七页。游标类型游标类型静态游标静态游标隐式游标隐式游标显式游标显式游标REF 游标游标17第十七页,共三十七页。隐式游标隐式游标 PL/SQL为所有DML将翻开一个隐式游标,在SQL操作完成后,关闭游标。18第十八页,共三十七页。游标属性%NOTFOUND:true表示表示DML语句不返回任何行。语句不返回任何行。%FOUND: true表示表示DML语句影响一行或者多行。语句影响一行或者多行。%

8、ROWCOUNT:统计:统计DML语句返回的行数。语句返回的行数。%ISOPEN:在:在DML语句执行之后,始终为语句执行之后,始终为false。隐式游标19第十九页,共三十七页。隐式游标begin delete from order_master where orderno = o201; if sql%notfound then dbms_output.put_line(未找到值); else dbms_output.put_line(找到并删除之); end if;end;20第二十页,共三十七页。隐式游标declare order_no order_master.orderno%typ

9、e;begin select orderno into order_no from order_master where orderno = o001; if sql%rowcount 0 then dbms_output.put_line(sql%rowcount); dbms_output.put_line(从中选择行); else dbms_output.put_line(从中未选择行); end if;end;21第二十一页,共三十七页。显式游标由用户显式声明由用户显式声明游标将指向活动集中的当前行游标将指向活动集中的当前行控制显式游标nOpen:执行查询,并将游标指针置于第一行。:执

10、行查询,并将游标指针置于第一行。nFetch:游标指针前进到下一行。:游标指针前进到下一行。nClose:关闭游标。:关闭游标。显式游标22第二十二页,共三十七页。显式游标declare icode order_detail.itemcode%type; cursor a is select itemcode from order_detail where orderno = o001;begin open a; loop fetch a into icode; update itemfile set itemrate = 22.5 where itemcode = icode; exit w

11、hen a%notfound; end loop; dbms_output.put_line(项费率已经更新); close a;end;23第二十三页,共三十七页。显式游标declare order_no order_detail.orderno%type; cursor a is select orderno from order_detail where itemcode = i205;begin open a; loop fetch a into order_no; update order_master set ostatus = D where orderno = order_no

12、; exit when a%notfound; end loop; close a;end;24第二十四页,共三十七页。显式游标declare cursor test is select * from order_detail where orderno = o001; myorder order_detail%rowtype;-声明游标begin open test;-翻开游标 loop fetch test into myorder; -操作游标 exit when test%notfound; end loop; dbms_output.put_line(从表中获取的行数为:|test%

13、rowcount); close test;-关闭游标end;25第二十五页,共三十七页。显式游标declare cursor mycur is select * from order_master;begin if not mycur%isopen then dbms_output.put_line(游标尚未被翻开); end if; open mycur; if mycur%isopen then dbms_output.put_line(游标已经翻开); end if; close mycur;end;26第二十六页,共三十七页。查询嵌套表中数据的游标n举例27第二十七页,共三十七页。循

14、环游标显式游标的替代方法它的工作原理是什么?隐式翻开游标自动从活动集获取行在处理完所有行时关闭游标优点简化代码的编写循环游标28第二十八页,共三十七页。循环游标-使用循环游标删除特定供给商的所有订单declare cursor for_cur is select orderno from order_master where vencode = v002;begin for cust_rec in for_cur loop delete from order_detail where orderno = cust_rec.orderno; end loop; dbms_output.put_l

15、ine(供给商v002的所有订单被取消); commit;end;29第二十九页,共三十七页。游标变量类似于游标变量类似于PL/SQL变量,可以在运行时接变量,可以在运行时接纳不同的值。纳不同的值。定义游标变量类型的语法定义游标变量类型的语法type type_name is ref cursor return return_type;声明游标变量声明游标变量 ref_var type;REF 游标30第三十页,共三十七页。游标变量游标变量n强游标(有约束)、弱游标(无约束)n当声明的游标变量类型有返回类型的时候,称为强游标。没有返回类型的游标变量称为弱游标。Type t_add_ref is

16、 ref cursor return vendor_master%rowtype;Type t_add_ref is ref cursor;31第三十一页,共三十七页。使用游标变量使用游标变量在运行时使不同的语句与之关联在运行时使不同的语句与之关联Open cursor_variable for select_statement;32第三十二页,共三十七页。游标变量举例游标变量举例ndeclaren type r1_cur is ref cursor;n var1 r1_cur;n ono varchar2(5);n no varchar2(20);n qord number;nbeginn

17、no := gf;n if upper(no) = ORDERNO thenn open var1 forn select orderno from order_mastern where vencode = v001;n fetch var1 into ono;n dbms_output.put_line(订单号|ono);n close var1;n elsen open var1 forn select qty_ord from order_detailn where orderno = o001;n loopn fetch var1 into qord;n exit when var1

18、%notfound;n dbms_output.put_line(订购数量是|qord);n end loop;n close var1;n end if;nend;33第三十三页,共三十七页。游标变量举例游标变量举例ndeclaren type ordertype is record(n orderno varchar2(5),n odate date,n vencode varchar2(5),n ostatus char(1),n del_date daten );n type ordercur is ref cursor return order_master%rowtype;n or

19、der_cv ordercur;n order_rec ordertype;nbeginn open order_cv forn select orderno,odate,vencode,ostatus,del_daten from order_mastern where vencode = v001;n loopn fetch order_cv into order_rec;n exit when order_cv%notfound;n dbms_output.put_line(n 这些值为: |n order_rec.orderno | |n order_rec.odate | |n or

20、der_rec.vencode | |n order_rec.ostatus | |n order_rec.del_daten );n end loop;n close order_cv;nend;34第三十四页,共三十七页。限制不能在程序包中声明游标变量远程子程序不能承受游标变量的值不能使用比较操作符对游标变量进展相等或不相等测试不能将空值赋予游标变量表不能存储游标变量的值游标管理9 - 935第三十五页,共三十七页。演讲完毕,谢谢观看!第三十六页,共三十七页。内容总结异常和游标管理。由 Oracle 为常见错误预定义。在 DBMS_STANDARD 程序包中提供了这些定义。指定与 Oracle 错误关联的异常。pragma exception_init(dup_row,-1422)。是使用 RAISE 语句显式引发的。错误消息的长度可长达 2048 个字节。dbms_output.put_line(sql%rowcount)。del_date date。演讲完毕,谢谢观看第三十七页,共三十七页。


文档来源:https://www.renrendoc.com/paper/212487266.html

文档标签:

下载地址