私がよく理解していれば、変数値をフィルタとして使用するように変更する動的SQLがあります。
クエリを編集できないと仮定すると、プレースホルダを変数値に置き換えて二重引用符を処理する方法です。例えば:あなたは、動的SQLを編集することができれば
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = <SOME_VAR>';
vVar := 'a';
--
vSQL := replace (vSQL, '<SOME_VAR>', '''' || vVar || '''');
execute immediate vSQL into vNum;
dbms_output.put_line('Result: ' || vNum);
end;
、より良い方法は、SQL部分に二重引用符を処理することができ代わりの変数置換部分でそれをやって。
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = ''<SOME_VAR>''';
vVar := 'a';
--
vSQL := replace (vSQL, '<SOME_VAR>', vVar);
execute immediate vSQL into vNum;
dbms_output.put_line('Result: ' || vNum);
end;
もう1つの方法(最良のIMHO)は、バインド変数を使用することで可能です。
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = :SOME_VAR';
vVar := 'a';
--
execute immediate vSQL into vNum using vVar;
dbms_output.put_line('Result: ' || vNum);
end;
これは、日付が必要な場合でもデータ型が文字列であることを前提としています。日付値がある場合は、最初の2つのメソッドは文字列との変換が必要であると考えていますが、キャストする必要はなく日付変数を持つバインド変数を簡単に使用できます。例えば:
declare
vSQL varchar2(100);
vVar date;
vNum number;
begin
vSQL := 'select count(*) from dual where trunc(sysdate) = :SOME_VAR';
vVar := trunc(sysdate);
--
execute immediate vSQL into vNum using vVar;
dbms_output.put_line('Result: ' || vNum);
end;
質問は明確ではありません。結果の文字列はどのようになるべきですか?また、動的SQLを使用しているようですが、なぜバインド変数を使用しないのでしょうか? – Aleksej
なぜDATE値にstringを使用していますか? –
@Aleksej:ありがとうたくさんの人..バインド変数が何であるか知りませんでした:)しかし動的SQLについてのあなたの考えは助けました.. – thealchemist