SQLException:无法在当前上下文中提交语句

SQLException: Cannot submit statement in current context

我在通过准备好的语句调用存储过程时遇到了这个异常,但是它适用于可调用语句。我想知道是否必须使用可调用语句来调用 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();

看起来您的驱动程序只支持 CallableStatement 上的 CALL 转义。所以你需要使用 CallableStatement 来代替。

第 6.4 节 Java EE JDBC Compliance JDBC 4.2 规范然而说(强调我的):

Drivers must support stored procedures. The DatabaseMetaData method supportsStoredProcedures must return true. The driver must also support the full JDBC API escape syntax for calling stored procedures with the following methods on the Statement, PreparedStatement, and CallableStatement classes:

  • executeUpdate
  • executeQuery
  • execute

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