首页 > 解决方案 > QueryRunner 返回“ORA-00972:标识符太长”,将值作为参数传递

问题描述

我不明白为什么在以下代码中使用绑定变量会失败,但硬编码它可以工作。
如果我只放置一个rownum < 2子句而不是 id 子句,它也可以工作。

无:在代码的其他部分使用绑定变量就可以了。

数据库信息:

Oracle 12c
ID 列是 VARCHAR2(34)。

作品:

    org.apache.commons.dbutils.QueryRunner remote = ...;
    String searchId = "13056899429626141414864120X"
    String sql = toString("SELECT * FROM ", remoteOwner, ".table_name WHERE id = '"+searchId+"'");
    result = remote.query(sql, new MapListHandler());

失败:

    org.apache.commons.dbutils.QueryRunner remote = ...;
    String searchId = "13056899429626141414864120X"
    String sql = toString("SELECT * FROM ", remoteOwner, ".table_name WHERE id = ?");
    result = remote.query(sql, new MapListHandler(), searchId);

例外:

Exception in thread "main" java.sql.SQLException: ORA-00972: identifier is too long
 Query: SELECT * FROM SCHEMA_NAME.table_name WHERE id = ? Parameters: [13056899429626141414864120X]
    at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:527)
    at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:391)
    at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:329)

根异常(吞咽):

java.sql.SQLSyntaxErrorException: ORA-00972: identifier is too long

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:392)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:385)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1018)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4C8Odscrarr.doODNY(T4C8Odscrarr.java:96)
    at oracle.jdbc.driver.T4CPreparedStatement.doDescribe(T4CPreparedStatement.java:717)
    at oracle.jdbc.driver.OracleStatement.describe(OracleStatement.java:4404)
    at oracle.jdbc.driver.OracleResultSetMetaData.<init>(OracleResultSetMetaData.java:52)
    at oracle.jdbc.driver.OracleStatement.getResultSetMetaData(OracleStatement.java:4387)
    at oracle.jdbc.driver.OraclePreparedStatement.getMetaData(OraclePreparedStatement.java:5581)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.getMetaData(OraclePreparedStatementWrapper.java:1509)
    at oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleParameterMetaData.java:70)
    at oracle.jdbc.driver.OraclePreparedStatement.getParameterMetaData(OraclePreparedStatement.java:12861)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.getParameterMetaData(OraclePreparedStatementWrapper.java:1551)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:221)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:221)
    at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:341)
    at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:386)
    at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:329)

进口罐子:

.m2\repository\junit\junit\4.12\junit-4.12.jar
.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar
.m2\repository\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar
.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar
.m2\repository\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar
.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar
.m2\repository\org\apache\logging\log4j\log4j-api\2.8\log4j-api-2.8.jar
.m2\repository\org\apache\logging\log4j\log4j-core\2.8\log4j-core-2.8.jar
.m2\repository\org\apache\logging\log4j\log4j-jcl\2.8\log4j-jcl-2.8.jar
.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar
.m2\repository\commons-dbcp\commons-dbcp\1.4\commons-dbcp-1.4.jar
.m2\repository\commons-pool\commons-pool\1.5.4\commons-pool-1.5.4.jar
.m2\repository\com\oracle\ojdbc6\12.1.0.2.0\ojdbc6-12.1.0.2.0.jar
.m2\repository\com\oracle\oraclepki\12.1.0.2.0\oraclepki-12.1.0.2.0.jar
.m2\repository\com\oracle\osdt_cert\12.1.0.2.0\osdt_cert-12.1.0.2.0.jar
.m2\repository\com\oracle\osdt_core\12.1.0.2.0\osdt_core-12.1.0.2.0.jar
.m2\repository\commons-dbutils\commons-dbutils\1.7\commons-dbutils-1.7.jar

标签: jdbcjava-8ojdbcapache-commons-dbutils

解决方案


推荐阅读