我正在使用Oracle 12cr1數據庫。看起來如果列名是小寫的,我無法使用列名從ResultSet
獲取值。使用列名從ResultSet中獲取小寫字段
創建表create table "Tab" (col number, "col" varchar2(10))
,所以第二列是小寫。如果我撥打getString("col")
,我會得到第一列的價值。如果我撥打getString("\"col\"")
,我會得到列名無效錯誤。
但是,如果我使用列索引,它工作正常。
我正在使用Oracle 12cr1數據庫。看起來如果列名是小寫的,我無法使用列名從ResultSet
獲取值。使用列名從ResultSet中獲取小寫字段
創建表create table "Tab" (col number, "col" varchar2(10))
,所以第二列是小寫。如果我撥打getString("col")
,我會得到第一列的價值。如果我撥打getString("\"col\"")
,我會得到列名無效錯誤。
但是,如果我使用列索引,它工作正常。
從ResultSet
(重點煤礦)的JDBC API文檔:用作輸入以獲取方法
列名是不區分大小寫。當使用列名稱調用getter方法並且多個列具有相同的名稱時,將返回第一個匹配列的值。列名選項設計爲在生成結果集的SQL查詢中使用列名時使用。對於在查詢中未明確命名的列,最好使用列號。如果使用列名,程序員應該注意保證它們唯一地引用預期的列,這可以通過SQL AS子句來保證。
換句話說,對於API列名(或更準確地說,列標籤)不區分大小寫,所以你想要的是不可能的。您需要通過提供AS
列標籤來使列標籤唯一,否則應該按索引獲取列。
因爲一個人不應該在SELECT
在生產中使用SELECT *
反正,重命名列將解決該問題:
SELECT
col AS col1
, "col" AS col2
FROM "Tab"
現在你的兩列不同的別名,避免了歧義。
是的,我知道這種方式我可以得到結果。我正在檢查一些邊緣情況,並發現如果我沒有在不用雙引號的情況下指定列別名,我就無法使用列名稱獲取值。 – user2018791
那麼,你有兩個同名的列? – alayor
我會說,當之無愧!定義列時使用雙引號,並收穫已播種的內容。更好:在同一個表中定義一個「col」列和另一個「col」列**,並且遭受難以言表的痛苦。我只是希望你們有目的地做到了這一點,充分了解它會受到多大的傷害!現在告訴世界,所以我們將從您的經驗中學習。 – mathguy
顯然這是非常糟糕的做法。只需測試JDBC的另一個實現並將其與Oracle JDBC實現進行比較即可。 – user2018791