在 CURSOR FOR LOOP 中使用游标属性
Posted
技术标签:
【中文标题】在 CURSOR FOR LOOP 中使用游标属性【英文标题】:using cursor attributes in a CURSOR FOR LOOP 【发布时间】:2013-08-28 07:47:19 【问题描述】:我在 Scott 架构中运行以下命令:
SET serveroutput ON;
BEGIN
FOR c_Emp IN (SELECT * FROM emp)
LOOP
dbms_output.put_line('The record processed by the cursor ' || c_Emp%rowcount);
END LOOP;
end;
这给出了错误:
游标属性可能不适用于非游标“C_EMP”
但是,如果这是使用显式游标完成的,它可以正常工作:
设置服务器输出;
DECLARE
emp_record emp%ROWTYPE;
count_variable NUMBER;
CURSOR c IS
SELECT * FROM emp;
BEGIN
OPEN c;
loop
fetch c INTO emp_record;
exit WHEN c%notfound;
dbms_output.put_line ('The record count is ' || c%rowcount);
END loop;
close c;
end;
只是想了解:在使用CURSOR FOR LOOP时,索引变量是否不是游标属性,如果是为什么?有人可以解释一下吗....
【问题讨论】:
为什么不让我们知道您在什么系统和什么语言上做什么? 我 guess 您指的是 Oracle DBMS 上的 SQL。对吗? 抱歉,如果不清楚,它是一个 Oracle RDBMS,我正在 Scott 模式上执行这个 PL/SQL 块。 【参考方案1】:c_Emp
不是游标,它是 SELECT 语句中每一列的字段记录
c_Emp
类似于第二个示例中的 emp_record
。
【讨论】:
那么如果使用 Cursor For 循环,有什么方法可以访问光标属性? 在 plsql 中,您可以使用SQL
- 前缀访问隐式 CURSOR 的属性,例如SQL%ROWCOUNT
。但我不确定这是否会在 FOR 循环中起作用。 see docs【参考方案2】:
即使在使用 FOR 循环时,也必须显式定义游标。 带有光标的 FOR 循环的示例使用如下所示:
declare
cursor c1 is select a from table;
begin
FOR b in c1
loop
<required logic>
end loop;
end;
【讨论】:
只使用一个选择子句,我可以在 For 循环中定义一个隐式游标,如果我明确定义游标,我认为它属于第二种情况。我在文档中搜索,了解到对于像这样隐式定义的游标,游标属性将为 NULL,因此使用 SQL%ROWCOUNT 会给出 NULL 值。 试试 Baljeet 的建议。有用。将他的要在for循环中获取索引,可以在隐式游标的select子句中添加rownum伪列。
SET serveroutput ON;
BEGIN
FOR c_Emp IN (SELECT e.*, rownum FROM emp e)
LOOP
dbms_output.put_line('The record processed by the cursor ' || c_Emp.rownum);
END LOOP;
end;
【讨论】:
以上是关于在 CURSOR FOR LOOP 中使用游标属性的主要内容,如果未能解决你的问题,请参考以下文章