2

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を使用しているときに、インデックス変数がカーソル属性ではないかどうか、もしそうならなぜですか?誰かがこれを説明してくれませんか....

4

3 に答える 3

1

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;
于 2016-09-13T07:31:43.887 に答える
1

c_Empはカーソルではなく、SELECT ステートメントの各列のフィールドを持つレコードです

c_Empemp_record2番目の例 に似ています。

于 2013-08-28T08:57:00.783 に答える
1

FOR ループを使用している場合でも、カーソルを明示的に定義する必要があります。カーソルを使用した FOR ループの使用例は次のようになります。

declare
 cursor c1 is select a from table;
begin
 FOR b in c1
 loop
  <required logic>
 end loop;
end;
于 2013-08-28T11:24:06.507 に答える