ORACLE游标
游标分为 隐式游标,显式游标,动态游标。
如果想在运行的时候动态确定结果集,就要使用ref游标和游标变量。 创建ref游标需要两个步骤:1 声明ref cursor类型 2 声明 ref cursor类型变量。 语法如下: type ref_cursor_name is ref cursor [return record_type] 其中,return 用于指定游标提取结果集的返回类型。有return表示是强类型ref游标, 没有return表示是弱类型的游标。弱类型游标可以提取任何类型的结果集.
在PL/SQL中可以执行动态SQL语句,execute immediate 语句只能语句处理返回单行 或没有返回的SQL语句,ref游标则可以处理返回结果集的动态SQL。ref游标的声明 方法与普通ref游标相同,只是在open时指定了动态SQL字符串。 open cursor_name for dynamic_select_string [using bind_argument_list]
隐式游标SQL%ISOPEN,SQL%FOUND,SQL%NOFOUND,SQL%ROWCOUNT
游标遍历一个表
DECLARE CURSOR C IS SELECT * FROM EMP; L_REC EMP%ROWTYPE; BEGIN OPEN C; LOOP FETCH C INTO L_REC; EXIT WHEN C%NOTFOUND; DBMS_OUTPUT.PUT_LINE(L_REC.ENAME); END LOOP; END;
DECLARE CURSOR C IS SELECT * FROM EMP; L_REC EMP%ROWTYPE; BEGIN FOR L_REC IN C LOOP DBMS_OUTPUT.PUT_LINE(L_REC.ENAME); END LOOP; END;
比较上面两个程序段可以看到,若用FOR循环不需要OPEN CURSOR;而使用fetch 则需要OPEN CURSOR
DECLARE L_REC EMP%ROWTYPE; TYPE REF_MYCURSOR IS REF CURSOR; AA REF_MYCURSOR; BEGIN OPEN AA FOR SELECT * FROM EMP; LOOP FETCH AA INTO L_REC; EXIT WHEN AA%NOTFOUND; DBMS_OUTPUT.PUT_LINE(L_REC.ENAME); END LOOP; END;
DECLARE CURSOR C_DEPT(P_DEPTNO NUMBER) IS SELECT * FROM EMP WHERE EMP.DEPTNO=P_DEPTNO; R_EMP EMP%ROWTYPE; BEGIN FOR R_EMP IN C_DEPT(20) LOOP DBMS_OUTPUT.PUT_LINE(R_EMP.ENAME); END LOOP; END;