単一の任意のプロシージャを実行する 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 を実行していないため、これは惨めに失敗します。
これで間接化を行う方法はありますか?これにより、指定された手順に対してたまたま多くの人がたまたま反復できるようになりますか?