- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章异常和游标管理目标详细讨论异常游标管理技巧异常 8- 1程序错误编译时运行时异常处理运行时错误PL/SQL 是如何处理异常的?错误引发异常每当引发异常时,都将控制权传递给异常处理程序异常处理程序处理异常异常8 - 2异常中涉及的步骤声明异常引发异常处理异常DeclareBeginExceptionEnd;异常 8- 3异常的类型预定义的异常非预定义的异常用户定义的异常异常 8- 4预定义的异常由 Oracle 为常见错误预定义在 DBMS_STANDARD 程序包中提供了这些定义不需要显式声明预定义的异常预定义的异常declare var_status order_master.ostatus %type;begin select ostatus into var_status from order_master; dbms_output.put_line(var_status);--exception-- when too_many_rows then-- dbms_output.put_line(查询返回不止一行);end;在Oracle中无法从引发异常的位置继续处理。预定义的异常exception when … then when … then when others thenend; 预定义异常列表:参考课本page170非预定义的异常非预定义的异常指定与 Oracle 错误关联的异常关联是通过 PRAGMA EXCEPTION_INIT 编译指示建立的PRAGMA EXCEPTION_INIT通知编译器使异常名称与标准的oracle服务器错误编号关联。非预定义的异常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;用户定义的异常由程序定义的错误在声明部分中声明类型 EXCEPTION 声明用户定义的异常是使用 RAISE 语句显式引发的用户定义的异常用户定义的异常参考课本举例page173.定义错误消息Raise_Application_Error创建用户定义的错误消息,用户定义的错误消息可以比指定的异常描述的更详细。既可以在可执行部分中使用,也可以在异常部分中使用错误编号必须介于 –20000 和 –20999 之间错误消息的长度可长达 2048 个字节定义错误消息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 raise_application_error(-20001,返回行数超过一行,true); end;游标游标指向上下文区域的句柄或指针上下文区域 - 用于 SQL 处理的内存区上下文区域的内容语句处理的行数指向语句的语法分析表示的指针游标类型游标类型静态游标隐式游标显式游标REF 游标隐式游标隐式游标 PL/SQL为所有DML将打开一个隐式游标,在SQL操作完成后,关闭游标。隐式游标游标属性%NOTFOUND:true表示DML语句不返回任何行。%FOUND: true表示DML语句影响一行或者多行。%ROWCOUNT:统计DML语句返回的行数。%ISOPEN:在DML语句执行之后,始终为false。隐式游标begin delete from order_master where orderno = o201; if sql%notfound then dbms_output.put_line(未找到值); else dbms_output.put_line(找到并删除之); end if;end;隐式游标declare order_no order_master.orderno%type;begin select orderno into order_no from order_master where orderno = o001; if sql%ro
文档评论(0)