JDBC CallableStatement - 一次调用多个存储过程

Posted

技术标签:

【中文标题】JDBC CallableStatement - 一次调用多个存储过程【英文标题】:JDBC CallableStatement - call multiple stored procedures in one shot 【发布时间】:2019-01-29 16:56:06 【问题描述】:

要在 Java 中仅使用简单的 JDBC 调用 Oracle 的存储过程,我们可以这样做:

con.prepareCall(" call ? = my_procedure(?) ");
callStm.registerOutParameter(1, Types.INTEGER);
callStm.setInt(2, -100);
callStm.execute()

我想知道是否有可能在一个prepareCall 语句中调用多个过程?例如:

con.prepareCall(" call prepare_proc(); ? = my_procedure(?) ");

当然是无效的,但是如何修复它并一次调用两个或多个程序呢?

【问题讨论】:

你应该把它们包装在另一个过程中,或者你甚至可以写一个PL/SQL而不是使用调用语法。 【参考方案1】:

您可以将它们包装在一个匿名块中:

con.prepareCall("begin prepare_proc(); ? := my_procedure(?); end;");

Read more about the differences.

函数的返回值赋值给绑定变量(第一个?)现在是a PL/SQL assignment,在匿名块内,所以它使用? := ...。在您的原始代码中,您使用的是 call SQL statement 版本 (? = call ...),而 JDBC 使用普通的 = 来分配绑定变量。

想必my_procedure其实就是my_function,不然就不会有返回类型了……

如果有一个包装过程(或函数)同时进行两次调用,然后只需通过 JDBC 调用单个包装器,可能会更易于维护。

【讨论】:

非常感谢。特别是对于给定的示例。有用。致其他人:请注意call ? = my_functionbegin ? := my_function 之间的区别 - 等号前有冒号:。也许这很明显,但我想指出这一点。 还有另一个提示:在我的情况下,我在执行给定示例后收到错误non supported SQL92。这是因为 JDBC 驱动程序有时会在解析/转义某些字符时出现问题。所以 可以删除,因为有beginend 语句,然后一切正常。请参阅 ***.com/a/12281574 和 ***.com/a/16237096(因为如果需要,您可以在 JDBC 中禁用转义处理)。 @jsosnowski - 好点 - 留下花括号是一个疏忽;我打算(但后来忘记了)强调需要:= 的任务。我已经更新并添加了一些关于他分配的差异。 非常感谢。答案很棒。我正在寻找您在第一个链接中提供的文档 - 谢谢。我希望我能给你一个以上的支持。

以上是关于JDBC CallableStatement - 一次调用多个存储过程的主要内容,如果未能解决你的问题,请参考以下文章

JDBC Statements, PreparedStatement和CallableStatement语句

如何从 JDBC Callablestatement 访问这个存储过程?

jdbc java数据库连接 5)CallableStatement 接口

JDBC CallableStatement - 一次调用多个存储过程

JDBC调用MySQL的调用过程CallableStatement

如何从 Java JDBC 中的 callableStatement 获取滚动不敏感的结果集?