当在sql-string中有注释和参数时,PreparedStatement.getParameterMetaData()抛出ArrayIndexOutOfBoundsException

Kas*_*too 6 java oracle jdbc

我试图从java.sql.PreparedStatement对象获取ParameterMetaData.

虽然文档说它在数据库出现问题时抛出了SQLException,但我现在得到一个ArrayIndexOutOfBoundsException.

我正在使用这个JDBC驱动程序URL:oracle.jdbc.driver.OracleDriver我正在使用ojdbc6.jar和64位JDK 1.6.0.45.

我正在做以下事情:

PreparedStatement stmt = myOracleConn.prepareStatement(sql);
preparedStatements.add(stmt);
ParameterMetaData bla2 = stmt.getParameterMetaData(); //this Line throws the Exception
Run Code Online (Sandbox Code Playgroud)

我发现只有当我在sql-String中使用注释时才会发生这种情况.

所以,当我的SQL是:

1)(没有评论但参数)

"SELECT * FROM DUAL WHERE 1 = ?" --> no error occurs
Run Code Online (Sandbox Code Playgroud)

2)(评论和参数)

"/* mySampleComment */ SELECT * FROM DUAL WHERE 1 = ?" --> the indexoutofbounds exception occurs
Run Code Online (Sandbox Code Playgroud)

3)(评论但没有参数)

"/* mySampleComment */ SELECT * FROM DUAL WHERE 1 = 1" --> no error occurs
Run Code Online (Sandbox Code Playgroud)

我想知道这是不是我和我不能在我的sqls中使用评论或者我是否遗漏了某些东西......有人对此有所了解吗?

edit1:使用--comments而不是/**/导致相同的行为.edit2:它似乎根本没有,我有一个包含的大SQL

\n\t\t\t\t--great
Run Code Online (Sandbox Code Playgroud)

得到例外.当将这个包含在样本sqls仍然postet时,它将工作

如果我遗漏了一些信息,只需要求它.提前致谢.

Mar*_*aus 0

您应该在执行 .getParameterMetaData() 之前为语句设置参数

PreparedStatement stmt = myOracleConn.prepareStatement(sql);
stmt.setString(1,"test"); 
ParameterMetaData metadata = stmt.getParameterMetaData();
Run Code Online (Sandbox Code Playgroud)