3

動的SQLを使用してプロシージャを実行し、出力パラメータを取得しようとしています:

v_sql := 'BEGIN ' || p_procname || '(''' || p_input1 || ''', ''' || p_input2 || ''', v_output1); END;';
DBMS_OUTPUT.PUT_LINE(v_sql);
EXECUTE IMMEDIATE v_sql;

v_output1変数を宣言しましたが、次のエラー メッセージが表示されます。

PLS-00201: identifier 'V_ISSUE' must be declared 

上記のコードを dbms_output from に置き換えると、手順が機能するv_sqlため、手順側では問題ありません。問題は、動的に呼び出そうとする方法のどこかにあります。

私がやろうとしていることがこのように機能するかどうかはわかりません。このプロシージャー呼び出しから動的 SQL を介して出力パラメーターを取得する方法はありますか?

4

2 に答える 2

9

動的 SQL にパラメーターを渡すために文字列連結を使用しないでください。オラクルだけでなく、それはまったく悪い習慣と見なされています。

これは悪いことですが、動的 SQL 文字列内でローカル変数の名前を使用することが主な失敗の原因です。これは、この変数が導入されたコード ブロックの外側のどこにも表示されないためです。

コードは次のようになります。

declare 
  v_sql varchar2(4000);
  p_procname varchar2(100);
  p_input1 number;
  p_input2 number;
  v_output1 number;   
begin

  v_sql := 'begin ' || p_procname || '(:p_input1, :p_input2, :v_output); end;';

  execute immediate v_sql 
  using in p_input1, in p_input2, out v_output1;

end;
于 2013-04-23T21:00:29.510 に答える
4

ここで私の答えを見つけました。

v_sql := 'BEGIN ' || p_procname || '(:a, :b, :c); END;';

EXECUTE IMMEDIATE v_sql
USING IN p_input1, IN p_input2, OUT v_output1;
于 2013-04-23T20:54:28.117 に答える