Java JDBC连接prepareCall SQL的语法
我正在读: sql-可能包含一个或多个“?”参数占位符的sql语句。通常,此语句是使用JDBC调用转义语法指定的 根据这个流行的例子,我看到的方法是这样执行的:Java JDBC连接prepareCall SQL的语法,java,stored-procedures,jdbc,Java,Stored Procedures,Jdbc,我正在读: sql-可能包含一个或多个“?”参数占位符的sql语句。通常,此语句是使用JDBC调用转义语法指定的 根据这个流行的例子,我看到的方法是这样执行的: String insertStoreProc = "{call insertDBUSER(?,?,?,?)}"; callableStatement = dbConnection.prepareCall(insertStoreProc); 我想知道: 为什么字符串被封装在大括号({…})中 为什么调用继续该过程的名称 最重要的是:跨所
String insertStoreProc = "{call insertDBUSER(?,?,?,?)}";
callableStatement = dbConnection.prepareCall(insertStoreProc);
我想知道:
{…}
)中调用
继续该过程的名称{call…}
特定于特定类型的驱动程序
此过程调用语法是否有变化?例如,是否存在可以将“{execute}”
传递到prepareCall
方法的场景/驱动程序?有关于这些的文件吗
更新: 根据
CallableStatement
,JDBC提供了两种有效的语法,用于跨所有驱动程序以标准方式调用过程:
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
{?=call[(,,…)}
以及:
{call[(,,…)}
但何时使用这两种方法(即:何时使用?=
)预处理调用)仍不清楚。第13.4节转义语法定义了许多称为JDBC转义的转义。这些逃犯被卷曲的大括号包裹着。呼叫转义的规格为:
如果数据库支持存储过程,则可以使用JDBC转义语法调用它们,如下所示:
{call <procedure_name> [(<argument-list>)]}
{调用[(
因此名称call
和花括号都是在JDBC规范中指定的
至于问题的第二部分。JDBC是一种尽可能独立于数据库的规范,为此,它通常默认为SQL标准。IIRC SQL规范指定存储过程没有返回值或只有一个返回值。如果存储过程没有返回值,则使用第一个调用语法。如果存储过程只有一个返回值,则使用第二个
存储过程也可以有OUT
参数(不要与结果集混淆),这些参数在普通参数列表中定义。您应该阅读,所有这些问题都在这里得到了回答。谢谢@LuiggiMendoza(+1)-请参阅我关于使用的更新和后续问题?=
。再次感谢!嗯…阅读特定数据库引擎的适当JDBC驱动程序,其中解释了一个或另一个的用法。这就是存储过程的工作原理。SQL存储过程只能返回一个值作为返回,并且它可能已退出参数。存储过程的返回值不同于结果集它可以在被调用时保持打开状态,但这是特定于数据库引擎的。JDBC提供了访问数据库引擎的最通用方式,但它取决于数据库引擎和JDBC驱动程序实现—所有功能的支持,特定的供应商功能或是不完整的数据库引擎。顺便说一下,这些是mments,而不是答案。谢谢@Mark rotterveel(+1)-我希望我能对此进行更多的投票!一个快速的后续问题:JDBC显然支持存储过程的三种类型的输出:(1)返回值,(2)输出参数和(3)结果集。JDBC规范是否对这些输出应该在何处/何时/如何使用进行了权衡?换句话说,对于返回值、输出参数和结果集的构成是否有JDBC标准?再次非常感谢!@IAmYourFaja这在JDBC中并没有真正指定,我相信您需要查看SQL规范。但一般来说:return value:SP中RETURN value
语句返回的单个值,OUT
参数在SP中获取一次值(或者至少:分配给OUT
参数的最后一个值就是您返回的值)。结果集仅为:从存储过程返回的行(如果DB支持,可以有多个结果集!)。结果集字段不应定义为参数。@IAmYourFaja顺便说一句:如果这解决了您的问题,请单击复选标记接受答案。
{call <procedure_name> [(<argument-list>)]}
{? = call <procedure_name> [(<argument-list>)]}