oracle异常和游标管理

《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