2017-02-23 27 views
1

我正在使用Oracle 12cr1數據庫。看起來如果列名是小寫的,我無法使用列名從ResultSet獲取值。使用列名從ResultSet中獲取小寫字段

創建表create table "Tab" (col number, "col" varchar2(10)),所以第二列是小寫。如果我撥打getString("col"),我會得到第一列的價值。如果我撥打getString("\"col\""),我會得到列名無效錯誤。

但是,如果我使用列索引,它工作正常。

+0

那麼,你有兩個同名的列? – alayor

+2

我會說,當之無愧!定義列時使用雙引號,並收穫已播種的內容。更好:在同一個表中定義一個「col」列和另一個「col」列**,並且遭受難以言表的痛苦。我只是希望你們有目的地做到了這一點,充分了解它會受到多大的傷害!現在告訴世界,所以我們將從您的經驗中學習。 – mathguy

+1

顯然這是非常糟糕的做法。只需測試JDBC的另一個實現並將其與Oracle JDBC實現進行比較即可。 – user2018791

回答

0

ResultSet(重點煤礦)的JDBC API文檔:用作輸入以獲取方法

列名是不區分大小寫。當使用列名稱調用getter方法並且多個列具有相同的名稱時,將返回第一個匹配列的值。列名選項設計爲在生成結果集的SQL查詢中使用列名時使用。對於在查詢中未明確命名的列,最好使用列號。如果使用列名,程序員應該注意保證它們唯一地引用預期的列,這可以通過SQL AS子句來保證。

換句話說,對於API列名(或更準確地說,列標籤)不區分大小寫,所以你想要的是不可能的。您需要通過提供AS列標籤來使列標籤唯一,否則應該按索引獲取列。

0

因爲一個人不應該在SELECT在生產中使用SELECT *反正,重命名列將解決該問題:

SELECT 
    col AS col1 
, "col" AS col2 
FROM "Tab" 

現在你的兩列不同的別名,避免了歧義。

+0

是的,我知道這種方式我可以得到結果。我正在檢查一些邊緣情況,並發現如果我沒有在不用雙引號的情況下指定列別名,我就無法使用列名稱獲取值。 – user2018791