Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
只返回ResultSet的列名,而不实际执行查询(Oracle和Java)_Java_Oracle - Fatal编程技术网

只返回ResultSet的列名,而不实际执行查询(Oracle和Java)

只返回ResultSet的列名,而不实际执行查询(Oracle和Java),java,oracle,Java,Oracle,我想知道是否有一种方法可以返回结果集Oracle数据库的列名,如果我实际执行一个查询,就会生成Java。例如,假设SQL看起来像这样: select * from <complex table join>; 有没有一种方法可以将此查询发送到oracle,让它告诉我结果集中的列名,而不实际执行查询,因为它很昂贵?我认为使用PreparedStatement可以工作: PreparedStatement stmt = connection.prepareStatement("selec

我想知道是否有一种方法可以返回结果集Oracle数据库的列名,如果我实际执行一个查询,就会生成Java。例如,假设SQL看起来像这样:

select * from <complex table join>;

有没有一种方法可以将此查询发送到oracle,让它告诉我结果集中的列名,而不实际执行查询,因为它很昂贵?

我认为使用PreparedStatement可以工作:

PreparedStatement stmt = connection.prepareStatement("select ...");
ResultSetMetaData meta = stmt.getMetaData();
for (int col=0; col < meta.getColumnCount(); col++) 
{
   System.out.println("Column: " + meta.getColumnName(col + 1));
}
编辑:我在Oracle11.2和驱动程序版本11.2.0.3上试过这个方法,效果很好

如果失败,您可以简单地将where 1=0附加到查询中,然后执行它。至少它不会返回所有的行,然后也可能使用Statement.setMaxRows返回,这只是为了确定


最后一个相当复杂的选项是使用dbms_sql打开、准备和描述语句。有关详细信息,请参阅手册:

您可以尝试将查询包装在外部select中,并在其中添加1=0,以防止它获取任何行:

  SELECT * from (
    <your query here>
  )
  WHERE 1=0
可能是你的意思。。然而,它仍然是一个查询…只是您不是在查询应用程序表,而是在查询特殊表


与请求元数据的答案相同

棘手的问题,是否修改了复杂的表join@mpettis:我已经更新了我的答案。。。你找到解决办法了吗?@codeMaker:谢谢你的回答。。。我已经在下面对你的答案发表了评论。简而言之,我没有让“getMetaData”工作,我也不确定我的DB驱动程序是否能与该调用一起工作……Oracle没有名为SYSOBJECTS的视图,而且它也不会返回联接的列。谢谢Vikram。但是,带有\u no\u名称的\u horse\u是正确的-这仅在我希望从实际表中获取列名时有效,但我希望从常规查询的结果集获取列名,其中结果集列名可能是动态生成的,也可能来自多个表。谢谢你的回复!yw@mpettis!现在明白了:-谢谢!我得到了错误:java.sql.SQLException:语句句柄未执行:getMetaData。通过谷歌搜索,我发现:。我正在使用的驱动程序是ojdbc5.jar',我认为getMetaData调用不受此支持。@mpettis:然后尝试一个新的驱动程序。正如我所说,对于驱动程序版本11.2.0.3,它对我来说很有效。文件名中的5不表示驱动程序的版本。这是Java版本的驱动程序,你真的还在使用Java5吗?。您可以通过查看.jar中的清单文件来找到驱动程序的版本。谢谢!我将使用Java6获得一个新的驱动程序,但这是我公司分发的标准jdbc驱动程序,因此我将游说安装一个更新的驱动程序ojdbc6.jar。我不相信一个新的驱动程序能做到这一点,因为在谷歌搜索时,我发现这个功能对其他使用ojdbc5.jar的人来说很好,所以我认为它会对我起作用,除非我有其他不知道的问题。这个解决方案正是我试图让它发挥作用的方案,因为它看起来在编程上最稳定,而且不依赖于技巧。但就目前情况而言,它不起作用。再说一次:5或6并不表示驱动程序版本!jar很可能是与ojdbc5.jar相同的驱动程序版本。这是可行的,我只在小而便宜的查询上测试过。由于不熟悉Oracle的查询分析器,我只想确认由于“where 1=0”部分,该部分没有实际执行和丢弃。那么,是否真的不会检索结果并在外部“where”语句中丢弃它们呢?我之所以采用这种解决方案,是因为它似乎独立于底层jdbc驱动程序工作。谢谢弗兰克和所有回答的人!
    SELECT
      COLUMN_NAME
   FROM
      ALL_TAB_COLUMNS
   WHERE
      TABLE_NAME ='tableName';