gpt4 book ai didi

java - JDBC Connection prepareCall SQL 的语法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:38 26 4
gpt4 key购买 nike

我正在阅读 JavaDocs for Connection#prepareCall :

sql - an SQL statement that may contain one or more '?' parameter placeholders. Typically this statement is specified using JDBC call escape syntax.

根据这个热门mkyong JDBC tutorial ,我看到方法是这样执行的:

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

我在想:

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

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

此过程调用语法是否有变体?例如,是否存在可能通过 "{ execute <nameOfProcedure> }" 的场景/驱动程序进入prepareCall方法?是否有相关文档?


更新:

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

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

和:

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

但仍不清楚何时使用其中任何一个(即:何时使用 call 预先添加 ?=)。

最佳答案

JDBC specification , section 13.4 Escape Syntax 定义了许多称为 JDBC 转义的转义。这些转义被包裹在大括号中。调用转义的规范是:

If a database supports stored procedures, they can be invoked using JDBC escape syntax as follows:

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

or, where a procedure returns a result parameter:

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

The square brackets indicate that the (argument-list) portion is optional. Input arguments may be either literals or parameter markers. See “Setting Parameters” on page 108 for information on parameters.

这也记录在 java.sql.CallableStatement

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

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

存储过程也可以有 OUT 参数(不要与结果集混淆),这些参数在普通参数列表中定义。

关于java - JDBC Connection prepareCall SQL 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com