Oracle 在游标FOR循环中使用游标属性

Oracle 在游标FOR循环中使用游标属性,oracle,loops,for-loop,plsql,cursor,Oracle,Loops,For Loop,Plsql,Cursor,我正在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

我正在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;

只是想了解:在使用游标FOR循环时,索引变量是否不是游标属性,如果是,为什么?有人能解释一下吗….

c_Emp
不是光标,它是一条记录,在选择状态中的每一列都有字段


c_Emp
与第二个示例中的
Emp_记录
类似。

即使使用FOR循环,也必须明确定义光标。 使用带有光标的FOR循环的示例如下所示:

declare
 cursor c1 is select a from table;
begin
 FOR b in c1
 loop
  <required logic>
 end loop;
end;
声明
光标c1是从表中选择的;
开始
对于c1中的b
环
端环;
结束;

要在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;

为什么不让我们知道您在什么系统和什么语言上做什么?我想您指的是Oracle DBMS上的SQL。正确吗?如果不清楚,请道歉,这是一个Oracle RDBMS,我正在Scott架构上执行此PL/SQL块。因此,如果使用游标For循环,是否有任何方法可以访问游标属性?在plsql中,您可以使用
SQL
-前缀访问隐式游标的属性,例如
SQL%ROWCOUNT
。但我不确定这是否会在FOR循环中起作用。只要使用一个select子句,我就可以在For循环中定义一个隐式游标,如果我显式定义游标,我认为它属于第二种情况。我在文档中搜索,了解到对于这样的隐式定义的游标,游标属性将为NULL,因此使用SQL%ROWCOUNT会给出NULL值。请尝试Baljeet的建议。它起作用了。将his替换为“dbms_output.put_line('记录计数为'| | c1%rowcount);”,然后查看发生了什么。