游标变量的限制
================================
当前,游标变量受到以下限制:
无法在程序包规范中声明游标变量。
CREATE PACKAGE emp_stuff AS
TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
emp_cv EmpCurTyp; -- not allowed
END emp_stuff;
无法将游标变量传递给通过数据库链接调用的过程。
如果将主机游标变量传递给PL / SQL,则除非在同一服务器调用中也将其打开,否则无法在服务器端从其获取。
不能使用比较运算符来测试游标变量的相等性,不相等性或空值。
无法将空值分配给游标变量。
数据库列不能存储游标变量的值。 在CREATE TABLE语句中没有要使用的等效类型。
无法将光标变量存储在关联数组,嵌套表或varray中。
游标和游标变量不可互操作。 也就是说,不能在期望使用另一项的地方使用。 例如,您不能在游标FOR循环中引用游标变量。
示例程序----从游标变量提取到集合中
==================================================
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
TYPE NameList IS TABLE OF emp.ename%TYPE;
TYPE SalList IS TABLE OF emp.sal%TYPE;
emp_cv EmpCurTyp;
names NameList;
sals SalList;
BEGIN
OPEN emp_cv FOR SELECT ename,sal FROM emp WHERE sal < 3000;
FETCH emp_cv BULK COLLECT INTO names, sals;
CLOSE emp_cv;
FOR i IN names.FIRST .. names.LAST
LOOP
dbms_output.put_line('Name = ' || names(i) || ', salary = ' ||
sals(i));
END LOOP;
END;
游标表达的限制
===========================
1.不能将游标表达式与隐式游标一起使用。
2.游标表达式只能出现:
在未嵌套在任何其他查询表达式中的SELECT语句中,但
当它是游标表达式本身的子查询时。
b。作为表函数的参数,在SELECT语句的FROM子句中。
3.游标表达式只能出现在查询规范的最外面的SELECT列表中。
4.游标表达式不能出现在视图声明中。
5.无法对游标表达式执行BIND和EXECUTE操作。
游标表达式的示例示例
=============================
DECLARE
TYPE emp_cur_typ IS REF CURSOR;
emp_cur emp_cur_typ;
dept_name dept.dname%TYPE;
emp_name emp.ename%TYPE;
CURSOR c1 IS SELECT
dname, CURSOR
(
SELECT e.ename FROM emp e
WHERE e.deptno = d.deptno
) employees
FROM dept d
WHERE dname like '%A%';
BEGIN
OPEN c1;
LOOP
--fetch the cursor into target variables.
FETCH c1 INTO dept_name, emp_cur;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line('Department: ' || dept_name);
LOOP
FETCH emp_cur INTO emp_name;
--exit when there is no more data in the cursor.
EXIT WHEN emp_cur%NOTFOUND;
dbms_output.put_line(' Employee: ' || emp_name);
END LOOP;
END LOOP;
CLOSE c1;
END;
From: https://bytes.com/topic/oracle/insights/653974-oracle-ref-cursor-3-a