1

単一の任意のプロシージャを実行する sql*plus スクリプトを作成しようとしています。トリッキーな部分は、プロシージャが受け取るパラメーターの数に関係なく、プロシージャを実行できるようにしたいということです。

プロシージャの引数の正しい数を把握するために、次のことを行っています。

  SELECT COUNT(*) INTO v_in
  FROM all_arguments
  WHERE LOWER(owner) = LOWER(v_schema) 
    AND LOWER(package_name) = LOWER(v_package)
    AND LOWER(object_name) = LOWER(v_proc)
    AND in_out = 'IN';

execute-immediate 文字列を作成するときが来たら、何らかのループを使用してそれを実行したいと考えました。渡されるパラメータはすべて、&1 から &n までの番号が付けられています。

  FOR i IN 1..v_in
  LOOP
    v_block := v_block || '''' || &i || '''';
  IF i != v_in THEN
    v_block := v_block || ',';
  END IF;
  END LOOP;

ただし、これは機能しません。&i が表示され、もちろんそれが i という名前のパラメーターであると考えられます。スケジューリング アプリケーション (Appworx... うーん) が定義 i=something を実行していないため、これは惨めに失敗します。

これで間接化を行う方法はありますか?これにより、指定された手順に対してたまたま多くの人がたまたま反復できるようになりますか?

4

2 に答える 2

1

動的SQLを作成したいのですが、関与するパラメーターの数がわかりません。Asktom には、これに対する正式な回答があります。「新しい」メソッドを気にしないでください。パラメータがいくつあるかわからないので、うまくいきません。

基本的に、連結によって動的 SQL を作成しますが、パラメーターは に格納されるsys_contextため、クエリはバインドされます。これは、おまけとして SQL インジェクションなどに役立ちます。

于 2012-07-18T20:52:12.583 に答える