Oracle REF CURSOR-3

本文详细阐述了Oracle数据库中游标变量和游标表达式的使用限制,包括无法在程序包规范中声明游标变量,无法将游标变量传递给通过数据库链接调用的过程,以及无法使用比较运算符测试游标变量的相等性等。同时,文章提供了如何从游标变量提取数据到集合中的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标变量的限制

================================

当前,游标变量受到以下限制:

无法在程序包规范中声明游标变量。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值