oracle异常和游标管理.ppt_第1页
oracle异常和游标管理.ppt_第2页
oracle异常和游标管理.ppt_第3页
oracle异常和游标管理.ppt_第4页
oracle异常和游标管理.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

异常和游标管理,第七章,目标,详细讨论异常游标管理技巧,异常8-1,程序错误编译时运行时异常处理运行时错误,PL/SQL是如何处理异常的?错误引发异常每当引发异常时,都将控制权传递给异常处理程序异常处理程序处理异常,异常8-2,异常中涉及的步骤声明异常引发异常处理异常DeclareBeginExceptionEnd;,异常8-3,异常的类型预定义的异常非预定义的异常用户定义的异常,异常8-4,预定义的异常由Oracle为常见错误预定义在DBMS_STANDARD程序包中提供了这些定义不需要显式声明,预定义的异常,预定义的异常,declarevar_statusorder_master.ostatus%type;beginselectostatusintovar_statusfromorder_master;dbms_output.put_line(var_status);-exception-whentoo_many_rowsthen-dbms_output.put_line(查询返回不止一行);end;在Oracle中无法从引发异常的位置继续处理。,预定义的异常,exceptionwhenthenwhenthenwhenothersthenend;预定义异常列表:参考课本page170,非预定义的异常指定与Oracle错误关联的异常关联是通过PRAGMAEXCEPTION_INIT编译指示建立的PRAGMAEXCEPTION_INIT通知编译器使异常名称与标准的oracle服务器错误编号关联。,非预定义的异常,非预定义的异常,declaredup_rowexception;pragmaexception_init(dup_row,-1422);var_statusorder_master.ostatus%type;beginselectostatusintovar_statusfromorder_master;dbms_output.put_line(var_status);exceptionwhendup_rowthendbms_output.put_line(返回行数超过一行);end;,用户定义的异常由程序定义的错误在声明部分中声明类型EXCEPTION声明用户定义的异常是使用RAISE语句显式引发的,用户定义的异常,用户定义的异常,参考课本举例page173.,Raise_Application_Error创建用户定义的错误消息,用户定义的错误消息可以比指定的异常描述的更详细。既可以在可执行部分中使用,也可以在异常部分中使用错误编号必须介于20000和20999之间错误消息的长度可长达2048个字节,定义错误消息,定义错误消息,declaredup_rowexception;pragmaexception_init(dup_row,-1422);var_statusorder_master.ostatus%type;beginselectostatusintovar_statusfromorder_master;dbms_output.put_line(var_status);exceptionwhendup_rowthenraise_application_error(-20001,返回行数超过一行,true);end;,游标,游标指向上下文区域的句柄或指针上下文区域-用于SQL处理的内存区上下文区域的内容语句处理的行数指向语句的语法分析表示的指针,游标类型,游标类型静态游标隐式游标显式游标REF游标,隐式游标,隐式游标PL/SQL为所有DML将打开一个隐式游标,在SQL操作完成后,关闭游标。,游标属性%NOTFOUND:true表示DML语句不返回任何行。%FOUND:true表示DML语句影响一行或者多行。%ROWCOUNT:统计DML语句返回的行数。%ISOPEN:在DML语句执行之后,始终为false。,隐式游标,隐式游标,begindeletefromorder_masterwhereorderno=o201;ifsql%notfoundthendbms_output.put_line(未找到值);elsedbms_output.put_line(找到并删除之);endif;end;,隐式游标,declareorder_noorder_master.orderno%type;beginselectordernointoorder_nofromorder_masterwhereorderno=o001;ifsql%rowcount0thendbms_output.put_line(sql%rowcount);dbms_output.put_line(从中选择行);elsedbms_output.put_line(从中未选择行);endif;end;,显式游标由用户显式声明游标将指向活动集中的当前行控制显式游标Open:执行查询,并将游标指针置于第一行。Fetch:游标指针前进到下一行。Close:关闭游标。,显式游标,显式游标,declareicodeorder_detail.itemcode%type;cursoraisselectitemcodefromorder_detailwhereorderno=o001;beginopena;loopfetchaintoicode;updateitemfilesetitemrate=22.5whereitemcode=icode;exitwhena%notfound;endloop;dbms_output.put_line(项费率已经更新);closea;end;,显式游标,declareorder_noorder_detail.orderno%type;cursoraisselectordernofromorder_detailwhereitemcode=i205;beginopena;loopfetchaintoorder_no;updateorder_mastersetostatus=Dwhereorderno=order_no;exitwhena%notfound;endloop;closea;end;,显式游标,declarecursortestisselect*fromorder_detailwhereorderno=o001;myorderorder_detail%rowtype;-声明游标beginopentest;-打开游标loopfetchtestintomyorder;-操作游标exitwhentest%notfound;endloop;dbms_output.put_line(从表中获取的行数为:|test%rowcount);closetest;-关闭游标end;,显式游标,declarecursormycurisselect*fromorder_master;beginifnotmycur%isopenthendbms_output.put_line(游标尚未被打开);endif;openmycur;ifmycur%isopenthendbms_output.put_line(游标已经打开);endif;closemycur;end;,查询嵌套表中数据的游标,举例,循环游标显式游标的替代方法它的工作原理是什么?隐式打开游标自动从活动集获取行在处理完所有行时关闭游标优点简化代码的编写,循环游标,循环游标,-使用循环游标删除特定供应商的所有订单declarecursorfor_curisselectordernofromorder_masterwherevencode=v002;beginforcust_recinfor_curloopdeletefromorder_detailwhereorderno=cust_rec.orderno;endloop;dbms_output.put_line(供应商v002的所有订单被取消);commit;end;,游标变量类似于PL/SQL变量,可以在运行时接纳不同的值。定义游标变量类型的语法typetype_nameisrefcursorreturnreturn_type;声明游标变量ref_vartype;,REF游标,游标变量,强游标(有约束)、弱游标(无约束)当声明的游标变量类型有返回类型的时候,称为强游标。没有返回类型的游标变量称为弱游标。Typet_add_refisrefcursorreturnvendor_master%rowtype;Typet_add_refisrefcursor;,使用游标变量,在运行时使不同的语句与之关联Opencursor_variableforselect_statement;,游标变量举例,declaretyper1_curisrefcursor;var1r1_cur;onovarchar2(5);novarchar2(20);qordnumber;beginno:=gf;ifupper(no)=ORDERNOthenopenvar1forselectordernofromorder_masterwherevencode=v001;fetchvar1intoono;dbms_output.put_line(订单号|ono);closevar1;elseopenvar1forselectqty_ordfromorder_detailwhereorderno=o001;loopfetchvar1intoqord;exitwhenvar1%notfound;dbms_output.put_line(订购数量是|qord);endloop;closevar1;endif;end;,游标变量举例,declaretypeordertypeisrecord(ordernovarchar2(5),odatedate,vencodevarchar2(5),ostatuschar(1),del_datedate);typeordercurisrefcursorreturnorder_master%rowtype;order_cvordercur;order_recordertype;beginopenorder_cvforselectorderno,odate,vencode,ostatus,del_datefromorder_masterwherevencode=v001;loopfetchorder_cvintoorder_rec;exitwhenorder_cv%notfoun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论