JDBC连接的语法prepareCall SQL
我正在为Connection#prepareCall
阅读JavaDocs :
sql – 可能包含一个或多个’?’的SQL语句 参数占位符。 通常,此语句是使用JDBC调用转义语法指定的。
根据这个流行的mkyong JDBC教程 ,我看到执行的方法如下:
String insertStoreProc = "{call insertDBUSER(?,?,?,?)}"; callableStatement = dbConnection.prepareCall(insertStoreProc);
我想知道:
- 为什么字符串封装在大括号(
{ ... }
)中? - 为什么
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
参数(不要与结果集混淆),这些参数在正常参数列表中定义。