2017-04-04 4 views
0

私はPL-SQLプロシージャスクリプトでこのラインを使用しています:は、実行時に日付変数の前後に引用符を追加 - SQL/PL-SQLは

l_query := REPLACE(l_query,'<REF_D>', REF_D) 

これは、その結果:

select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = 15.06.17 

が、 REF_Dが逆コンマ( '')でないため、SQLは実行されません

日付変数を引用符で囲むにはどうしたらいいですか?

P.S.

+4

質問は明確ではありません。結果の文字列はどのようになるべきですか?また、動的SQLを使用しているようですが、なぜバインド変数を使用しないのでしょうか? – Aleksej

+0

なぜDATE値にstringを使用していますか? –

+0

@Aleksej:ありがとうたくさんの人..バインド変数が何であるか知りませんでした:)しかし動的SQLについてのあなたの考えは助けました.. – thealchemist

答えて

1

私がよく理解していれば、変数値をフィルタとして使用するように変更する動的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; 
0

これを行うための正しい方法は..です

識別子QUOTENAMEは、任意のヘルプははるかに高く評価されて...いつものように

を宣言する必要があります。私はQUOTENAMEを試してみましたが、私はというエラーを取得しますパラメータを使用する。

ただし、文字列に値を代入してこれを行う場合は、単一引用符で文字列を定義します。 SQLでは、あなたは、単一引用符倍増することにより、これを実行します(私は文字列だと思うと)私はあなたに変換するTO_DATE関数を使用します

l_query := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = ''<REF_D>'''; 
0

は、現在までに、パラメータをref_d

declare 
l_query varchar2(1024) := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = <REF_D>'; 
ref_d varchar2(100) := '09.12.16'; 
begin 
l_query := replace(l_query,'<REF_D>','to_date('''||ref_d||''',''dd.mm.yy'')'); 
dbms_output.put_line(l_query); 
end; 

出力:

select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = to_date('09.12.16','dd.mm.yy') 
+0

私はこれを試しました..それはref_d = to_date('09 .12.16 ' 'dd.mm.yy')を全体のto_date('09 .12.16 '、' dd.mm.yy ')を文字列として使用します。 – thealchemist

+0

@Aleksejの答えでは、動的なSQLは、日付変数のそれぞれの新しい値のそれぞれの新しい値は、SQLを再コンパイルする原因となります(コンパイルは安い操作ではない、おそらく、それは時間がかかるでしょう) SQLの実行そのもの。 – Seyran

関連する問題