1

Oracle pl/sql ステートメントで動的コードを実行したいと考えています。

うまく機能するのは次のとおりです。

execute immediate 'begin :r := 3*7*(:aa); end;'  using in out myresvar,100;

今、私はそれをより一般化したいと思います:

DECLARE

  -- arbitrary formula to evaluate
  formula VARCHAR2(100) := 'c+si/2.+mn/6.';

  -- string variable to keep pl/sql-code
  dynCall VARCHAR2(2046);

  -- variables to put into formula evaluation
  c   NUMBER := 0.02;
  si  NUMBER := 0.35;
  mn  NUMBER := 1.5;
  res NUMBER;
BEGIN

  dynCall := dynCall || 'DECLARE'       || chr(10);
  dynCall := dynCall || '  c   NUMBER;' || chr(10);
  dynCall := dynCall || '  si  NUMBER;' || chr(10);
  dynCall := dynCall || '  mn  NUMBER;' || chr(10);
  dynCall := dynCall || '  res NUMBER;' || chr(10);
  dynCall := dynCall || 'BEGIN'         || chr(10);

  dynCall := dynCall || '  c   := (:aa);' || chr(10);
  dynCall := dynCall || '  si  := (:bb);' || chr(10);
  dynCall := dynCall || '  mn  := (:cc);' || chr(10);

  dynCall := dynCall || '  :r := ' || formula || ';' || chr(10);

  dynCall := dynCall || 'END;'                    || chr(10);

  EXECUTE IMMEDIATE dynCall USING IN OUT c,si,mn,res;

END;

残念ながら、これにより次のようなエラーが発生します (ドイツ語):

... トランザクションのエラー: ORA-06536: IN-Bind-Variable an OUT-Position gebunden ...

つまり、即時実行ステートメントの in 変数と output 変数に混乱があるようです。

今、私は何が問題なのか混乱しています。

誰でも私を助けることができますか?

4

2 に答える 2

1

OK、自分で解決策を見つけました:

次のように実行行を修正するだけです。

EXECUTE IMMEDIATE dynCall USING c,si,mn,OUT res;

Web ドキュメントにはそのような例がありません (何も見つかりませんでした)。

于 2013-08-14T16:15:49.710 に答える