EXECUTE
EXECUTE 语句执行预编译 SQL 语句。
调用
此语句只能嵌入在应用程序, SQL 函数, SQL 过程或触发器中。 它是无法动态准备的可执行语句。 不得在 Java™中指定该值。
授权
如果在语句中引用了全局变量,那么该语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的全局变量,
- 对全局变量的 READ 特权,以及
- 对包含全局变量的模式的 USAGE 特权
- 数据库管理员权限
授权规则是为 EXECUTE 指定的 SQL 语句定义的那些规则。 例如,对于使用 EXECUTE 执行 INSERT 语句时适用的授权规则,请参阅 INSERT 的描述。
除非在创建程序时在 CRTSQLxxx 命令上指定了 DYNUSRPRF (*OWNER) ,否则该语句的授权标识是运行时授权标识。 更多信息,请参阅授权 ID 和授权名称。
语法
描述
- 语句名
- 标识要执行的预编译语句。 执行 EXECUTE 语句时,该名称必须标识当前服务器上的预编译语句。 预编译语句不能是 SELECT 语句。
- USING
- 引入变量列表,这些变量的值将替换为预编译语句中的参数标记 (问号)。 有关参数标记的说明,请参阅 PREPARE。 如果预编译语句包含参数标记,那么必须使用 USING 子句。 如果没有参数标记,那么将忽略 USING。
- USING ALL 或 USING SUBSET
- 标识主机结构或变量。
- 全部使用
- 列表中的所有变量都用于替换预编译语句中的参数标记。
- 使用 SUBSET
- 列表中的部分或全部变量用于替换预编译语句中的参数标记。
- 将从列表中除去扩展指示符值为 UNASSIGNED 的任何主变量。 结果就像未在语句中指定主变量一样。
- 所有其他指示符值对于 EXECUTE 语句都没有特殊含义。
使用此子句时,指示符值为 UNASSIGNED 的变量不能用于替换预编译语句中的参数标记。
- 变量, ...
- 标识必须根据声明主机结构和变量的规则在程序中声明的一个或多个主机结构或变量。 对主结构的引用将替换为对其每个变量的引用。 变量数必须与预编译语句中的参数标记数相同。 n变量对应于预编译语句中的第 n个参数标记。
仅当当前连接是本地连接 (而不是 DRDA 连接) 时,才能使用全局变量。
- SQL 描述符
- INTO
- 标识包含要与 EXECUTE 语句配合使用的输出变量的有效描述的 SQL 描述符。 此子句仅对 CALL 或 VALUES INTO 语句有效。 在执行 EXECUTE 语句之前,必须使用 ALLOCATE DESCRIPTOR 语句分配描述符。
- LOCAL
- 指定要在程序调用本地的描述符名称的作用域。
- 全局
- 指定要对 SQL 会话为全局的描述符名称的作用域。
- SQL 描述符名称
- 命名 SQL 描述符。 该名称必须标识已存在的具有指定作用域的描述符。
有关 SQL 描述符中信息的说明,请参阅 GET DESCRIPTOR。
- USING
- 标识包含要与 EXECUTE 语句配合使用的输入变量的有效描述的 SQL 描述符。 在执行 EXECUTE 语句之前,必须使用 ALLOCATE DESCRIPTOR 语句分配描述符。
- LOCAL
- 指定要在程序调用本地的描述符名称的作用域。 将从此本地作用域中已知的描述符返回此信息。
- 全局
- 指定要对 SQL 会话为全局的描述符名称的作用域。 该信息是从任何使用同一数据库连接执行的程序已知的描述符返回的。
- SQL 描述符名称
- 命名 SQL 描述符。 该名称必须标识已存在的具有指定作用域的描述符。
有关 SQL 描述符中信息的解释,请参阅 SET DESCRIPTOR。
- DESCRIPTOR 描述符-名称
- 标识必须包含有效变量描述的 SQLDA。
在处理 EXECUTE 语句之前,用户必须在 SQLDA 中设置以下字段。 (REXX 的规则不同。 有关更多信息,请参阅 嵌入式 SQL 编程 主题集合。)
- SQLN ,用于指示 SQLDA 中提供的 SQLVAR 出现次数。
- SQLDABC ,用于指示为 SQLDA 分配的存储量字节数。
- SQLD ,用于指示处理语句时 SQLDA 中使用的变量数。
- SQLVAR 出现以指示变量的属性。
SQLDA 必须有足够的存储空间来包含所有 SQLVAR 实例。 如果结果中存在 LOB 或单值类型,那么每个参数都必须有其他 SQLVAR 条目。 有关 SQLDA 的更多信息,其中包括 SQLVAR 的描述以及有关如何确定 SQLVAR 出现次数的说明,请参阅 确定需要多少 SQLVAR 出现次数。
SQLD 必须设置为大于或等于零且小于或等于 SQLN 的值。 它必须与预编译语句中的参数标记数相同。 SQLDA 描述的 n变量对应于预编译语句中的第 n个参数标记。
请注意, RPG/400® 未提供用于设置指针的函数。 因为 SQLDA 使用指针来查找相应的变量,所以您必须在 RPG/400 应用程序外部设置这些指针。
注意
参数标记替换: 在执行预编译语句之前,语句中的每个参数标记都将有效替换为其相应变量。 替换参数标记是一个赋值操作,其中源是变量的值,目标是数据库管理器中的变量。 对于类型化参数标记,目标变量的属性由 CAST 规范指定。 对于无类型参数标记,根据参数标记的上下文来确定目标变量的属性。 有关影响参数标记的规则,请参阅 表 1。
Let V 表示对应于参数标记 P 的变量。 V 的值将使用分配和比较中描述的存储分配规则分配给 P 的目标变量。 因此:
- V 必须与目标兼容。
- 如果 V 是数字,其整数部分的绝对值不得大于目标整数部分的最大绝对值。
- 如果 V 的属性与目标的属性不同,那么将转换该值以符合目标的属性。
- 如果目标不能包含空值,那么 V 的值不得为空。
但是,与存储分配规则不同:
- 如果 V 是字符串,那么如果其长度大于目标的长度属性,那么该值将被截断 (无错误)。
执行预编译语句时,用于代替 P 的值是 P 的目标变量的值。 例如,如果 V 是 CHAR (6) ,而目标是 CHAR (8) ,那么用 P 代替的值是用两个空格填充的 V 的值。
示例
示例 1: 这个 COBOL 程序部分示例展示了如何准备和执行带有参数标记的 INSERT 语句。
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
77 EMP PIC X(6).
77 PRJ PIC X(6).
77 ACT PIC S9(4) COMP-4.
77 TIM PIC S9(3)V9(2).
01 HOLDER.
49 HOLDER-LENGTH PIC S9(4) COMP-4.
49 HOLDER-VALUE PIC X(80).
EXEC SQL END DECLARE SECTION END-EXEC.
.
.
.
MOVE 70 TO HOLDER-LENGTH.
MOVE "INSERT INTO EMPPROJACT (EMPNO, PROJNO, ACTNO, EMPTIME)
- "VALUES (?, ?, ?, ?)" TO HOLDER-VALUE.
EXEC SQL PREPARE MYINSERT FROM :HOLDER END-EXEC.
IF SQLCODE = 0
PERFORM DO-INSERT THRU END-DO-INSERT
ELSE
PERFORM ERROR-CONDITION.
DO-INSERT.
MOVE "000010" TO EMP.
MOVE "AD3100" TO PRJ.
MOVE 160 TO ACT.
MOVE .50 TO TIM.
EXEC SQL EXECUTE MYINSERT USING :EMP, :PRJ, :ACT, :TIM END-EXEC.
END-DO-INSERT.
.
.
.示例 2: 根据可选文本片段对更新语句进行编码,然后使用应用于所生成语句的主变量来执行该语句。
PRED1HV and PRED1IND, a VARCHAR(50) variable
PRED2HV and PRED2IND, a DECIMAL(10,2) variable根据应用程序设置的选择条件来构建语句。 这是伪码。stmt = 'UPDATE MYTABLE SET STATUS = ''COMPLETE'' WHERE DATECOL = CURRENT DATE ';
IF BUILD_PRED1 THEN
stmt = stmt CONCAT ' AND COL1 = ?';
PRED1HV = <specified value>;
PRED1IND = 0;
ELSE
PRED1IND = -7;
IF BUILD_PRED2 THEN
stmt = stmt CONCAT ' AND COL2 = ?';
PRED2HV = <specified value>;
PRED2IND = 0;
ELSE
PRED2IND = -7;
EXEC SQL PREPARE S1 FROM stmt;以下 EXECUTE 语句可用于生成谓词的任何组合,并将省略任何指示值为-7 的主机变量。
EXEC SQL EXECUTE S1 USING SUBSET :PRED1:PRED1IND, PRED2:PRED2IND;如果PREDIND1的值为-7,则 EXECUTE 语句在逻辑上等同于:
EXEC SQL EXECUTE S1 USING PRED2:PRED2IND;