2012-05-02 43 views
5

我有一個Oracle表和一列(col1)的類型爲varchar2(12 byte)。它有一個排和col1價值1234我可以在Oracle中爲varchar2傳遞一個數字嗎?

當我說

select * from table where col1 = 1234 

甲骨文表示無效號碼。這是爲什麼?爲什麼我不能通過一個數字,當它是varchar2

編輯:所有的反應都很好。謝謝。但是我不明白爲什麼1234是一個有效的varchar2數據類型時不需要1234

回答

5

問題是,您希望Oracle將1234隱式轉換爲字符類型。相反,Oracle隱式地將該列轉換爲數字。列中有一個非數字值,所以Oracle會引發錯誤。 Oracle documentation在解釋如何解決問題之前會對隱式轉換髮出警告。解釋您所看到的行爲的規則是:

將字符值與數字值進行比較時,Oracle會將字符數據轉換爲數字值。

+0

謝謝。所以這個角色是1234,這個oracle會隱式地轉換成一個數字。 SO爲什麼自1234年以來的錯誤是一個有效的數字? – Victor

+0

表中的東西不是數字。 Oracle將1234作爲一個數字。它試圖將列中的值轉換爲匹配。當它找到一個不是數字的值時,它會拋出錯誤。 – JAQFrost

4

哦,這是更好的轉換爲char而不是數字:

select * 
from table 
where col1 = to_char(1234) 

當COL1看起來並不像一個數字,TO_NUMBER返回一個錯誤,停止查詢。

3

Oracle說無效號碼。這是爲什麼?爲什麼我在varchar2時無法傳遞數字?

由於您將其作爲數字進行比較,因此Oracle會將字符類型col1隱式轉換爲數字。

此外,您認爲1234只有行正在提取。實際上,Oracle必須從表中提取所有行,然後根據where子句進行過濾。現在在col1中有一個字符值,它在遇到您的1234行&之前就會被提取,因爲該字符無法轉換爲數字。

This fiddle顯示該行爲。由於abc canot被轉換爲數字,你會得到錯誤信息


現在,如果只記錄表中是包含數字字符COL1,你會看到statement will work fine

+0

謝謝。非常好的解釋 – Victor

相關問題