コードが再利用され続ける共用体を含む大量の SQL ステートメントがあります。「USING」のために変数を複数回繰り返さずに、単一のバインド変数を再利用する方法があるかどうかを知りたいと思っていました。
以下のコードは、「USING」行を「USING VAR1,VAR2,VAR1;」に変更するまで、「not all variables bound」を返します。
両方のインスタンスで :1 を参照しているので、それを避けたいと思っていました-何かアイデアはありますか?
declare
var1 number :=1;
var2 number :=2;
begin
execute immediate '
select * from user_objects
where
rownum = :1
OR rownum = :2
OR rownum = :1 '
using var1,var2;
end;
/
編集: 追加情報については、where 条件のバンドルも生成するため、動的 SQL を使用しています。
私はSQL配列が苦手です(コードでカーソルを使用していますが、問題が複雑になりすぎると思います)が、疑似コードは次のとおりです。
v_where varchar2(100) :='';
FOR i in ('CAT','HAT','MAT') LOOP
v_where := v_where || ' OR OBJECT_NAME LIKE ''%' || i.string ||'%''
END;
v_where := ltrim(v_where, ' OR');
そして、上記の SQL を次のように変更します。
execute immediate '
select * from user_objects
where
rownum = :1
OR rownum = :2
OR rownum = :1 AND ('||V_WHERE||')'
using var1,var2;