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 变量字符串表达式

描述 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; 
  }

: