2017-02-19 21 views
1

私はクエリを持っています。日付の代わりに文字としてのSysdate

iは使用設定テーブルABから日付値を取得する手順を記述する場合、私は

col1 ||col2 
AB || sysdate-360 
BC || sysdate -2 

の行が「SYSDATE-360」としてマークされている設定テーブルABを有します。

v_date varchar(20); 
    cursor c1 as 
    select col2 from AB; 
    then 

    for ab_date in c1 
    loop 
    select ab_date.col2 into v_date from dual; 
v_sql := 'delete from any_table where load_date <='||v_date; 
execute immediate v_sql ; 
commit; 
    end loop; 

手順がコンパイルされているが、私は実行すると、私はエラー

ORA-01722の下に取得しています:無効な数 ORA-06512: "手順" で、ライン46 ORA-06512:行で1 01722. 00000 - "無効な番号" *原因:
処置:

SYSDATE -360は、SYSDATEは、日付の右自体であるため、charとしてではなく、日付として考えられていますか?

助けてください。

+0

恐らく 'load_date'は日付型です。あなたの難読化はカーソルクエリが正しく見えないので少し混乱させます - 本当に 'from config_table where col1 = AB'ですか?エラーの行46に対応する行を指定していません。あなたはそれをvarcharのように見せたので、どのデータ型が 'col1'ですか?それが文字列で、 'AB'が数字で、あなたが引用符で囲まず、' col1'の値が*ではない場合は?私は、エラーがカーソルクエリからだと思います。日付とは関係ありません。 –

+0

''即時実行 'に渡す 'v_sql'の値をデバッグするべきだと思います。これはおそらく、 'v_sql'のスペースがないなど、あなたの問題を明らかにするでしょう。 –

答えて

2

TO_DATE関数を試してみてくださいこのようにクエリされました:

select sysdate + (select SYSDATE_OFFSET from config where id = 'AB') s_360 
from dual; 

S_360   
----------------- 
25.02.16 21:46:50 

カーソルを開くことができます上記のクエリ。

テーブルを変更できない場合は、文字列sysdateを削除して数値に変換するビューを定義してください。

+0

私はこれをチェックさせてください私はconfigテーブルを変更することができます。 –

+0

ありがとうございました –

+0

私はもう別の問題があります。 私のv_sqlは今すぐ適切なクエリを提供していますが、これを実行すると即座にエラーが発生します。 00911. 00000 - "無効な文字" *原因:識別子は、 の文字と数字以外のASCII文字で始めることはできません。最初の 文字の後に$#_も使用できます。二重引用符で囲まれた識別子には、二重引用符以外の任意の文字の が含まれている場合があります。別の引用符 (q '#...#')は、スペース、タブ、またはキャリッジリターンを デリミタとして使用できません。 –

-1

することはあなたがすることができたとしてsysdateするオフセットの数値を持っているだけSYSDATE +/- Nを表現扱う場合、私は

ID SYSDATE_OFFSET 
-- -------------- 
AB   -360 
BC    -2 

を次のように設定テーブルを変更することをお勧めしたい

TO_DATE(v_date) 
+0

あなたは私の質問をよく読んでくれることを願っています。私はデータを読み込むカーソルを持っています。列には "sysdate-360"が含まれています。日付の代わりにcharとして読み込まれます –

+0

col2はどのような型ですか?私は最初にあなたの手続きを見ていませんでした。それをコードとしてフォーマットしますか? – ndueck

+0

col2はvarcharです、私はそれをフォーマットします。 –

2

これは私にとって非常にうまく見えます。しかし、なぜあなたはv_dateに入るのですか?あなたが直接連結することができますカーソルから文字列を取得:

for ab_date in c1 loop 
    v_sql := 'delete from any_table where load_date <=' || ab_date.col2; 
    execute immediate v_sql ; 
    commit; 
end loop; 

で最後にこれは単に'delete from any_table where load_date <= sysdate-360'を作る二つの文字列'delete from any_table where load_date <=''sysdate-360'のconcatanationです - あなたが望む正確にSQL文字列。

(それは、このようなdate_expression代わりのcol2として適切な列名を使用してさらに良くなります。)

もっと精巧な説明:カーソルがあなたの文字列「SYSDATE-360」を取得します。クエリselect ab_date.col2 into v_date from dual;は、単にv_date := ab_date.col2;です。しかし、v_dateは文字列ですか?そうでなければ、 'sysdate-360'は単​​なる文字列なので、変換エラーが発生します。 DBMSが文字列に現時点のシステム変数の名前である 'sysdate'が含まれていることを確認してから、これを魔法のように変換すると予想される場合は、かなり期待しています。

+0

はい私の 'sysdate-360'は文字列と見なされ、v_dateは定義された日付です。文字列ではなくシステムとしてssydateを参照するdbmsを作成する方法 –

+0

SQL *文字列を構築するために*何かをする必要があります。私のスクリプトはあなたのために働かないのですか? –

関連する問題