Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用列名从ResultSet获取小写列_Java_Oracle_Jdbc - Fatal编程技术网

Java 使用列名从ResultSet获取小写列

Java 使用列名从ResultSet获取小写列,java,oracle,jdbc,Java,Oracle,Jdbc,我正在使用Oracle 12cr1数据库。如果列名为小写,则我似乎无法使用列名从ResultSet获取值 创建表创建表“Tab”(列编号,“col”varchar2(10)),因此第二列为小写。如果我调用getString(“col”)我将得到第一列的值。如果我调用getString(“\”col\”)我将得到无效的列名错误 但是,如果我使用列索引,它可以正常工作。因为无论如何都不应该在生产中使用SELECT*,在SELECT中重命名列将解决问题: SELECT col AS col1

我正在使用Oracle 12cr1数据库。如果列名为小写,则我似乎无法使用列名从
ResultSet
获取值

创建表
创建表“Tab”(列编号,“col”varchar2(10))
,因此第二列为小写。如果我调用
getString(“col”)
我将得到第一列的值。如果我调用
getString(“\”col\”)
我将得到无效的列名错误


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

因为无论如何都不应该在生产中使用
SELECT*
,在
SELECT
中重命名列将解决问题:

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

现在,您的两列有不同的别名,避免了歧义。

来自(emphasis mine)的JDBC API文档:

用作getter方法输入的列名不区分大小写。当使用列名调用一个getter方法,并且多个列具有相同的名称时,将返回第一个匹配列的值。列名选项设计用于在生成结果集的SQL查询中使用列名时使用。对于查询中未显式命名的列,最好使用列编号。如果使用列名,程序员应该注意确保它们唯一地引用了预期的列,这可以通过SQL AS子句得到保证


换句话说,对于API来说,列名(或者更准确地说,列标签)是不区分大小写的,因此不可能实现您想要的。您需要通过提供一个
AS
列标签使列标签唯一,或者您应该通过索引获取列。

那么,您有两个同名的列?我想说,这是当之无愧的!定义列时使用双引号,并收获播种的内容。更好的方法是:在同一个表中定义一列
col
和另一列
“col”
,并遭受无法形容的痛苦。我只是希望你是故意这么做的,因为你很清楚这会有多痛!现在告诉全世界,我们将从你的经验中吸取教训。显然,这是非常糟糕的做法。只是测试JDBC的另一个实现,并将其与Oracle JDBC实现进行比较。是的,我知道这样可以得到结果。我正在检查一些边缘情况,发现如果不指定列别名而不双引号,则无法使用列名获取值。我假设
update
方法也是如此,尽管文档中没有明确提到它。@Roland Yes,
updateXXX
方法的列名遵循与
getXXX
方法相同的规则。