在 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 的建议。有用。将他的 替换为“dbms_output.put_line ('记录数为 ' || c1%rowcount);”看看会发生什么。【参考方案3】:

要在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 中使用游标属性的主要内容,如果未能解决你的问题,请参考以下文章

oracle for loop循环以及游标循环

如何实现Oracle数据库中的动态游标

sqlserver中怎样使用游标for循环

Oracle 学习----游标(使用无参光标cursor)

oracle数据库的存储过程中可以用到隐形游标。但是我不太明白为啥可以用 for in loop来完成对数据的处理。

如何在 PL/SQL 中使用 BULK COLLECT 和 FORALL 替换 CURSOR FOR LOOP?