2011-11-08 10 views
1

次のFORループの後にc_emp%notfoundを実行することはできますか?それとも最初にカーソルを開く必要がありますか?暗黙カーソルに%FOUNDまたは%NOTFOUNDカーソル属性を使用できるようにするには、カーソルをオープンする必要がありますか?

declare 
cursor c_emp is select * from employee; 
begin 
    for c_rec in c_emp 
    loop 
     dbms_output.put_line(r_emp.first_Name); 
    end loop; 
end; 
/

私は、ステートメントにFORループの後に、単一のUPDATEステートメントを実行したいが、FORループはカーソル上の行のいずれかを処理しなかった場合にのみ。私はフラグを設定することができますが、よりクリーンな方法があることを知っていますか?

答えて

4

"それは FORループを実行した後c_empの%のNOTFOUNDを実行することが可能である" いいえ、それはORA-01001: invalid cursorを投げるために起こっています。カーソル属性は、カーソルが開いている間にスコープを持ちます。この構文では、FOREND LOOPの間にあります。

これはPL/SQLの面倒な側面ですが、あなたは数に悩まされています。

+0

ありがとうございます@APC。私はカウントオプションに固執していると思います:) – ziggy

2

理由だけではない:

declare 
cursor c_emp is select * from employee; 

begin 

    for c_rec in c_emp 
    loop 
     dbms_output.put_line(r_emp.first_Name); 
    end loop; 

    UPDATE some_table 
     SET some_values 
    WHERE some_conditions 
     AND EXISTS (SELECT * FROM employee WHERE r.id IS NOT NULL) 
end; 
/

私はあなたの従業員テーブルにはIDと呼ばれる主キーが必要に応じて、あなたが調整することができ、ここで想定しています。

関連する問題