2013-07-04 45 views
0

全部,Oracle SELECT - 雙引號還是不帶雙引號?

爲Oracle 11i數據庫編寫SELECT查詢時,爲什麼Oracle中的某些表強制將引號應用於所選字段,而其他字段不是。

一個例子,我最近遇到:

在的Aqua Data Studio的在我試圖從兩個不同的表選擇同一領域的查詢分析器窗口:

select _id from table1 
    select _id from table2 

Table 1和Table不同很大,但是隻有table1執行這個select語句而沒有錯誤。當我嘗試執行該語句爲表2我得到以下幾點:

ORA-00904: "_ID": invalid identifier 
Script line 1, statement line 1, column 7 

然而,當我執行第二條語句這樣它完美的作品:

select "_id" from table2 

有誰知道是怎麼回事,爲什麼會出現這種情況,這些表格之間的主要區別是什麼?

謝謝

+1

請參閱我對另一個問題的回答:http://stackoverflow.com/a/6030439/146325 – APC

回答

3

對象關於大小寫的答案和鏈接是正確的,但是您的情況超出了簡單的案例問題,這是因爲您的列名以下劃線開頭,並且因爲您的客戶通常隱瞞了您的引用。

如果您試圖創建一個名爲_id的列而不引用它,那麼您會得到一個'ORA-00911:invalid character'錯誤,其原因文本顯示'標識符可能不會以任何除字母和數字之外的ASCII字符';這實際上也是錯誤的,因爲它不能以數字開始(例如,0_id給出'ORA-00904::無效標識符')。這是備份的database object naming rules

非引用標識符必須以數據庫字符集中的字母字符開頭。帶引號的標識符可以以任何 字符開頭。

因此,看起來Aqua Data Studio遵循一個約定,即用雙引號括起您提供的對象名稱的大寫版本,這是一種鏈接文章中提到的做法。

根據您所示,select _id from ...作爲select "_ID" from ...傳遞給Oracle,如果列名創建爲"_ID",那麼這很好。看來table1是這種情況,但table2被創建爲"_id" - 因此,這種情況不匹配會生成您所看到的合法ORA-00904。

您的客戶端沒有修改已經包含在雙引號中的列名,因此select "_id" from ...通過甲骨文原樣傳遞,併爲table2工程確定(但反過來說,將失敗table1)。

如果Oracle沒有遵循未加引號的標識符的規則,並且它被創建爲引用 - 除非原始引用的值無論如何都是有效的,即遵循未引用的規則並且是以大寫形式輸入。由於您的列名以下劃線開頭,因此就Oracle而言,無論大小寫如何,對它的所有引用都必須用雙引號引起來。如果你自己沒有引用它,你的客戶只是在後臺做這件事。

遵循其他人給出的建議以避免引用標識符,並始終使用有效的未加引號的名稱將避免這樣的問題。

3

問題來自創建對象。

如果使用小寫字母和引號創建對象,它將強制區分大小寫。

所以你需要使用引號和右邊框來使用它。

如果你創建一個沒有引號(或全部大寫),你不會面對任何「區分大小寫」的問題,並且能夠選擇具有大寫或小寫(不帶引號)