2017-02-19 71 views
1

我有一個查詢。作爲字符而不是日期的系統日期

我有一個配置表AB其中行被標記爲「SYSDATE-360」

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

當我寫一個程序以從配置表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:在line 1 01722. 00000 - 「無效號碼」 *原因:
*操作:

的SYSDATE -360被認爲是焦炭,但沒有時間SYSDATE本身就是一個日期嗎?

請幫忙。

+0

推測'load_date'是日期類型。由於你的光標查詢看起來不正確,你的模糊處理有點讓人困惑 - 它真的來自config_table,其中col1 = AB'?並且您沒有指出哪條線對應於錯誤中的第46行。什麼數據類型是'col1',就像你讓它看起來像一個varchar?如果它是一個字符串,「AB」是一個數字,而且你沒有用引號括起來,並且有'col1'值是*不是*數字?我認爲錯誤來自遊標查詢,與日期無關...... –

+0

我認爲你應該調試'v_sql'中的值,並將其傳遞給'immediate immediate'。這可能會揭示你的問題,比如'v_sql'中缺少空格。 –

回答

2

如果只處理表達式SYSDATE +/- N我建議修改的配置表如下

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

所以,你有一個數字偏移SYSDATE它可以是這樣查詢:

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

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

所以你可能會打開一個光標wi上面的查詢。

如果您不能更改表 - 定義一個視圖,刪除字符串sysdate並轉換爲數字!

+0

讓我檢查一下我可以更改配置表。 –

+0

感謝這工作 –

+0

我現在有另一個問題。 我的v_sql現在給出了正確的查詢,但是當我在立即執行時運行它時,它給了我下面的錯誤。 00911. 00000 - 「無效字符」 *原因:標識符可能不以 字母和數字以外的任何ASCII字符開頭。 $#_也是在第一個 之後的字符。由雙引號括起來的標識符可能包含 除雙引號以外的任何字符。替代引號 (q'#...#')不能使用空格,製表符或回車作爲 分隔符。 –

-1

嘗試to_date函數

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

yes我的'sysdate-360「被認爲是字符串,v_date是日期定義的。如何讓dbms看到系統定義的ssydate而不是字符串 –

+0

當你使用它來構建SQL *字符串*時,不需要做任何事情,我的腳本不適合你嗎? –