您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > Oracle数据库-SQL+PLSQL-Less20-高级显式游标
1表中依次取出部门的代号和名称。将这两个参数传送到另外一个游标当中,取出emp表当中工作在该部门的雇员姓名、工作、雇佣日期、工资信息。其输出如下:DepartmentNumber:10DepartmentName:ACCOUNTINGKINGPRESIDENT17-NOV-815000CLARKMANAGER09-JUN-812450MILLERCLERK23-JAN-821300DepartmentNumber:20DepartmentName:RESEARCHJONESMANAGER02-APR-812975FORDANALYST03-DEC-813000SMITHCLERK17-DEC-80800SCOTTANALYST09-DEC-823000ADAMSCLERK12-JAN-8311003表中雇员的工资,使得工资等于或者超过1500的雇员工资增加%20,没有超过1500的增加%304带参数的游标•语法:–当打开游标时,向游标传递参数,并执行查询.–每次可以用不同的参数来打开一个游标.CURSORcursor_name[(parameter_namedatatype,...)]ISselect_statement;6带参数的游标•向WHERE子句中传递部门号和工作这两个参数.•例子:DECLARECURSORemp_cursor(p_deptnoNUMBER,p_jobVARCHAR2)ISSELECTempno,enameFROMempWHEREdeptno=p_deptnoANDjob=p_job;p_emp_cursoremp_cursor%ROWTYPE;BEGINOPENemp_cursor(10,'CLERK');loopfetchemp_cursorintop_emp_cursor;exitwhenemp_cursor%NOTFOUND;dbms_output.put_line(p_emp_cursor.empno);dbms_output.put_line(p_emp_cursor.ename);endloop;closeemp_cursor;end;7子句•语法:–使用FORUPDATE语句使得在事务运行期间,其它事务对同一数据的访问被拒绝。–在update或者delete之前,该行数据被加锁。SELECT...FROM...FORUPDATE[OFcolumn_reference][NOWAIT];8子句•查出在30号部门工作的所有员工.•例子:DECLARECURSORemp_cursorISSELECTempno,ename,salFROMempWHEREdeptno=30FORUPDATEOFsalNOWAIT;p_emp_cursoremp_cursor%ROWTYPE;BEGINopenemp_cursor;loopfetchemp_cursorintop_emp_cursor;exitwhenemp_cursor%NOTFOUND;dbms_output.put_line(p_emp_cursor.empno);dbms_output.put_line(p_emp_cursor.ename);dbms_output.put_line(p_emp_cursor.sal);endloop;closeemp_cursor;end;9子句•语法:–使用游标来修改和删除当前行.–在游标查询语句中包含FORUPDATE子句,以锁定当前的行.–使用WHERECURRENTOF子句来引用某个显式游标的一行.WHERECURRENTOFcursor;10•DECLARE•CURSORsal_cursorIS•SELECTsal•FROMemp•WHEREdeptno=30•FORUPDATEOFsalNOWAIT;•BEGIN•FORemp_recordINsal_cursorLOOP•UPDATEemp•SETsal=emp_record.sal*1.10•WHERECURRENTOFsal_cursor;•ENDLOOP;•COMMIT;•END;WHERECURRENTOF子句实例:11(SELECTdeptno,count(*)STAFFFROMempGROUPBYdeptno)t2WHEREt1.deptno=t2.deptnoANDt2.STAFF=5;p_my_cursormy_cursor%ROWTYPE;BEGINopenmy_cursor;loopfetchmy_cursorintop_my_cursor;exitwhenmy_cursor%NOTFOUND;dbms_output.put_line(p_my_cursor.deptno);dbms_output.put_line(p_my_cursor.dname);dbms_output.put_line(p_my_cursor.STAFF);endloop;closemy_cursor;end;实例:12表中依次取出部门的代号和名称。将这两个参数传送到另外一个游标当中,取出emp表当中工作在该部门的雇员姓名、工作、雇佣日期、工资信息。其输出如下:DepartmentNumber:10DepartmentName:ACCOUNTINGKINGPRESIDENT17-NOV-815000CLARKMANAGER09-JUN-812450MILLERCLERK23-JAN-821300DepartmentNumber:20DepartmentName:RESEARCHJONESMANAGER02-APR-812975FORDANALYST03-DEC-813000SMITHCLERK17-DEC-80800SCOTTANALYST09-DEC-823000ADAMSCLERK12-JAN-83110013(v_deptnonumber)ISselectename,job,hiredate,salfromempwheredeptno=v_deptno;emp_recemp_cursor%ROWTYPE;BEGINOPENdept_cursor;LOOPFETCHdept_cursorINTOdept_rec;EXITWHENdept_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE('DepartmentNumber:'||dept_rec.deptno||'DepartmentName:'||dept_rec.dname);FORemp_recINemp_cursor(dept_rec.deptno)LOOPDBMS_OUTPUT.PUT_LINE(emp_rec.ename||''||emp_rec.job||''||emp_rec.hiredate||''||emp_rec.sal);ENDLOOP;ENDLOOP;14使用游标来修改emp表中雇员的工资,使得工资等于或者超过1500的雇员工资增加%20,没有超过1500的增加%30DECLARECURSORsal_cursorISSELECTsalFROMempFORUPDATEOFsalNOWAIT;emp_recordsal_cursor%ROWTYPE;BEGINFORemp_recordINsal_cursorLOOPIFemp_record.sal1500THENUPDATEempSETsal=emp_record.sal*1.30WHERECURRENTOFsal_cursor;ELSIFemp_record.sal=1500THENUPDATEempSETsal=emp_record.sal*1.20WHERECURRENTOFsal_cursor;ENDIF;ENDLOOP;END;/
本文标题:Oracle数据库-SQL+PLSQL-Less20-高级显式游标
链接地址:https://www.777doc.com/doc-7534915 .html