DECLARE EMPL SCOTT.EMP%ROWTYPE; --变量empl的类型为复合类型,类似于c语言中的结构体 CURSOR EMP_CUR IS--声明游标emp_cur SELECT * FROM SCOTT.EMP WHERE DEPTNO=20 ORDERBY SAL; BEGIN OPEN EMP_CUR; -- 打开游标,实质就是执行游标emp_cur定义中的sql语句 FETCH EMP_CUR INTO EMPL; --提取游标,实质就是获取emp_cur所指向的结果集中的当前行 LOOP EXIT WHENNOT EMP_CUR%FOUND; --如果游标走到结果集的尾部,则结束LOOP IF LOWER(EMPL.JOB)='MANAGER'THEN DBMS_OUTPUT.PUT_LINE('THE MANAGER IS' || EMPL.ENAME); ELSE DBMS_OUTPUT.PUT_LINE(EMPL.EMPNO ||' IS ' ||EMPL.ENAME ||' AND SALARY IS ' || EMPL.SAL); END IF; FETCH EMP_CUR INTO EMPL; END LOOP; CLOSE EMP_CUR; --关闭游标 END; /--执行上面的语句
DECLARE ICOUNT INT:=0; BEGIN INSERTINTO EMP( EMPNO, ENMAE ) VALUES( 2, 'jerry' ); DBMS_OUTPUT.PUT_LINE('游标所影响的行数:' ||SQL%ROWCOUNT); IF SQL%NOTFOUNT THEN DBMS_OUTPUT.PUT_LINE('NotFount为真'); ELSE DBMS_OUTPUT.PUT_LINE('NofFount为假'); END IF; END;
显式游标的属性操作
(1)是否找到游标-%FOUND
此属性表示当前游标是否指向有效的一行,取值:TRUE FALSE
例2:
1 2 3 4 5 6 7 8 9 10
BEGIN DELETEFROM EMP WHERE EMPNO=7934; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('DELETE SUCCESS'); ELSE DBMS_OUTPUT.PUT_LINE('DELETE FAIL'); END IF; END;
说明:该例使用了隐式游标,当然,显式游标也可以使用属性%FOUND
(2)是否未找到游标-%NOTFOUND
上例等价于:
例3:
1 2 3 4 5 6 7 8 9 10 11
BEGIN DELETEFROM EMP WHERE EMPNO=7934; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('delete fail'); ELSE DBMS_OUTPUT.PUT_LINE('delete success'); END IF; END; /
(3) 游标行数-%ROWCOUNT
此属性记录了用户成功提取数据的行数,也可以了解为游标所在的行数。
例4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
DECLARE EMPL EMP%ROWTYPE; CURSOR EMP_CUR IS SELECT * FROM EMP; BEGIN OPEN EMP_CUR; LOOP FETCH EMP_CUR INTO EMPL; DBMS_OUTPUT.PUT_LINE(TO_CHAR(EMPL.EMPNO)); EXIT WHEN EMP_CUR%ROWCOUNT=5OR EMP_CUR%NOTFOUND; END LOOP; CLOSE EMP_CUR; END;
DECLARE EMPL EMP%ROWTYPE; CURSOR EMP_CUR IS SELECT * FROM EMP; BEGIN IF EMP_CUR%ISOPEN THEN FETCH EMP_CUR INTO EMPL; DBMS_OUTPUT.PUT_LINE(TO_CHAR(EMPL.EMPNO)); ELSE DBMS_OUTPUT.PUT_LINE('EMP_CUR IS NOT OPEN'); OPEN EMP_CUR; LOOP FETCH EMP_CUR INTO EMPL; DBMS_OUTPUT.PUT_LINE(TO_CHAR(EMPL.EMPNO)); EXIT WHEN EMP_CUR%ROWCOUNT=5; END LOOP; CLOSE EMP_CUR; END IF; END; /
DECLARE DID EMP.DEPTNO%TYPE:=&DEPT_ID; EMPL EMP%ROWTYPE; CURSOR EMP_CUR(DEPTID NUMBER)IS SELECT * FROM EMP WHERE DEPTNO=DEPTID; BEGIN OPEN EMP_CUR(DID); LOOP FETCH EMP_CUR INTO EMPL; DBMS_OUTPUT.PUT_LINE(TO_CHAR(EMPL.EMPNO)); EXIT WHEN (EMP_CUR%ROWCOUNT=3) OR (EMP_CUR%NOTFOUND); END LOOP; CLOSE EMP_CUR; END;
Declare Type t_deptref isrefcursor Return scott.dept%rowtype; --使用%rowtype定义返回类型 Type manager_rcd is record( Ename scott.emp.sname%type, Sal scott.emp.sal%type, Edept scott.emp.deptno%type); --定义记录类型,类似于c语言中的结构体