繁体   English   中英

JDBC连接的语法prepareCall SQL

[英]Syntax of JDBC Connection prepareCall SQL

我正在阅读JavaDocs for Connection#prepareCall

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

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

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

我想知道:

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

最重要的是{ call <nameOfProcedure> }是跨所有JDBC驱动程序执行所有存储过程的正确语法吗? 还是{ call ... }特定于特定类型的驱动程序?

此过程调用语法是否有变化? 例如,是否存在一些场景/驱动程序,可能会将"{ execute <nameOfProcedure> }"传递给prepareCall方法? 是否有任何相关文档?


更新:

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

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}

和:

{call <procedure-name>[(<arg1>,<arg2>, ...)]}

但是,尚不清楚何时使用哪一个(即:何时使用?=预先call )。

JDBC规范的 13.4节转义语法定义了许多转义,称为JDBC转义。 这些逃脱包裹在花括号中。 呼叫转义的规范为:

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

 {call <procedure_name> [(<argument-list>)]} 

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

 {? = call <procedure_name> [(<argument-list>)]} 

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

这也记录在java.sql.CallableStatement

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

至于问题的第二部分。 JDBC是一种规范,它试图尽可能地独立于数据库,并且为此通常通常使用SQL标准。 IIRC SQL规范指定存储过程没有返回值或只有一个返回值。 如果存储过程没有返回值,则使用第一个调用语法。 如果存储过程具有单个返回值,则使用第二个。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM