当我从 JDBC 调用 Oracle 数据库中的存储过程时,我有以下选择。推荐使用哪一种,为什么?
prepareCall("{call MY_FUN}");
prepareCall"{BEGIN MY_FUN; END;}");
感谢您的回复。
问候约翰内斯
这取决于。使用begin..end
,您只需调用一个匿名 PL/SQL 程序块,该程序块又调用存储过程。当您使用 时call
,您从 SQL 调用该过程。Call 还有一个额外的好处,就是可以返回值等等。有关详细信息,请参阅Oracle 数据库 SQL 语言参考:致电。
也就是说,如果您只是调用这样的过程,则没有太大区别。我认为理论上begin..end
会更有效,因为过程本身是 PL/SQL Call
,并且作为 SQL,会导致 SQL 和 PL/SQL 之间的额外上下文切换,这会产生一些开销。但是我认为即使存在这种差异,您也不会注意到这种差异。
如果您只想准确调用 1 个过程,则两个语句可能是相同的。然而,使用匿名 PLSQL 块可以让您获得更多乐趣。例如,调用不止一个过程或使用 PLSQL 块中允许的任何语法。
prepareCall("BEGIN MY_FUN('no-braces-with-begin-end-syntax'); MORE_FUN; A_LOT_MORE_FUN; END;");
您可以根据您的要求使用任何类型的程序。请澄清您的要求。