EXECUTE IMMEDIATE 语句
EXECUTE IMMEDIATE 结合了 PREPARE 和 EXECUTE 语句的基本功能。 它可用于准备和执行既不包含宿主变量也不包含参数标记的SQL语句。
EXECUTE IMMEDIATE 语句:
- 根据SQL语句的字符串形式生成可执行形式
- 执行SQL语句
- 破坏可执行形式
调用 EXECUTE IMMEDIATE
此语句只能嵌入在应用程序中。 这是一个无法动态准备的可执行语句。 Java™中不能指定。
授权 EXECUTE IMMEDIATE
授权规则是为动态准备由EXECUTE IMMEDIATE指定的SQL语句而定义的。 例如,请参阅 INSERT语句 ,了解在使用EXECUTE IMMEDIATE执行INSERT语句时适用的授权规则。
语法 EXECUTE IMMEDIATE
描述 EXECUTE IMMEDIATE
可变
FL 500 对于 PL/I以外的语言,必须指定变量。 它必须根据字符或图形字符串变量的声明规则,确定应用程序中描述的变量。 如果源字符串的长度超过 32KB ,则变量必须是CLOB或DBCLOB变量。 最大源长度为 2MB ,但变量可以声明为大于 2MB。 指示变量不能与宿主变量一起指定。 在汇编语言、C语言、COBOL语言和PL/I语言中,宿主变量必须是一个可变长度的字符串变量。 在C语言中,它不能是NUL字符串。 在SQL PL中,可以使用SQL变量、SQL参数或转换变量,且其值不能为空。
- 字符串表达式
- 字符串表达式是指任何产生字符串的PL/I表达式。 字符串表达式不能以冒号开头。 字符串表达式中包含运算符或函数的变量不应以冒号开头。 当指定字符串表达式时,预编译器生成的字符串表达式结构使用 EBCDIC CCSID,并返回一条信息。
备注 EXECUTE IMMEDIATE
- 语句字符串规则:
已识别的主变量或指定的字符串表达式的值称为语句字符串。
语句字符串必须是以下SQL语句之一,且不能是 select语句 :语句 语句 - ALLOCATE CURSOR
- ALTER
- ASSOCIATE LOCATORS
- COMMENT
- COMMIT
- 创建
- DECLARE GLOBAL TEMPORARY TABLE
- 删除
- DROP
- EXPLAIN
- FREE LOCATOR
- GRANT
- HOLD LOCATOR
- INSERT
- 标签
- LOCK TABLE
- MERGE
- REFRESH TABLE
- RELEASE SAVEPOINT
- RENAME
- REVOKE
- ROLLBACK
- SET 赋值语句
- SAVEPOINT
设置当前加速器
- 设置当前应用程序兼容性
- SET CURRENT DEGREE
- SET CURRENT DECFLOAT ROUNDING MODE
- SET CURRENT DEBUG MODE
- SET CURRENT EXPLAIN MODE
- SET CURRENT LOCALE LC_CTYPE
- SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION
- SET CURRENT OPTIMIZATION HINT
- SET CURRENT PRECISION
- SET CURRENT QUERY ACCELERATION
- SET CURRENT REFRESH AGE
- SET CURRENT ROUTINE VERSION
- SET CURRENT RULES
- SET CURRENT SQLID
- SET ENCRYPTION PASSWORD
- SET PATH
- SET SCHEMA
- SET CURRENT TEMPORAL BUSINESS_TIME
- SET CURRENT TEMPORAL SYSTEM_TIME
- 设置会话时区
- SIGNAL
TRANSFER OWNERSHIP
- TRUNCATE
- UPDATE
语句字符串不得具有以下属性:
- 从EXEC SQL开始
- 以END-EXEC或分号结尾
- 包括对全局变量以外的变量的引用
- 包括参数标记
- 包括过渡表的参考
- 错误和错误处理:
- 执行 EXECUTE IMMEDIATE 语句时,将对指定的语句字符串进行解析并检查错误。 如果SQL语句无效,则不会执行,并且SQLCA中会报告阻止其执行的错误条件。 如果 SQL 语句有效,但在执行过程中发生错误,则该错误条件将在 SQLCA 中报告。
Db2 如果准备好的SQL语句需要花费太多CPU时间才能完成,则可以停止执行该语句。 当发生这种情况时,就会产生错误。 发出该语句的应用程序并未终止,它还可以发出另一个SQL语句。
- 当前解释模式特殊寄存器的效果:
- 如果将当前解释模式特殊寄存器设置为解释,则该语句仅用于解释,不可执行,除非该语句是SET语句。 尝试执行准备好的语句将返回错误。 更多信息请参见当前解释模式特殊寄存器。
- 性能考虑:
- 如果同一个SQL语句要执行多次,使用PREPARE和EXECUTE语句比使用EXECUTE IMMEDIATE语句更有效率。
例子 EXECUTE IMMEDIATE
- 示例 1
- 在这个PL/I示例中,EXECUTE IMMEDIATE语句用于执行DELETE语句,其中要删除的行由PREDS的值指定的搜索条件确定。
EXEC SQL EXECUTE IMMEDIATE 'DELETE FROM DSN8C10.DEPT WHERE' || PREDS; - 示例 2
- 使用C执行主机变量Qstring中的SQL语句。
EXEC SQL INCLUDE SQLCA; void main () { EXEC SQL BEGIN DECLARE SECTION; char Qstring[100] = "INSERT INTO WORK_TABLE SELECT * FROM EMPPROJACT WHERE ACTNO >= 100"; EXEC SQL END DECLARE SECTION; . . . EXEC SQL EXECUTE IMMEDIATE :Qstring; return; }
:
