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_function
和begin ? := my_function
之间的区别 - 等号前有冒号:
。也许这很明显,但我想指出这一点。
还有另一个提示:在我的情况下,我在执行给定示例后收到错误non supported SQL92
。这是因为 JDBC 驱动程序有时会在解析/转义某些字符时出现问题。所以
和
可以删除,因为有begin
和end
语句,然后一切正常。请参阅 ***.com/a/12281574 和 ***.com/a/16237096(因为如果需要,您可以在 JDBC 中禁用转义处理)。
@jsosnowski - 好点 - 留下花括号是一个疏忽;我打算(但后来忘记了)强调需要:=
的任务。我已经更新并添加了一些关于他分配的差异。
非常感谢。答案很棒。我正在寻找您在第一个链接中提供的文档 - 谢谢。我希望我能给你一个以上的支持。以上是关于JDBC CallableStatement - 一次调用多个存储过程的主要内容,如果未能解决你的问题,请参考以下文章
JDBC Statements, PreparedStatement和CallableStatement语句
如何从 JDBC Callablestatement 访问这个存储过程?
jdbc java数据库连接 5)CallableStatement 接口
JDBC CallableStatement - 一次调用多个存储过程