《游标和异常处理.docx》由会员分享,可在线阅读,更多相关《游标和异常处理.docx(15页珍藏版)》请在第一文库网上搜索。
1、游标是数据处理的一种重要方法。游标分为显式游标和隐式游标。隐式游标由某些SQ1隐含定义和使用,显式游标则由用户自己定义。游标是SQ1的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。游标一旦打开,数据就从数据库中传递到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。隐式游标隐式游标属性隐式游标属性值返回值类型意义SQ1%ROWCOUNT整型代表DM1语句成功执行的行数SQ1%FOUND布尔型值为TRUE代表插入、删除、更新或单行查询操作成功SQ1%NOTFOUND布尔型与SQ1%FOND属性返回值相反SQ1%ISOPEN布尔值
2、DM1执行过程中为真,结束后为假1、使用隐式游标判断对雇员工资的修改是否成功SQ1setserveroutputonSQ1beginupdateempsetsa1=1200whereempno=1001;ifsq1%foundthendbms_output.put_1ine(Theupdateissuccessfu1.,);commit;e1sedbms_output.put_1ine(,Theupdateisunsuccessfu1!,);endif;end;/Theupdateissuccessfu1.P1/SQ1proceduresuccessfu11ycomp1eted.2、隐式游标循
3、环SQ1setserveroutputonSQ1dec1arecursorcs_empisse1ectempnojenamejjobfromemp;beginforrc_empincs_emp1oopdbms_output.put_1ine(rc_emp.empno|rc_emp.ename,rc_emp.job);end1oop;end;/1001,OraC1e,1002,OraC1e,1003,orac1e,1004,orac1e,1005,OraCIe,7369,SM工TH,C1ERK7499,A11EN,SA1ESMAN7521,WARD,SA1ESMAN7566,JONES,MANA
4、GER7654jMARTIN,SA1ESMAN7698,B1AKE,MANAGER7782,C1ARK,MANAGER7788,SCOTT,ANA1YST7839,KING,PRESIDENT7844,TURNER,SA1ESMAN7876,ADAMS,C1ERK7900,JAMES,C1ERK7902,FORD,ANA1YST7934,M工11ER,C1ERKP1/SQ1proceduresuccessfu11ycomp1eted.显示游标显示游标由用户自己定义和操作游标,通常所说的游标都是指显示游标。游标的使用分成以下4个步骤:1、声明游标在DEC1ARE部分按以下格式声明游标:CURSO
5、R游标名(参数1数据类型,参数2数据类型.)ISSE1ECT语句;参数是可选部分所定义的参数可以出现在SE1EcT语句的WHERE子句中。如果定义了参数,则必须在打开游标时传递相应的实际参数。2、打开游标在可执行部分,按以下格式打开游标:OPEN游标名(实际参数实际参数2);打开游标时,SE1ECT语句的查询结果就被传送到了游标工作区。3、提取数据在可执行部分,按以下格式将游标工作区中的数据提取到变量中。提取操作必须在打开游标之后进行。FETCH游标名INTO变量名变量名2;或FETCH游标名INTO记录变量;游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一样数据,要返回多行
6、需重复执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。对以上两种格式进行说明:第一种格式中的变量是用来从游标中接收数据的变量,需要事先定义。变量的个数与类型应与SE1ECT语句中的字段变量的个数与类型一致。第二种格式一次将一行数据取到记录变量中,需使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。(定义记录变量方法:变量名表名I游标名ROWTYPE)4、关闭游标C1OSE游标名;显示游标打开后,必须显示地关闭。游标一旦关闭,游标占用的资源就被释放,游标变成无效,必须重新打开才能使用。显式游标属性显示游标属性值返回值类型意义%ROWC
7、OUNT整型获得FETCH语句返回的行数%FOUND布尔型最近的FETCH语句返回一行数据则为真,否则为假%NOTFOUND布尔型与FOUND属性返回值相反%ISOPEN布尔值游标已经打开时值为真,否则为假游标%isopen判断游标是否打开,如果打开了,则返回值为真,否则为假游标%notfoUnd判断fetch语句是否成功执行,当fetch语句失败时,说明数据已经提取完,退出循环。显示游标使用示例1、三种方法显示工资最高前三名编号、姓名、部门名称、工资方法一:SQ1setserveroutputonSQ17499,A11EN,SA1ES,16007521,WARD,SA1ES,12507369
8、,SMITH,RESEARCH,800P1/SQ1proceduresuccessfu11ycomp1eted.方法二:SQ1setserveroutputonSQ1dec1arecursorcs_empisse1ectempno,enamednamejsa1fromempa,deptbwherea.deptno=b.deptnoorderbysa1desc;rc_empcs-emp%rowtype;beginopencs_emp;ifcs-emp%isopenthenforiin1.31oopfetchcs_empintorc_emp;dbms_output.put_1ine(rc_emp.
9、empno,j,rc_emp.ename,j,rc_emp.dname,|rc_emp.sa1);end1oop;e1sedbms-output.put_1ine(,Thecursorisnotopen!,);endif;c1osecs_emp;end;/7499,A11EN,SA1ES,16007521,WARD,SA1ES,12507369,SMITH,RESEARCH,800P1/SQ1proceduresuccessfu11ycomp1eted.方法三(更换循环方式,以下是常用循环方法):SQ1setserveroutputonSQ1dec1arev_empnonumber(4);v_
10、enamevarchar2(10);v_dnamevarchar2(14);v_sa1number(7,2);cursorcs_empisse1ectempnojenamejdnamejsa1fromempa,deptbwherea.deptno=b.deptnoorderbysa1desc;beginopencs-emp;ifcs_emp%isopenthen1oopfetchcs_empintov-empnojv_enamejv-dnamev_sa1;exitwhencs_emp%notfound;dbms_output.put_1ine(v_empno,v_ename,jv_dnamej
11、IkSa1);end1oop;e1sedbms_output.put_1ine(Thecursorisnotopen!);endif;c1osecs_emp;end;/7499,A11EN,SA1ES,16007521,WARD,SA1ES,12507369,SMITH,RESEARCH,800P1/SQ1proceduresuccessfu11ycomp1eted.2、游标参数传递两种方法方法一:SQ1setserveroutputonSQ1dec1arev_empnonumber(4);v_enamevarchar2(10);cursorcs_emp(p_deptnonumber,p_jo
12、bvarchar2)isse1ectempno,enamefromempwheredeptno=p_deptnoandjob=p_job;beginopencs_emp(10,C1ERK);ifcs_emp%isopenthen1oopfetchcs_empintov_empno,v_ename;exitwhencs_emp%notfound;dbms_output.put_1ine(v_empno|,|v_ename);end1oop;e1sedbms_output.put_1ine(Thecursorisnotopen!);endif;c1osecs_emp;end;/7934,MI11E
13、RP1/SQ1proceduresuccessfu11ycomp1eted.方法二:SQ1setserveroutputonSQ1dec1arev_empnonumber(4);v_enamevarchar2(10);p_deptnonumber(2);p_jobvarchar2(9);cursorcs_empisse1ectempno,enamefromempwheredeptno=p_deptnoandjob=p_job;beginp_deptno:=10;p_job:=,C1ERK,;opencs_emp;ifcs_emp%isopenthen1oopfetchcs_empintov_e
14、mpnojv_ename;exitwhencs-emp%notfound;dbms_output.put_1ine(v_empno|,|v_ename);end1oop;e1sedbms_output.put_1ine(Thecursorisnotopen!);endif;c1osecs_emp;end;/7934,M工11ERP1/SQ1proceduresuccessfu11ycomp1eted.动态SE1ECT语句和动态游标动态SE1EeT语句:SQ1setserveroutputonSQ1dec1arev_empnonumber(4);v_enamevarchar2(10);sq1strvarchar2(100);beginsq1str:=,se1ectempnojenamefromempwhereempno=7788;executeimmediatesq1strintov-empnojv_ename;dbms_output.put_1ine(v_empno|,|v_ename);end;/7788,SCOTTP1/SQ1proceduresuccessfu11ycomp1eted.动态游标:定