[英]How to override some of java.sql.connection methods like prepareStatement createStatement or prepareCall?
[英]Syntax of JDBC Connection prepareCall SQL
我正在阅读JavaDocs for Connection#prepareCall
:
sql-可能包含一个或多个'?'的SQL语句 参数占位符。 通常,此语句是使用JDBC调用转义语法指定的。
根据这个流行的mkyong JDBC教程 ,我看到这样执行的方法:
String insertStoreProc = "{call insertDBUSER(?,?,?,?)}";
callableStatement = dbConnection.prepareCall(insertStoreProc);
我想知道:
{ ... }
)中? 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.