EXECUTE IMMEDIATE 语句根据字符串形式的 SQL 语句来准备可执行形式的语句,然后执行该 SQL 语句。EXECUTE IMMEDIATE 结合了 PREPARE 和 EXECUTE 语句的基本功能。
授权
授权规则就是为指定的 SQL 语句定义的那些授权规则。
语句的授权标识可能会受 DYNAMICRULES 绑定选项影响。
语法

>>-EXECUTE IMMEDIATE--SQL 表达式----------------------------------->
>--+-----------------------------+------------------------------>
| .-,--. |
| V | |
+-INTO----变量-+----------------+
| .-,----. |
| V | |
'-BULK COLLECT INTO----数组变量-+-'
>--+----------------------------+------------------------------><
| .-,---------------. |
| V .-IN-. | |
'-USING----+-+----+--表达式-+-+-'
+-IN OUT--变量--+
'-OUT--变量-----'
描述
- SQL 表达式
- 这是一个表达式,它返回所要执行的语句字符串。此表达式必须返回长度不超过最大语句大小(2097152 字节)的字符串类型。注意,CLOB(2097152) 可以包含具有最大大小的语句,但 VARCHAR 不能。
语句字符串必须是下列其中一个 SQL 语句:
- ALTER
- CALL
- COMMENT
- COMMIT
- 复合 SQL(编译型)
- 复合 SQL(直接插入型)
- CREATE
- DECLARE GLOBAL TEMPORARY TABLE
- DELETE
- DROP
- EXPLAIN
- FLUSH EVENT MONITOR
- FLUSH PACKAGE CACHE
- GRANT
- INSERT
- LOCK TABLE
- MERGE
- REFRESH TABLE
- RELEASE SAVEPOINT
- RENAME
- REVOKE
- ROLLBACK
- SAVEPOINT
- SELECT(仅当 EXECUTE IMMEDIATE 语句也指定了 BULK COLLECT INTO 子句时)
- SET COMPILATION ENVIRONMENT
- SET CURRENT DECFLOAT ROUNDING MODE
- SET CURRENT DEFAULT TRANSFORM GROUP
- SET CURRENT DEGREE
- SET CURRENT FEDERATED ASYNCHRONY
- SET CURRENT EXPLAIN MODE
- SET CURRENT EXPLAIN SNAPSHOT
- SET CURRENT IMPLICIT XMLPARSE OPTION
- SET CURRENT ISOLATION
- SET CURRENT LOCALE LC_TIME
- SET CURRENT LOCK TIMEOUT
- SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION
- SET CURRENT MDC ROLLOUT MODE
- SET CURRENT OPTIMIZATION PROFILE
- SET CURRENT QUERY OPTIMIZATION
- SET CURRENT REFRESH AGE
- SET CURRENT SQL_CCFLAGS
- SET ROLE(仅当 DYNAMICRULES 运行行为对程序包生效时)
- SET ENCRYPTION PASSWORD
- SET EVENT MONITOR STATE(仅当 DYNAMICRULES 运行行为对程序包生效时)
- SET INTEGRITY
- SET PASSTHRU
- SET PATH
- SET SCHEMA
- SET SERVER OPTION
- SET SESSION AUTHORIZATION
- SET 变量
- TRANSFER OWNERSHIP(仅当 DYNAMICRULES 运行行为对程序包生效时)
- TRUNCATE(仅当 DYNAMICRULES 运行行为对程序包生效时)
- UPDATE
语句字符串不能包含语句终止符,但复合 SQL 语句除外,这些语句可以包含分号(;)来分隔复合块中的语句。复合 SQL 语句是在某些 CREATE 和 ALTER 语句中使用的,因此还可以包含分号。
执行 EXECUTE IMMEDIATE 语句时,将对指定的语句字符串进行解析并检查错误。如果该 SQL 语句无效,那么将不执行该语句,并且将抛出异常。
- INTO 变量
- 指定要从相应参数标记接收输出值的变量的名称。
- BULK COLLECT INTO 数组变量
- 标识一个或多个具有数组数据类型的变量。查询的每一行都按结果集的顺序被指定给每个数组中的元素,并按顺序指定数组下标。
- 如果只指定了一个 数组变量:
- 如果 数组变量 元素的数据类型不是记录类型,那么 SELECT 列表必须正好包含一列,并且该列的数据类型必须可指定给数组元素数据类型。
- 如果 数组变量 元素的数据类型是记录类型,那么 SELECT 列表必须可指定给记录类型。
- 如果指定了多个数组变量:
- 数组变量 元素的数据类型不能是记录类型。
- 对于 SELECT 列表中的每一列,都必须存在一个 数组变量。
- SELECT 列表中每一列的数据类型都必须可指定给相应 数组变量 的数组元素数据类型。
如果 数组变量 的数据类型是普通数组,那么最大基数必须大于或等于查询所返回的行数。仅当 SQL 表达式 是 SELECT 语句时,才能使用此子句。
- USING
- IN 表达式
- 指定要传递给输入参数标记的值。IN 是缺省方式。
- IN OUT 变量
- 指定要向相应参数标记提供输入值或者从相应参数标记接收输出值的变量的名称。使用 INTO 或 BULK COLLECT INTO 子句时,不支持此选项。
- OUT 变量
- 指定从相应参数标记接收输出值的变量的名称。使用 INTO 或 BULK COLLECT INTO 子句时,不支持此选项。
所求值的表达式或变量的数目和顺序必须与
SQL-表达式 中的参数标记数目和顺序匹配,类型也必须兼容。
备注
- 语句高速缓存将影响 EXECUTE IMMEDIATE 语句的行为。
示例
CREATE OR REPLACE PROCEDURE proc1( p1 IN NUMBER, p2 IN OUT NUMBER, p3 OUT NUMBER )
IS
BEGIN
p3 := p1 + 1;
p2 := p2 + 1;
END;
/
EXECUTE IMMEDIATE 'BEGIN proc1( :1, :2, :3 ); END' USING IN p1 + 10, IN OUT p3,
OUT p2;
EXECUTE IMMEDIATE 'BEGIN proc1( :1, :2, :3 ); END' INTO p3, p2 USING p1 + 10, p3;