ad-hoc sql 的列名
Posted
技术标签:
【中文标题】ad-hoc sql 的列名【英文标题】:column names for an ad-hoc sql 【发布时间】:2012-02-09 07:40:32 【问题描述】:我的程序将获得一个有效 sql 的输入,并且应该返回该 sql 的列名。 我想在不执行 sql 语句的情况下做到这一点。我正在寻找 java 解决方案。
我的 dbms 针对 olap 进行了 oracle 优化,并且表太大以至于结果集限制不起作用。实际上执行时间对于我的情况是不可接受的。需要一分钟以上的时间
【问题讨论】:
可能重复:***.com/questions/660609/sql-parser-library-for-java,您正在寻找一个 sql 解析器,它可以为您提供查询中的列名 解析是一种选择,但我主要关心的不是有限的解析。 我不想执行sql,你必须解析代表查询的字符串。您需要将此字符串解释为 sql 查询,这是通过对其应用语法来完成的 --> 解析。 你说我除了解析之外别无选择? dbms 如何创建执行计划?这也许是一个解决方案? dbms当然有自己的sql语法解析器。我假设“不执行”是指:我根本不想与数据库交互。根据您的数据库,您可以设置 avoid execution 参数,执行查询并获得一个空的结果集。或者使用某种 limit 1 功能。但这完全取决于数据库。 【参考方案1】:准备查询,而不是执行它,只需在准备好的语句上调用getMetaData。如果您的驱动程序支持它,这应该返回带有列描述的结果集元数据而不执行查询。
【讨论】:
你能不能给出示例代码,因为 afaik 它不能那样工作。ResultSetMetaData rsmd = conn.prepareStatement(sql).getMetaData();
然后rsmd.getColumnCount()
、rsmd.getColumnName(1)
、rsmd.getColumnTypeName(1)
等
我错过了您对驱动程序支持的评论。我认为 ojdbc14.jar 中的驱动程序不支持。因为我得到了以下异常... java.sql.SQLException: 语句句柄未执行:在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError .java:146) 在 oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:135) 在 oracle.jdbc.driver.OraclePreparedStatement.getMetaData(OraclePreparedStatement.java:4049)
哦,真令人沮丧。在这种情况下,您可能会被困在查询周围包裹SELECT * FROM (....) x WHERE rownum < 1
,这应该优化实际执行,但在执行时仍会产生结果集元数据。以上是关于ad-hoc sql 的列名的主要内容,如果未能解决你的问题,请参考以下文章