【问题标题】:JDBC CallableStatement - call multiple stored procedures in one shotJDBC CallableStatement - 一次调用多个存储过程
【发布时间】: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而不是使用调用语法。

标签: java oracle jdbc java-stored-procedures


【解决方案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 语句,然后一切正常。请参阅 stackoverflow.com/a/12281574stackoverflow.com/a/16237096(因为如果需要,您可以在 JDBC 中禁用转义处理)。
  • @jsosnowski - 好点 - 留下花括号是一个疏忽;我打算(但后来忘记了)强调需要:= 的任务。我已经更新并添加了一些关于他分配的差异。
  • 非常感谢。答案很棒。我正在寻找您在第一个链接中提供的文档 - 谢谢。我希望我能给你一个以上的支持。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2019-01-03
  • 2021-09-24
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多