2017-06-28 7 views
-1

SQL文が複数のレコードを返す可能性があるため、即時実行の代わりにオープンカーソルを使用しようとしています。「即時実行」として「オープンカーソル」を使用

open cur1 for rule_sql; 
    loop   
    dbms_output.put_line(cur1.rule_id); 
    end loop; 
close cur1; 

それはというエラーがスローされます: "PLS-00487:変数への無効な参照 'CUR1'"

は誰もが同じような問題がありましたか?任意のヘルプは非常に高く評価されています:)

答えて

2

カーソルは、結果セットへの単なるポインタです。その内容を参照するには、fetchが必要です。変数は、クエリの投影に一致するレコードタイプでなければならないことに注意してください。動的SQLを使用して流体の列セットを実装している場合、これは難しい場合があります。とにかく

、このような何か:

declare 
    cur1 sys_refcursor; 
    Type cur_rec is record (
     rule_id number, 
     rule_desc varchar2(32)); 

    row1 cur_rec; 
    .... 
Begin 
    ... 
    open cur1 for stmt; 
    for row1 in cur1 loop 
      Dbms_output.put_line(row1.rule_id); 
    End loop; 
    .... 
End; 

「私は結果のカラムの種類がわからない場合、私はカーソル値をキャプチャするために、変数を作成することはできません」

コンパイル時にクエリの予測がわからない場合、人生はより複雑になります。ネイティブ動的SQLを使用することはできません。完全なDBMS_SQLを実行する必要があります。

11gでは、いわゆるメソッド4動的SQLが導入されました。これにより、より多くのコードを犠牲にして、さまざまな予測を処理することができます。 Adrian Billington氏は、彼のOracle-developer.netサイトで優れた紹介を書いています。 Check it out

+0

こんにちは@APC参照してください。私は、結果の列の種類がわからない場合、私は、変数を作成することはできません...おかげでたくさんの時間を取るためにカーソルの値をキャプチャする..それは? – thealchemist

+0

人生はますます難しくなります。どのOracleのバージョンを使用していますか? – APC

+0

私はバージョン4.1.5を使用しています:) – thealchemist

1

あなたはfetch文を見逃している - Example 7.4 in docs

open cur1 for rule_sql; 
loop   
    fetch cur1 into my_row_variable; 
    exit when cur1%notfound; 
    dbms_output.put_line(cur1.rule_id); 
end loop; 
close cur1; 
+0

こんにちは@tony:名前が 'rule_id'である列があるかどうかわからない場合は、カーソル出力全体を表示したいと思いますか?私はput_line(cur1)を試しましたが、それは動作しません。 – thealchemist

+0

その場合は、[DBMS_SQLパッケージ](http://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS058)を使用する必要があります。解決策はさらに複雑です。そのドキュメントにはさまざまな例があります。 –

関連する問題