【问题标题】:getColumnName() return aliasname OraclegetColumnName() 返回别名 Oracle
【发布时间】: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


【解决方案1】:

这是不可能的。如果您编写的查询将列(或函数)别名为其他名称,则当结果集传递到下一级(另一个查询,如视图或 JDBC/ODBC 调用)时,系统具有的元数据关于该查询的只是别名。

找到原始名称的唯一方法是将正在使用的 SQL 追溯到其起源(例如,如果它正在调用视图,则查找视图定义等)。

考虑一个将列别名为其他东西的视图(本质上是您正在做的事情,因为视图只是按需执行的存储 SQL)。该列的视图定义将只有别名(它实际上以这种方式存储在 dba_tab_columns 中),而不是原始名称。除非查看视图定义,否则您无法知道原始名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多