要仅使用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(?) }");
这当然是无效的,但是如何解决它并一次调用两个或多个过程?
答案 0 :(得分:4)
您可以将它们包装在一个匿名块中:
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调用单个包装器,可能会更易于维护。