3

我在通过准备好的语句调用存储过程时遇到了这个异常,但是它适用于可调用语句。我想知道是否必须使用可调用语句来调用 voltdb 中的存储过程?

String sql = "{call get_city_by_country(?)}";
PreparedStatement stat = conn.prepareStatement(sql);
stat.setString(1, "china");
ResultSet results = stat.executeQuery();

下面抛出异常:

Exception in thread "main" java.sql.SQLException: Cannot submit statement in current context: '{call get_city_by_country(?)};'.
at org.voltdb.jdbc.SQLError.get(SQLError.java:45)
at org.voltdb.jdbc.JDBC4PreparedStatement.executeQuery(JDBC4PreparedStatement.java:121)

这个工作正常。

CallableStatement proc = conn.prepareCall(sql);
proc.setString(1, "china");
ResultSet results = proc.executeQuery();
4

1 回答 1

3

看起来你的驱动程序只支持CALL逃生CallableStatement。所以你需要CallableStatement改用。

但是,JDBC 4.2 规范的第 6.4 节Java EE JDBC 合规性说(empasis mine):

驱动程序必须支持存储过程。该DatabaseMetaData方法 supportsStoredProcedures必须返回true驱动程序还必须支持完整的 JDBC API 转义语法,以便在上使用以下方法调用存储过程StatementPreparedStatementCallableStatement

  • executeUpdate
  • executeQuery
  • execute

这意味着您的驱动程序不完全符合 Java EE JDBC 合规性要求。您可能需要考虑向驱动程序供应商提交错误报告。

于 2015-05-03T07:48:01.393 回答