动态游标的分类:
一 强类型 :带RETURN语句的,只能为查询结果与ruturn类型相同的查询语句打开。
二 弱类型 :不带RERURN语句。可以为任何查询语句打开。
--使用动态游标的步骤
1:定义REF动态游标类型。 2:声明ref动态游标。 3:打开ref动态游标。 4:关闭游标
1:定义REF动态游标
语法:TYPE 〈类型名〉 IS REF CURSOR
[RETURN <返回类型>] ; --如果定义了返回类型,类型必须是RECORD类型。
2:声明ref动态游标
语法:<游标名> <游标类型> ; --游标类型必须是自定义的ref类型
3:打开ref动态游标
语法: OPEN 〈游标名〉 FOR 〈查询语句〉; --打开游标的时候需要确定查询语句。
4:关闭游标
SLOSE 〈游标名〉;
--------示例,动态游标的用法
--动态游标,强类型游标,定义游标所要绑定数据表
DECLARE
TYPE ref_cur_emp IS REF CURSOR RETURN emp%Rowtype; --声明REF游标类型
rc_emp ref_cur_emp; --声明游标变量
emp_row emp%ROWTYPE;
BEGIN
OPEN rc_emp FOR --打开游标,并且绑定要查询的语句
SELECT * FROM emp;
LOOP
FETCH rc_emp INTO emp_row; --提取游标
EXIT WHEN rc_emp%NOTFOUND;
dbms_output.put_line(rc_emp%ROWCOUNT||' '||emp_row.empno||' '||emp_row.ename||' '||emp_row.sal);
END LOOP;
CLOSE rc_emp; --关闭游标
END;
--------------------------------------------
--动态游标,弱类型游标
DECLARE
TYPE ref_cur IS REF CURSOR; --声明REF游标类型
rc_emp ref_cur; --声明游标变量
emp_row emp%ROWTYPE;
v_no emp.empno%TYPE;
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_dname dept.dname%TYPE;
BEGIN
OPEN rc_emp FOR --打开游标,并且绑定要查询的语句
SELECT * FROM emp;
dbms_output.put_line('员工信息表!');
LOOP
FETCH rc_emp INTO emp_row; --提取游标
EXIT WHEN rc_emp%NOTFOUND;
dbms_output.put_line(rc_emp%ROWCOUNT||' '||emp_row.empno||' '||emp_row.ename||' '||emp_row.sal);
END LOOP;
CLOSE rc_emp; --关闭游标
--对应多个查询语句
dbms_output.put_line('员工部门信息表!');
OPEN rc_emp FOR SELECT e.empno,e.ename,e.sal,d.dname
FROM emp e,dept d WHERE e.deptno = d.deptno;
LOOP
FETCH rc_emp INTO v_no,v_name,v_sal,v_dname;
EXIT WHEN rc_emp%NOTFOUND;
dbms_output.put_line(rc_emp%ROWCOUNT||' '||v_no||' '||v_name||' '||v_sal||' '||v_dname);
END LOOP;
END;
-----1显示游标一般用来循环获取结果集,能使fom游标就使用fom游标
2隐式游标一般用来判断dml语句是否成功执行
3 动态游标往往结合存储过程使用,如查询需要动态改变。