JDBC连接的语法prepareCall SQL

我正在为Connection#prepareCall阅读JavaDocs :

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

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

 String insertStoreProc = "{call insertDBUSER(?,?,?,?)}"; callableStatement = dbConnection.prepareCall(insertStoreProc); 

我想知道:

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

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

这个过程调用语法有变化吗? 例如,是否存在可以将"{ execute }"传递到prepareCall方法的场景/驱动程序? 有没有关于这方面的文件?


更新:

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

 {?= call [(,, ...)]} 

和:

 {call [(,, ...)]} 

但目前还不清楚何时使用(即:什么时候预先call ?= )。

JDBC规范的第13.4节“转义语法”定义了许多名为JDBC转义的转义。 这些逃脱用花括号包裹。 呼叫转义的规范是:

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

 {call  [()]} 

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

 {? = call  [()]} 

方括号表示(argument-list)部分是可选的。 输入参数可以是文字或参数标记。 有关参数的信息,请参见第108页的“设置参数”。

这也记录在java.sql.CallableStatement

因此,名称call和花括号都在JDBC规范中指定。

至于你问题的第二部分。 JDBC是一种尽可能尝试与数据库无关的规范,并且通常 – 默认为SQL标准。 IIRC SQL规范指定存储过程没有返回值或单个返回值。 如果存储过程没有返回值,则使用第一个调用语法。 如果存储过程具有单个返回值,则使用第二个。

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