Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC连接prepareCall SQL的语法_Java_Stored Procedures_Jdbc - Fatal编程技术网

Java JDBC连接prepareCall SQL的语法

Java JDBC连接prepareCall SQL的语法,java,stored-procedures,jdbc,Java,Stored Procedures,Jdbc,我正在读: sql-可能包含一个或多个“?”参数占位符的sql语句。通常,此语句是使用JDBC调用转义语法指定的 根据这个流行的例子,我看到的方法是这样执行的: String insertStoreProc = "{call insertDBUSER(?,?,?,?)}"; callableStatement = dbConnection.prepareCall(insertStoreProc); 我想知道: 为什么字符串被封装在大括号({…})中 为什么调用继续该过程的名称 最重要的是:跨所

我正在读:

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

根据这个流行的例子,我看到的方法是这样执行的:

String insertStoreProc = "{call insertDBUSER(?,?,?,?)}";
callableStatement = dbConnection.prepareCall(insertStoreProc);
我想知道:

  • 为什么字符串被封装在大括号(
    {…}
    )中
  • 为什么
    调用
    继续该过程的名称
  • 最重要的是:跨所有JDBC驱动程序执行所有存储过程的语法是否正确?或者
    {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>)]}