准备
PREPARE 语句根据语句的字符串格式创建 SQL 语句的可执行格式。 字符串格式称为 语句字符串,可执行格式称为 预编译语句。
调用
此语句只能嵌入在应用程序, SQL 函数, SQL 过程或触发器中。 它是无法动态准备的可执行语句。 不得在 Java™中指定该值。
授权
授权规则与为 PREPARE 语句指定的 SQL 语句定义的规则相同。 例如,请参阅 select-statement 以获取在准备 SELECT 语句时应用的授权规则。
如果在 CRTSQLxxx 命令上指定了 DLYPRP (*NO) ,那么在准备语句时将执行授权检查,但以下情况除外:
- 如果准备了 DROP SCHEMA 语句,那么直到执行该语句之后才会检查该模式中所有对象的特权。
- 如果准备了 DROP TABLE 语句,那么在执行该语句之前,不会检查对引用该表的所有视图,索引和逻辑文件的特权。
- 如果准备了 DROP VIEW 语句,那么在执行该语句之前,不会检查所有引用该视图的视图上的特权。
- 如果准备了 CREATE TRIGGER 语句,那么在执行该语句之前,不会检查对 trigger-action 中引用的对象的特权。
- 如果准备了 FUNCTION , PROCEDURE , SEQUENCE , TYPE , TRIGGER , VARIABLE 或 XSROBJECT 语句的 DROP , COMMENT 或 LABEL ,那么直到执行该语句之后才会检查权限。
- 如果准备了 GRANT 或 REVOKE 语句,那么直到执行该语句之后才会检查权限。
如果在 CRTSQLxxx 命令上指定了 DLYPRP (*YES) ,那么将延迟所有授权检查,直到在 OPEN 语句中执行或使用该语句为止。
除非在创建程序时在 CRTSQLxxx 命令上指定了 USRPRF (*OWNER) 和 DYNUSRPRF (*OWNER) ,否则该语句的授权标识是运行时授权标识。 有关更多信息,请参阅 授权标识和授权名称。
如果在语句中引用了全局变量,那么该语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的全局变量,
- 对全局变量的 READ 特权,以及
- 对包含全局变量的模式的 USAGE 特权
- 数据库管理员权限
语法
描述
- 语句名
- 命名预编译语句。 如果该名称标识现有预编译语句,那么在下列情况下将销毁该预编译语句:
- 它是在同一程序的同一实例中准备的,或者
- 在与两个预编译语句相关联的 CRTSQLxxx 命令上指定了 CLOSQLCSR (*ENDJOB) , CLOSQLCSR (*ENDACTGRP) 或 CLOSQLCSR (*ENDSQL)。
- 使用 SQL 描述符 SQL-descriptor-name
- 标识 SQL 描述符。 如果指定了 USING ,并且成功执行了 PREPARE 语句,那么有关预编译语句的信息将放在由 SQL-descriptor-name指定的 SQL 描述符中。 因此, PREPARE 语句:
EXEC SQL PREPARE S1 USING SQL DESCRIPTOR :sqldescriptor FROM :V1;等同于:
EXEC SQL PREPARE S1 FROM :V1; EXEC SQL DESCRIBE S1 USING SQL DESCRIPTOR :sqldescriptor;- LOCAL
- 指定要在程序调用本地的描述符名称的作用域。
- 全局
- 指定要对 SQL 会话为全局的描述符名称的作用域。
- SQL 描述符名称
- 命名 SQL 描述符。 该名称必须标识已存在的具有指定作用域的描述符。
请参阅 GET DESCRIPTOR 以获取放置在 SQL 描述符中的信息的说明。
- INTO
- 如果使用了 INTO ,并且成功执行了 PREPARE 语句,那么有关预编译语句的信息将放在由 descriptor-name指定的 SQLDA 中。 因此, PREPARE 语句:
EXEC SQL PREPARE S1 INTO :SQLDA FROM :V1;等同于:
EXEC SQL PREPARE S1 FROM :V1; EXEC SQL DESCRIBE S1 INTO :SQLDA;- 描述符名称
- 标识 SQL 描述符区域 (SQLDA) ,如 SQLDA (SQL 描述符区域)中所述。 在执行 PREPARE 语句之前,必须设置 SQLDA 中的以下变量 (REXX 的规则不同。 有关更多信息,请参阅 嵌入式 SQL 编程 主题集合。)
- SQLN
- 指示 SQLVAR 表示的变量数。 (SQLN 提供 SQLVAR 数组的维。) 在执行 PREPARE 语句之前,必须将 SQLN 设置为大于或等于零的值。 有关确定所需出现次数的方法的信息,请参阅 确定需要多少 SQLVAR 出现次数。
有关放置在 SQLDA 中的信息的说明,请参阅 DESCRIBE OUTPUT 。
- USING
- 指定要分配给 SQLDA 中的每个 SQLNAME 变量的值。 如果请求的值不存在或名称超过 30 ,那么 SQLNAME 设置为长度 0。
- NAMES
- 分配列的名称。 这是缺省情况。 对于在 select-list 中显式指定了名称的预编译语句,将返回指定的名称。
- SYSTEM NAMES
- 分配列的系统列名。
- 标签
- 分配列的标签。 (列标签由 LABEL 语句定义。) 仅返回标签的前 20 个字节。
- 任何
- 分配列标签。 如果该列没有标签,那么该标签是列名。
- 两者
- 同时指定列的标签和名称。 在这种情况下,需要每列出现两次或三次 SQLVAR ,具体取决于结果集是否包含单值类型,以适应其他信息。 要指定 SQLVAR 数组的此扩展,请将 SQLN 设置为 2 *n 或 3 *n(其中 n 是表或视图中的列数)。 SQLVAR 的前 n 次出现包含列名。 第二次或第三次 n 出现包含列标签。 如果没有单值类型,那么将在第二组 SQLVAR 条目中返回这些标签。 否则,将在第三组 SQLVAR 条目中返回这些标签。
如果在后续 FETCH 语句上使用相同的 SQLDA ,请在 PREPARE 完成后将 SQLN 设置为 n 。
- 全部
- 分配标签,列名和系统列名。 在这种情况下,根据结果集是否包含单值类型,需要每列出现三次或四次 SQLVAR ,以适应其他信息。 要指定 SQLVAR 数组的此扩展,请将 SQLN 设置为 3 *n 或 4 *n (其中 n 是结果表中的列数)。 前 n 次出现的 SQLVAR 包含系统列名。 第二次或第三次 n 次出现包含列标签。 第三次或第四次出现的 n 包含列名 (如果它们与系统列名不同)。 如果没有单值类型,那么将在第二组 SQLVAR 条目中返回标签,而在第三组 SQLVAR 条目中返回列名。 否则,将在第三组 SQLVAR 条目中返回标签,并在第四组 SQLVAR 条目中返回列名。
如果在后续 FETCH 语句上使用相同的 SQLDA ,请在 PREPARE 完成后将 SQLN 设置为 n 。
- 属性 attr-variable
- 指定如果未将相应属性指定为关联 SELECT 语句的最外层全查询的一部分,那么此游标的属性有效。 如果为最外面的全查询指定了属性,那么将使用这些属性来代替在 PREPARE 语句中指定的相应属性。 反过来,如果在 PREPARE 语句中指定了属性,那么将使用这些属性而不是在 DECLARE CURSOR 语句中指定的相应属性。
如果预编译语句不是 select-statement,那么将忽略除 USE 当前已落实和 WAIT FOR 结局以外的所有属性。
attr-variable 必须标识根据声明字符串变量的规则在程序中声明的字符串或 Unicode 图形变量。 attr-variable 必须是长度属性不超过 VARCHAR 最大长度的字符串变量 (固定长度或可变长度)。 将从变量的值中除去前导和尾部空格。 该变量必须包含有效的 attribute-string。
指示符变量可用于指示是否在 PREPARE 语句上实际提供了属性。 因此,无论是否需要指定属性,应用程序都可以使用相同的 PREPARE 语句。 可指定为 attribute-string 的一部分的选项如下所示:- ASENSITIVE, SENSITIVE, 或 INSENSITIVE
- 指定游标是对更改敏感,敏感还是不敏感。 有关更多信息,请参阅 DECLARE CURSOR。
如果指定了 SENSITIVE ,那么不得指定 fetch-clause 。 如果指定了 INSENSITIVE ,那么不得指定 update-clause 。
- 无滚动 或 滚动
- 指定游标是可滚动还是不可滚动。 有关更多信息,请参阅 DECLARE CURSOR。
- WITHOUT HOLD 或 WITH HOLD
- 指定是否应防止因落实操作而关闭游标。 有关更多信息,请参阅 DECLARE CURSOR。
- 不带返回 或
- 指定是否打算将游标的结果表用作将从过程返回的结果集。 有关更多信息,请参阅 DECLARE CURSOR。
- offset-子句
- 指定在检索任何行之前要跳过的行数。 有关更多信息,请参阅 offset-clause。 offset-row-count 必须是常量。
- fetch-子句
- 指定应检索的最大行数。 有关更多信息,请参阅 fetch-clause。 fetch-row-count 必须是常量。 不支持备用 LIMIT 语法。
- read-only-clause 或 update-clause
- 指定结果表是只读表还是可更新表。 必须指定不带列名 (FOR UPDATE) 的 update-clause 子句。 有关更多信息,请参阅 read-only-clause 和 update-clause。
- optimize-子句
- 指定数据库管理器应假定程序不打算从结果表中检索超过 integer 行。 有关更多信息,请参阅 optimize-clause。
- 隔离子句
- 指定执行 SELECT 语句的隔离级别。 有关更多信息,请参阅 isolation-clause。
- 并发访问解决条款
- 指定要用于 SELECT 语句的并发访问解析。 有关更多信息,请参阅 concurrent-access-resolution-clause。
- 没有扩展指示符 或具有扩展指示符的
- 指定在执行 INSERT 或 UPDATE 期间为指示符变量提供的值是否遵循用于指示 NULL 值的标准 SQL 语义,或者是否可以使用包括 DEFAULT 或 UNASSIGNED 在内的扩展指示符值。
- 没有行更改列 或 具有可能相异的行更改列 或 具有始终相异的行更改列
- 指定是否应将其他列添加到准备好的 select-statement 的结果集,随后可使用这些列来标识行中列的值是否可能已更改。 仅当在最外面的子查询中引用了单个表 (或可更新视图) 时,才会添加其他行更改列。 DESCRIBE 和 GET DESCRIPTOR 语句将指示已添加哪些行。
- 无行更改列
- 行更改列不会添加到结果集。 这是缺省情况。
- 具有可能不同的行更改列
- 行更改列将添加到结果集,即使它们不唯一表示单个行也是如此。 添加的列可用于确定行中列的值自最初访存以来是否已更改。
- 如果行更改列值自第一次访存以来未更改,那么自第一次访存以来未更改行的任何列。
- 如果行更改列值自首次访存以来已更改,那么该行的列可能已更改,也可能未更改,因为不保证行更改值表示单个行。
- 具有行更改列时始终相异
- 仅当行更改列唯一表示单个行时,才会将这些行更改列添加到结果集。 否则,不会向结果集添加任何行更改列。 添加的列可用于确定行中列的值自最初访存以来是否已更改。 (请注意,表需要行更改时间戳记列以保证行的行更改列唯一地标识单个行。)
- 如果行更改列值自第一次访存以来未更改,那么自第一次访存以来未更改行的任何列。
- 如果行更改列值自首次访存以来已更改,那么该行的列已更改。
- 自
- 引入语句字符串。 语句字符串是指定的 表达式 string-expression的值。 或标识的 变量。
- 变量
- 标识根据声明字符串或 Unicode 图形变量的规则在程序中声明的 变量 。 不得指定指示符变量。
- 表达式
- 表达式中描述的类型的 表达式 ,它不包含聚集函数或列名。 它必须返回一个作为字符串或 Unicode 图形字符串的值。 如果在 表达式 中指定了变量,那么该变量的 CCSID 不得为 65535。1
语句字符串必须是下列其中一个 SQL 语句:
ALLOCATE CURSOR 插入 SET CURRENT DEGREE ALTER 标签 SET CURRENT IMPLICIT XMLPARSE OPTION ASSOCIATE LOCATORS LOCK TABLE 设置当前时间系统时间 CALL MERGE SET ENCRYPTION PASSWORD COMMENT REFRESH TABLE SET PATH COMMIT RELEASE SAVEPOINT SET SCHEMA 复合(动态) RENAME SET SESSION AUTHORIZATION 创建 撤销 SET TRANSACTION DECLARE GLOBAL TEMPORARY TABLE ROLLBACK SET 变量2 删除 SAVEPOINT TRANSFER OWNERSHIP DROP SELECT 语句 TRUNCATE FREE LOCATOR SET CURRENT DEBUG MODE 更新 授予 SET CURRENT DECFLOAT ROUNDING MODE VALUES INTO HOLD LOCATOR 语句字符串不得:
- 以 EXEC SQL 开头。
- 以 END-EXEC 或分号结束。
- 包括对变量的引用。 允许使用全局变量。
注意
参数标记: 虽然语句字符串不能包含对 主变量, SQL 变量或 SQL 参数的引用,但它可能包含 参数标记 或全局变量。 执行预编译语句时,可以将参数标记 替换为变量值。 参数标记是一个问号 (?) ,如果语句字符串是静态 SQL 语句,那么可以在其中使用变量。 有关如何将参数标记替换为值的说明,请参阅 OPEN 和 EXECUTE。
有两种类型的参数标记:
- 输入的参数标记
- 与其目标数据类型一起指定的参数标记。 它的一般格式为:
此表示法不是函数调用,而是 "promise" ,表示在运行时参数的类型将是指定的数据类型或可以转换为指定数据类型的某些数据类型。 例如,在:CAST(? AS data-type)
TRANSLATE 函数的自变量值将在运行时提供。 该值的数据类型将是 VARCHAR (12) 或可转换为 VARCHAR (12) 的某种类型。 有关更多信息,请参阅 CAST 规范。UPDATE EMPLOYEE SET LASTNAME = TRANSLATE(CAST(? AS VARCHAR(12))) WHERE EMPNO = ? - 无类型参数标记
- 在指定时未指定其目标数据类型的参数标记。 它具有单个问号的形式。 无类型参数标记的数据类型由上下文提供。 例如,上述 update 语句的谓词中的 untype 参数标记与 EMPNO 列的数据类型相同。
只要支持变量且数据类型基于在 CAST 函数中所作的承诺,就可以在动态 SQL 语句中使用带类型参数标记。
| 隐式类型参数标记位置 | 数据类型 |
|---|---|
| 在未包含在子查询中的选择列表中单独存在 | 错误 |
| 单独位于 EXISTS 子查询中的选择列表中 | 错误 |
| 单独位于子查询中的选择列表中 | 子查询的其他操作数的数据类型。3 |
| 单独作为 offset-clause中的 offset-row-count 。 | BIGINT |
| 在 fetch-clause中单独作为 fetch-row-count 。 | BIGINT |
| 在考虑运算符优先顺序和操作规则顺序之后,单个算术运算符的两个操作数。 包括如下案例:
|
DECFLOAT (34) |
| 算术表达式中单个运算符的一个操作数 (不是日期时间表达式) 包括如下案例:
|
其他操作数的数据类型。 |
| 在单位类型不是 SECONDS 的日期表达式中标注的持续时间。 (注意,标注持续时间中表示单位类型的部分不能作为参数标记) | DECIMAL (15, 0) |
| 在日期表达式中标注的持续时间,类型单位为秒。 (注意,标注持续时间中表示单位类型的部分不能作为参数标记) | 十进制 (27,12) |
| 日期时间表达式的任何其他操作数 (例如 "timecol +?" 或 "? -datecol ')。 | 错误 |
| CONCAT 运算符的两个操作数 | DBCLOB (1G) CCSID 1200 |
| 当另一个操作数是非 CLOB 字符数据类型时, CONCAT 运算符的一个操作数 | 具有与其他操作数相同的 CCSID 的 VARCHAR (32740) |
| 当另一个操作数是非 DBCLOB 图形数据类型时, CONCAT 运算符的一个操作数 | VARGRAPHIC (16370) 具有与其他操作数相同的 CCSID |
| 当另一个操作数是非 BLOB 二进制类型时, CONCAT 运算符的一个操作数 | VARBINARY (32740) |
| CONCAT 运算符的一个操作数,当另一个操作数是大对象字符串时 | 与其他操作数相同 |
| 简单 CASE 表达式中 CASE 关键字后面的表达式 | 将 结果数据类型的规则 应用于 WHEN 关键字后面除非非类型化参数标记的表达式的结果 |
| CASE 表达式中的至少一个结果表达式 ("简单" 和 "已搜索") 以及其余的结果表达式 (非类型化参数标记或 NULL)。 | 错误 |
| 简单 CASE 表达式中 WHEN 后面的任何或所有表达式。 | 将 结果数据类型的规则 应用于 CASE 后面的表达式以及 WHEN 后面的表达式的结果,这些表达式不是非类型化参数标记。 |
| CASE 表达式 (包括简单表达式和搜索表达式) 中的结果表达式,其中至少一个结果表达式不为 NULL ,并且不是非类型化参数标记。 | 将 结果数据类型的规则 应用于除 NULL 或非类型参数标记以外的所有结果表达式的结果。 |
| 单独作为单个行 VALUES 子句中的 column-expression ,该子句不在 INSERT 语句中,也不在 MERGE 语句的插入操作的 VALUES 子句中。 | 错误 |
| 单独作为多行 VALUES 子句中的 column-expression ,该子句不在 INSERT 语句中,并且对于该子句,所有其他 row-value-expression 中相同位置的 column-expression都是无类型参数标记。 | 错误 |
| 单独作为多行 VALUES 子句中的 column-expression ,而该子句不在 INSERT 语句中,并且至少一个其他 row-value-expression 的相同位置中的 column-expression 不是非类型参数标记或 NULL。 | 将 结果数据类型的规则 应用于非非类型化参数标记的所有操作数的结果。 |
| 单独作为 INSERT 语句中单行 VALUES 子句中的 column-expression 。 | 该列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 3 |
| 单独作为 INSERT 语句中多行 VALUES 子句中的 column-expression 。 | 该列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 3 |
| 单独作为 MERGE 语句的源表的 VALUES 子句中的 column-expression | 错误 |
| 单独作为 MERGE 语句的插入操作的 VALUES 子句中的 column-expression | 该列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 3 |
| 单独作为 MERGE 语句的更新操作的 assignment-子句右侧的 column-expression | 该列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 3 |
| 单独作为 UPDATE 语句的 SET 子句右侧的值。 | 该列的数据类型。 如果该列定义为用户定义的单值类型,那么它是用户定义的单值类型的源数据类型。 3 |
| 作为 INSERT 语句的 insert-multiple-rows 中的值。 | INTEGER |
| 作为 SET 专用寄存器语句右侧的值 | 专用寄存器的数据类型。 |
| 作为 VALUES INTO 语句的 VALUES 子句中的值,其中关联的表达式是全局变量。 | 全局变量的数据类型。 |
| 作为 VALUES INTO 语句的 INTO 子句中的值 | 关联表达式的数据类型。 3 |
| 作为 FREE LOCATOR 或 HOLD LOCATOR 语句中的值 | 定位器。 |
| 作为 SET ENCRYPTION PASSWORD 语句中密码的值 | VARCHAR(128) |
| 作为 SET ENCRYPTION PASSWORD 语句中提示的值 | VARCHAR(32) |
| 隐式类型参数标记位置 | 数据类型 |
|---|---|
| 比较运算符或 DISTINCT 谓词的两个操作数 | VARGRAPHIC (16370) CCSID 1200 |
| 比较运算符或 DISTINCT 谓词的一个操作数,其中另一个操作数不是非类型化参数标记或 强类型化 单值类型。 | 其他操作数的数据类型。 如果另一个操作数是弱类型的单值类型,那么是单值类型的源数据类型。3 |
| 比较运算符的一个操作数,其中另一个操作数是 强类型 单值类型。 | 错误 |
| BETWEEN 谓词的所有操作数 | VARGRAPHIC (16370) CCSID 1200 |
| BETWEEN 谓词的两个操作数 | 与唯一的非参数标记相同。 |
| 仅 BETWEEN 谓词的一个操作数 | 在除非类型参数标记的所有操作数上应用 结果数据类型规则 的结果,但 CCSID 属性是执行时指定的值的 CCSID。 |
布尔谓词的操作数![]() |
BOOLEAN![]() |
| IN 谓词的所有操作数,例如? IN (? ,? ,?) | VARGRAPHIC (16370) CCSID 1200 |
| IN 谓词的第一个操作数,其中右侧是全查询,例如,? IN (全查询)。 | 所选列的数据类型 |
| 例如,右侧不是全查询的 IN 谓词的第一个操作数? IN (? , A , B) 或例如? IN (A ,? , B ,?)。 | 在 IN 列表的所有操作数 (IN 关键字右边的操作数) 上应用 结果数据类型的规则 的结果,这些操作数不是非类型化参数标记,但 CCSID 属性是执行时指定的值的 CCSID。 |
| IN 谓词的 IN 列表的任何或所有操作数,例如, A IN (? , B ,?)。 | 对 IN 谓词的所有操作数 (IN 谓词的左和右操作数) 应用 结果数据类型规则 的结果,这些操作数不是非类型化参数标记,但 CCSID 属性是执行时指定的值的 CCSID。 |
| IN 谓词的 row-value-expression 中的任何操作数,例如 (c1,?) 输入 ... | 错误 |
| 如果在 IN 谓词中指定了 row-value-expression ,那么子查询中的任何选择列表项,例如 (c1,c2) IN (SELECT? , c1 FROM...) | 错误 |
| IS JSON 谓词的第一个操作数 | CLOB (2G) CCSID 1208 |
| json-expression 或 JSON_EXISTS 谓词的 sql-json-path-expression 。 | CLOB (2G) CCSID 1208 |
| LIKE 谓词的所有三个操作数。 | 匹配表达式 (操作数 1) 和模式表达式 (操作数 2) VARCHAR (32740); 转义表达式 (操作数 3) 为带有作业 CCSID 的 VARCHAR (1) 4 。 |
| 当模式表达式或转义表达式不是非类型参数标记时, LIKE 谓词的匹配表达式。 | VARCHAR (32740) , VARGRAPHIC (16370) 或 VARBINARY (32740) ,这取决于不是非类型参数标记的第一个操作数的数据类型。 CCSID 取决于第一个操作数的 CCSID。 |
| 当匹配表达式或转义表达式不是非类型参数标记时, LIKE 谓词的模式表达式。 | VARCHAR (32740) , VARGRAPHIC (16370) 或 VARBINARY (32740) ,这取决于不是非类型参数标记的第一个操作数的数据类型。 CCSID 取决于第一个操作数的 CCSID。 有关将固定长度变量用于模式值的信息,请参阅 LIKE 谓词。 |
| 当匹配表达式或模式表达式不是非类型参数标记时, LIKE 谓词的转义表达式。 | VARCHAR (1) 4 , VARGRAPHIC (1) 或 VARBINARY (1) ,这取决于对非非类型化参数标记的所有操作数应用 结果数据类型的规则 的结果。 CCSID 还取决于应用这些规则的结果。 |
| NULL 谓词的操作数 | VARGRAPHIC (16370) CCSID 1200 |
| 隐式类型参数标记位置 | 数据类型 |
|---|---|
ADD_DAYS , ADD_HOURS , ADD_MINUTES , ADD_MONTHS , ADD_SECONDS 或 ADD_YEARS 的第一个自变量 ![]() |
TIMESTAMP![]() |
ADD_DAYS , ADD_HOURS , ADD_MINUTES , ADD_MONTHS 或 ADD_YEARS 的第二个自变量 ![]() |
BIGINT![]() |
ADD_SECONDS 的第二个自变量![]() |
DECFLOAT (34)![]() |
| BITAND , BITANDNOT , BITOR , BITXOR , BITNOT , COALESCE , IFNULL , LAND , LOR , MIN , MAX , NULLIF , VALUE 或 XOR 的所有自变量 | 错误 |
| COALESCE , IFNULL , LAND , LOR , MIN , MAX , NULLIF 或 VALUE 或 XOR 的任何自变量,其中至少一个自变量不是非类型参数标记。 | 对除非类型化参数标记以外的所有自变量应用 结果数据类型规则 的结果。 如果结果是弱类型的单值类型,那么是单值类型的源数据类型。 如果结果是 强类型 单值类型,那么将返回错误。 |
| BITAND , BITANDNOT , BITOR 和 BITXOR 的自变量,其中另一自变量不是非类型化参数标记。 | 如果另一个自变量是 SMALLINT , INTEGER 或 BIGINT ,那么另一个自变量的数据类型。 否则, DECFLOAT (34)。 |
| BSON_TO_JSON 的第一个自变量 | BLOB (2G) |
| COMPARE_DECFLOAT , DECFLOAT_SORTKEY , NORMALIZE_DECFLOAT , QUANTIZE 和 TOTALORDER 的所有自变量 | DECFLOAT (34) |
| DAYNAME 的第一个自变量 | TIMESTAMP (12) |
| DECFLOAT_FORMAT 的第一个自变量 | VARGRAPHIC (16370) CCSID 1200 |
| DECFLOAT_FORMAT 的第二个自变量 | 错误 |
| HASH , HASH_MD5, HASH_SHA1, HASH_SHA256或 HASH_SHA512 的第一个自变量 | DBCLOB (1G) CCSID 1200 |
| HASH 的第二个自变量 | INTEGER |
| 理由的第一个自变量 | BLOB (2G) |
ISFALSE , ISNOTFALSE , ISTRUE 和 ISNOTTRUE 的自变量![]() |
BOOLEAN![]() |
| JSON-expression (指定 FORMAT BSON 时) JSON_ARRAY , JSON_OBJECT , JSON_QUERY 或 JSON_VALUE 的自变量 | BLOB (2G) |
| JSON-expression (未指定 FORMAT BSON 时) , key-name-expression或 JSON_ARRAY , JSON_OBJECT , JSON_QUERY 或 JSON_VALUE 的 sql-json-path-expression 自变量 | CLOB (2G) CCSID 1208 |
| JSON_TO_BSON 的第一个自变量 | CLOB (2G) CCSID 1208 |
| LOCATE , POSITION 或 POSSTR 的两个自变量 | DBCLOB (1G) CCSID 1200 |
| 当另一个自变量是字符数据类型时,为 LOCATE , POSITION 或 POSSTR 的一个自变量。 | VARCHAR (32740) ,具有其他自变量的 CCSID |
| 当另一个自变量是图形数据类型时,为 LOCATE , POSITION 或 POSSTR 的一个自变量。 | VARGRAPHIC (16370) 与另一个自变量的 CCSID |
| LOCATE , POSITION 或 POSSTR 的一个自变量 (当另一个自变量是二进制数据类型时)。 | VARBINARY (32740) |
| LOCATE_IN_STRING 或 OVERLAY 的第一个和第二个自变量 | DBCLOB (1G) CCSID 1200 |
| 当另一个字符串自变量是字符数据类型时, LOCATE_IN_STRING 或 OVERLAY 的第一个或第二个自变量。 | VARCHAR (32740) ,具有其他自变量的 CCSID |
| 当另一个字符串自变量是图形数据类型时,这是 LOCATE_IN_STRING 或 OVERLAY 的第一个或第二个自变量。 | VARGRAPHIC (16370) 与另一个自变量的 CCSID |
| 当另一个字符串自变量是二进制数据类型时, LOCATE_IN_STRING 或 OVERLAY 的第一个或第二个自变量。 | VARBINARY (32740) |
| LOCATE_IN_STRING 或 OVERLAY 的第三或第四个自变量 | INTEGER |
| LPAD 或 RPAD 的第二个自变量 | INTEGER |
| LPAD 或 RPAD 的第三个自变量 | VARCHAR (32740) |
| LTRIM 或 RTRIM 的第一个自变量 | DBCLOB (1G) CCSID 1200 |
| LTRIM 或 RTRIM 的第二个自变量 | VARCHAR (32740) (如果第一个自变量是字符类型); VARBINARY (32740) (如果第一个自变量是二进制类型); VARGRAPHIC (16370) (如果第一个自变量是图形类型)。 CCSID 取决于第一个自变量的 CCSID。 |
| UPPER , LOWER , UCASE 和 LCASE 的自变量 | DBCLOB (1G) CCSID 1200 |
| MONTHNAME 的第一个自变量 | TIMESTAMP (12) |
| MONTHS_BETWEEN 的第一个或第二个自变量 | TIMESTAMP (12) |
| REGEXP_LIKE , REGEXP_INSTR , REGEXP_SUBSTR , REGEXP_COUNT 和 REGEXP_REPLACE 的第一个操作数 | DBCLOB (1G) CCSID 1200 |
| REGEXP_LIKE , REGEXP_INSTR , REGEXP_SUBSTR , REGEXP_COUNT 和 REGEXP_REPLACE 的第二个操作数 | DBCLOB (32K) CCSID 1200 |
| REGEXP_REPLACE 的第三个操作数 | DBCLOB (32K) CCSID 1200 |
| REGEXP_LIKE , REGEXP_COUNT , REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_REPLACE 的 source-string 操作数 | DBCLOB (32K) CCSID 1200 |
| REGEXP_LIKE , REGEXP_COUNT , REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_REPLACE 的 pattern-expression | DBCLOB (32K) CCSID 1200 |
| REGEXP_REPLACE 的 replacement-string 操作数 | DBCLOB (32K) CCSID 1200 |
| REGEXP_LIKE , REGEXP_COUNT , REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_REPLACE 的 start 操作数 | INTEGER |
| REGEXP_LIKE , REGEXP_COUNT , REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_REPLACE 的 flags 操作数 | VARCHAR (6) |
| REGEXP_INSTR , REGEXP_SUBSTR 和 REGEXP_REPLACE 的 实例 操作数 | INTEGER |
| REGEXP_INSTR 的 return-option 操作数 | INTEGER |
| REGEXP_INSTR 和 REGEXP_SUBSTR 的 group 操作数 | INTEGER |
| SUBSTR (第一个自变量) | DBCLOB (1G) CCSID 1200 |
| SUBSTR (第二个和第三个自变量) | INTEGER |
| TRANSLATE 的第一个自变量 | 错误 |
| TRANSLATE 的第二个和第三个自变量 | VARCHAR (32740) (如果第一个自变量是字符类型); VARGRAPHIC (16370) (如果第一个自变量是图形类型)。 CCSID 取决于第一个自变量的 CCSID。 |
| TRANSLATE 的第四个自变量 | VARCHAR (1) (如果第一个自变量是字符类型); VARGRAPHIC (1) (如果第一个自变量是图形类型)。 CCSID 取决于第一个自变量的 CCSID。 |
| TIMESTAMP 或 TIMESTAMP_ISO 的第一个自变量 | 错误 |
| TIMESTAMP 的第二个自变量 | 时间 |
| TIMESTAMP_FORMAT 的第一个自变量 | VARGRAPHIC (16370) CCSID 1200 |
| VARCHAR_FORMAT 的第一个自变量 | TIMESTAMP (12) |
| TIMESTAMP_FORMAT 或 VARCHAR_FORMAT 的第二个自变量 | 错误 |
| VERIFY_GROUP_FOR_USER 的第一个自变量后的任何自变量 | VARCHAR(128) |
| XMLVALIDATE 的第一个自变量 | XML 5 |
| XMLPARSE 的第一个自变量 | 基于查询选项 SQL_XML_DATA_CCSID 的 CCSID 值的 CLOB (2G) 或 DBCLOB (1G) |
| XMLCOMMENT 的第一个自变量 | 基于查询选项 SQL_XML_DATA_CCSID 的 CCSID 值的 VARCHAR (32740) 或 VARGRAPHIC (16370) |
| XMLTEXT 的第一个自变量 | 基于查询选项 SQL_XML_DATA_CCSID 的 CCSID 值的 VARCHAR (32740) 或 VARGRAPHIC (16370) |
| XMLPI 的第二个自变量 | 基于查询选项 SQL_XML_DATA_CCSID 的 CCSID 值的 VARCHAR (36740) 或 VARGRAPHIC (16370) |
| XMLSERIALIZE 的第一个自变量 | XML 6 |
| XMLDOCUMENT 的所有自变量 | XML 5 |
| XMLCONCAT 的所有自变量 | XML 5 |
| XSLTRANSFORM 的第一个,第二个和第三个自变量 | XML 6 |
| ARRAY 的 数组下标 | BIGINT |
| 一元减号 | DECFLOAT (34) |
| 一元加 | DECFLOAT (34) |
| 所有其他标量函数的所有其他自变量。 | 错误 |
| MEDIAN 的自变量 | DECFLOAT (34) |
| CORRELATION , COVARIANCE , COVARIANCE_SAMP 或任何回归函数的第一个或第二个自变量 | DECFLOAT (34) 如果另一个自变量是 DECFLOAT。 否则,请使用 DOUBLE。 |
| JSON-expression (指定 FORMAT BSON 时) JSON_ARRAYAGG 或 JSON_OBJECTAGG 的自变量 | BLOB (2G) |
| JSON-expression (如果未指定 FORMAT BSON) 或 JSON_ARRAYAGG 或 JSON_OBJECTAGG 的 key-name-expression 自变量 | CLOB (2G) CCSID 1208 |
| LISTAGG 的第二个自变量 | VARCHAR (32740) (如果第一个自变量是字符类型); VARBINARY (32740) (如果第一个自变量是二进制类型); VARGRAPHIC (16370) (如果第一个自变量是图形类型)。 CCSID 取决于第一个自变量的 CCSID。 |
| PERCENTILE_CONT 或PERCENTILE_光盘的表达式的自变量或顺序 | DECFLOAT (34) |
| 所有其他聚集函数的自变量 | 错误 |
| JSON_TABLE 的 JSON-expression 或 sql-json-path-expression 自变量 | CLOB (2G) CCSID 1208 |
| 隐式类型参数标记位置 | 数据类型 |
|---|---|
| 函数的自变量 | 参数的数据类型,如创建函数时所定义 |
| 过程的自变量 | 参数的数据类型,如创建过程时所定义 |
错误检查: 执行 PREPARE 语句时,将解析语句字符串并检查是否存在错误。 如果语句字符串无效,那么不会创建预编译语句并返回错误。
在本地和远程处理中, DLYPREP (*YES) 选项可能导致某些 SQL 语句接收 "延迟" 错误。 例如, DESCRIBE , EXECUTE 和 OPEN 可能会接收到在 PREPARE 处理期间通常出现的 SQLCODE。
引用和执行规则: 可以在以下类型的语句中引用准备好的语句,并显示以下限制:
Statement The prepared statement restrictions
DESCRIBE None
DECLARE CURSOR Must be SELECT when the cursor is opened
EXECUTE Must not be SELECT可以多次执行预编译语句。 如果未多次执行预编译语句并且未包含参数标记,那么使用 EXECUTE IMMEDIATE 语句 (而不是 PREPARE 和 EXECUTE 语句) 更有效。
扩展指示符用法: EXTENDED INDICATOR 子句指示是否在 UPDATE 语句的 SET assignment-clause , INSERT 语句的 VALUES expression-list 中启用扩展指示符变量值。 或 MERGE 语句的插入操作或更新操作。
扩展指示符变量和延迟错误检查: 当启用扩展指示符变量时, UNASSIGNED 指示符变量值会有效地使其目标列从语句中省略。 因此,通常在语句准备期间完成的验证会延迟到语句执行为止。
预编译语句持久性: 在以下情况下将销毁所有预编译语句:7
- 执行 CONNECT (Type 1) 语句。
- DISCONNECT 语句断开与预编译语句相关联的连接。
- 预编译语句与释放暂挂连接相关联,并且发生成功落实。
- SQL 语句的关联作用域 (作业,激活组或程序) 结束。
语句的作用域: statement-name 的作用域是在其中定义该语句的源程序。 只能引用使用 PREPARE 语句预编译的其他 SQL 语句的预编译语句。 例如,从另一个单独编译的程序调用的程序不能使用由调用程序创建的预编译语句。
语句名的作用域也限制为包含该语句的程序正在其中运行的线程。 例如,如果同一程序在同一作业中的两个单独线程中运行,那么第二个线程不能使用由第一个线程准备的语句。
虽然语句的作用域是在其中定义该语句的程序,但从该程序创建的每个程序包都包含预编译语句的单独实例,并且在运行时可以存在多个预编译语句。 例如,假定使用 CONNECT (Type 2) 语句的程序按以下顺序连接到位置 X 和位置 Y:
EXEC SQL CONNECT TO X;
EXEC SQL PREPARE S FROM :hv1;
EXEC SQL EXECUTE S;
.
.
.
EXEC SQL CONNECT TO Y;
EXEC SQL PREPARE S FROM :hv1;
EXEC SQL EXECUTE S;第二次准备 S 在 Y 准备另一个 S 实例。
除非在 CRTSQLxxx 命令上指定了 CLOSQLCSR (*ENDJOB) , CLOSQLCSR (*ENDACTGRP) 或 CLOSQLCSR (*ENDSQL) ,否则只能在程序堆栈中的程序的同一实例中引用预编译语句。
- 如果指定了 CLOSQLCSR (*ENDJOB) ,那么程序堆栈上的任何程序实例 (准备语句) 都可以引用预编译语句。 在这种情况下,在作业结束时将销毁预编译语句。
- 如果指定了 CLOSQLCSR (*ENDSQL) ,那么可由程序堆栈上的任何程序实例 (用于准备语句) 引用预编译语句,直到程序堆栈上的最后一个 SQL 程序结束为止。 在这种情况下,当程序堆栈上的最后一个 SQL 程序结束时,预编译语句将被破坏。
- 如果指定了 CLOSQLCSR (*ENDACTGRP) ,那么在激活组结束之前,准备的语句可由准备该语句的程序中模块的所有实例引用。 在这种情况下,当激活组结束时,将销毁预编译语句。
分配 SQL 描述符: 如果指定了 USING 子句,那么在执行 PREPARE 语句之前,必须使用 ALLOCATE DESCRIPTOR 语句来分配 SQL 描述符。 如果分配的描述符项数小于结果列数,那么将返回警告 (SQLSTATE 01005)。
PREPARE 和 *LIBL: 通常,在准备语句时解析对象的任何非限定名。 因此,在准备语句之后对 CURRENT SCHEMA 或 CURRENT PATH 的任何更改都不会影响执行或打开语句时将引用的对象。 但是,如果使用系统命名,并且使用 *LIBL 隐式限定了对象名,那么将在执行或打开时解析该对象。 在准备语句之后但在执行或打开时间之前对库列表所作的任何更改都将影响执行或打开语句时将引用的对象。
示例
例 1: 在 COBOL 程序中准备并执行一个非选择语句。 假定语句包含在变量 HOLDER 中,并且程序将根据用户的一些指令将语句字符串放入变量中。 要准备的语句没有任何参数标记。
EXEC SQL PREPARE STMT_NAME FROM :HOLDER END-EXEC.
EXEC SQL EXECUTE STMT_NAME END-EXEC.示例 2: 准备和执行非SELECT 语句 (例如 1) ,但假定要准备的语句可以包含任意数目的参数标记。
EXEC SQL PREPARE STMT_NAME FROM :HOLDER END-EXEC.
EXEC SQL EXECUTE STMT_NAME USING DESCRIPTOR :INSERT_DA END-EXEC.假定要准备以下语句:
INSERT INTO DEPARTMENT VALUES(?, ?, ?, ?)要插入名为投诉的部门编号 $TAG1 G01 $TAG2 (没有经理并向部门 $TAG3 A00 $TAG4 报告) ,在执行 EXECUTE 语句之前,结构 INSERT_DA 应具有以下值。


布尔谓词的操作数