JDBC连接的语法prepareCall SQL

IAm*_*aja 9 java stored-procedures jdbc

我正在阅读JavaDocsConnection#prepareCall:

sql - 可能包含一个或多个'?'的SQL语句 参数占位符.通常,此语句是使用JDBC调用转义语法指定的.

根据这个流行的mkyong JDBC教程,我看到执行的方法如下:

String insertStoreProc = "{call insertDBUSER(?,?,?,?)}";
callableStatement = dbConnection.prepareCall(insertStoreProc);
Run Code Online (Sandbox Code Playgroud)

我想知道:

  1. 为什么字符串封装在花括号({ ... })中?
  2. 为什么要call继续执行程序的名称?

最重要的是:是否是{ call <nameOfProcedure> }在所有JDBC驱动程序中执行所有存储过程的正确语法?或者{ call ... }特定于特定类型的驱动程序?

这个过程调用语法有变化吗?例如,是否有场景/驱动器,其中一个可能传递"{ execute <nameOfProcedure> }"prepareCall方法?有没有关于这方面的文件?


更新:

根据CallableStatement,JDBC为所有驱动程序提供了两种有效的语法,用于以标准方式调用proc:

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
Run Code Online (Sandbox Code Playgroud)

和:

{call <procedure-name>[(<arg1>,<arg2>, ...)]}
Run Code Online (Sandbox Code Playgroud)

但是,目前还不清楚何时为使用(即:何时preprend call?=).

Mar*_*eel 5

JDBC规范第 13.4 节转义语法定义了许多称为 JDBC 转义的转义。这些转义符包含在花括号中。调用转义的规范是:

\n\n
\n

如果数据库支持存储过程,则可以使用 JDBC 转义语法调用它们,如下所示:

\n\n
{call <procedure_name> [(<argument-list>)]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,当过程返回结果参数时:

\n\n
{? = call <procedure_name> [(<argument-list>)]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

方括号表示(参数列表)部分是可选的。输入参数可以是文字或参数标记。有关参数的信息,请参阅第 108 页的 \xe2\x80\x9c 设置参数\xe2\x80\x9d。

\n
\n\n

这也记录在java.sql.CallableStatement

\n\n

所以名称call和花括号都是在 JDBC 规范中指定的。

\n\n

至于你问题的第二部分。JDBC 是一种尝试尽可能独立于数据库的规范,并且通常默认为 SQL 标准来做到这一点。IIRC SQL 规范指定存储过程要么没有返回值,要么只有一个返回值。如果存储过程没有返回值,则使用第一个调用语法。如果存储过程只有一个返回值,则使用第二个。

\n\n

存储过程还可以具有OUT参数(不要与结果集混淆),这些参数在普通参数列表中定义。

\n