- 显式游标
- 隐式游标:如果在PL/SQL程序段中使用SELECT语句进行操作,PL/SQL 会隐含的处理游标定义,即为隐式游标。这种游标不需要像显式那样声明,也不必打开关闭。
-
1 CREATE OR REPLACE PROCEDURE CX_XM 2 (in_xh IN char,out_xm OUT varchar2) 3 AS 4 BEGIN 5 SELECT 姓名 INTO out_xm 6 FROM XSB 7 WHERE 学号=in_xh AND ROWNUM=1; 8 DBMS_OUTPUT.PUT_LINE(out_xm); 9 END CX_XM;
- 注意
- 每一个隐式游标必须有一个INTO
- 与显式游标一样,就收数据的目标变量的数目、类型要与SELECT列表的一致。
- 隐式游标一次仅能返回一行数据,使用时必须检查一场,最常见的异常有“NO_DATA_FOUND"&"TOO_MANY_ROWS".
- 为确保隐式游标仅返回一行数据,可用ROWCOUNT=1来限定,表示返回第一行数据。
- 游标for循环
1 FOR<变量名>IN<游标名>[(<参数1>[,<参数2>...])]LOOP 2 语句段 3 END LOOP;
- 游标变量REF CURSOR
- 定义CURSOR类型
TYPE<REF CURSOR 类型名> IS REF CURSOR[RETURN<返回类型>]; eg: DECLARE TYPE xs_cur IS REF CURSOR RETURN XSB%ROWTYPE;
REF CURSOR类型既可以是强类型,也可以是弱类型。强REF CURSOR类型有返回类型;而弱类型没有
1 DECLARE 2 TYPE xs_cur IS REF CURSOR RETURN XSB%ROWTYPE; /*强类型*/ 3 TYPE mycur IS REF CURSOR; /*弱类型*/
- 定义CURSOR类型
- 带参数的游标
-
1 游标的参数定义与子程序的参数定义完全相同 2 意义在于传递一个参数给游标指定取哪部分的内容 3 <参数名>[参数模式]<参数类型> ;参数模式默认为IN 4 用open打开游标时,需要提供对应的实参
- 实例
1 /*查询各部门的雇员情况*/ 2 create or replace procedure proc as 3 BEGIN 4 declare 5 cursor dept_cur IS 6 select department_id from departments; 7 v_eid employees.employee_id % type; 8 v_sal employees.salary % type; 9 v_dept employees.department_id % type; 10 cursor emp_cur(v_deptid number) is 11 select employee_id,salary from employeeS where department_id=v_deptid; 12 BEGIN 13 for dept_record in dept_cur LOOP 14 EXIT WHEN DEPT_CUR%NOTFOUND; 15 OPEN EMP_CUR(dept_record.DEPARTMENT_ID); 16 LOOP 17 fetch emp_cur into v_eid,v_sal; 18 EXIT WHEN EMP_CUR%NOTFOUND; 19 insert into temp values(v_eid,v_sal); 20 commit; 21 end loop; 22 close emp_cur; 23 end loop; 24 END; 25 end proc;
-