【发布时间】:2017-02-24 23:02:03
【问题描述】:
我正在使用 ojdbc7.jar 从 Java 连接到 oracle。对于具有别名的查询,当我执行 getColumnName() 和 getColumnLabel() 的 ResultSetMetaData 时,两者都返回别名。我想要原来的列名。
【问题讨论】:
-
我不知道 Java 或 OJDBC,但即便如此,我认为答案很明显:如果您的函数在查询的结果集上工作,那么您不能拥有原始列名。结果集不包含有关原始列名的信息(甚至不包含有关数据来自一个表还是两个表,或者某些列是否来自基表而其他列在查询本身中计算并在 SELECT 子句中给出名称的信息)。这是“计算的一般原则”,而不是严格意义上的 Java、Oracle 或 OJDBC。
-
@mathguy 这并不完全正确;
getColumnName()意味着返回原始列名(如果可用),而getColumnLabel()意味着返回别名(或者 - 如果没有别名 - 列名)。并且有可以返回两者的数据库系统。更有可能是 Oracle 决定让两者都返回别名,因为历史上 JDBC api & 规范并不清楚两者之间的区别,所以很多开发人员使用了错误的。 -
@MarkRotteveel - 这是否意味着这些工具会查看结果集以外的内容? ANY 数据库中的 ANY 工具如何仅从结果集中返回原始列名?您的意思是这些工具查看的是查询本身,而不是查询的结果?
-
@mathguy 如果您从表中选择一列,一些数据库系统将跟踪和传达原始名称和别名。这对于派生(计算)字段或使用联合的查询当然是不可能的。例如,Firebird(我维护它的 JDBC 驱动程序)就是这样做的,我相信 PostgreSQL 也这样做。
-
@MatthewPeak 对于派生字段,列名通常为空字符串,如果信息不存在则由 JDBC 指定。尽管某些数据库系统使用假的/生成的列名。
标签: oracle jdbc columnname aliasing