【发布时间】:2015-02-07 12:45:18
【问题描述】:
我正在阅读JavaDocs for Connection#prepareCall:
sql - 可能包含一个或多个“?”的 SQL 语句参数占位符。通常,此语句是使用 JDBC 调用转义语法指定的。
根据这个流行的mkyong JDBC tutorial,我看到方法是这样执行的:
String insertStoreProc = "{call insertDBUSER(?,?,?,?)}";
callableStatement = dbConnection.prepareCall(insertStoreProc);
我想知道:
- 为什么将字符串封装在大括号 (
{ ... }) 中? - 为什么
call继续过程的名称?
最重要的是:{ call <nameOfProcedure> } 是跨所有 JDBC 驱动程序执行所有存储过程的正确语法吗?还是{ call ... } 特定于特定类型的驱动程序?
此过程调用语法是否有变体?例如,是否存在可能将"{ execute <nameOfProcedure> }" 传递给prepareCall 方法的场景/驱动程序?有这方面的文档吗?
更新:
根据CallableStatement,JDBC 提供了 2 种有效语法,用于跨所有驱动程序以标准方式调用 procs:
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
还有:
{call <procedure-name>[(<arg1>,<arg2>, ...)]}
但目前还不清楚何时使用其中任何一个(即:何时将call 与?= 放在一起)。
【问题讨论】:
-
你应该阅读
java.sql.CallableStatement,所有这些问题都在这里得到解答。 -
感谢@LuiggiMendoza (+1) - 请查看我关于使用
?=的更新和后续问题。再次感谢! -
呃...阅读特定数据库引擎的正确 JDBC 驱动程序,其中解释了一个或另一个的用法。
-
这就是存储过程的工作方式。 SQL 存储过程只能返回单个值
RETURN,并且它可以有 OUT 参数。存储过程的返回值不同于它在被调用时可以保持打开的ResultSet(s),但这是特定于数据库引擎的。 JDBC 提供了最通用的方式来访问数据库引擎,但它依赖于数据库引擎和 JDBC 驱动程序实现对所有功能的支持、特定供应商功能或不完整的数据库引擎。 -
顺便说一下,这些是 cmets,而不是答案。
标签: java stored-procedures jdbc