首批通过分布式安全可靠测评,为关键业务系统打造
plsql_can_transform_sql_to_assign
更新时间:2026-06-25 15:50:07
说明
对于 V4.4.X 版本,该变量从 V4.4.2 版本开始引入。
对于 V4.6.X 版本,该变量从 V4.6.0 版本开始引入。
plsql_can_transform_sql_to_assign 用于控制 PL 内的 select into from dual 是否允许被改写为 assign 语句。
权限要求
查询变量
sys租户和所有用户租户均可以使用SHOW VARIABLES语句或视图SYS.TENANT_VIRTUAL_SESSION_VARIABLE(Oracle 模式)及视图information_schema.SESSION_VARIABLES(MySQL 模式)查看 Session 系统变量的值。修改变量
sys租户和所有用户租户均可以直接修改本租户的 Session 系统变量的值。
属性说明
| 属性 | 描述 |
|---|---|
| 参数类型 | Bool |
| 默认值 | OFF |
| 取值范围 | ON/OFF |
| 是否可修改 | 是,支持通过 SET 语句修改。 |
| 是否重启 OBServer 节点生效 | 否,设置后立即生效。 |
使用说明
该变量控制 PL 内的 select into from dual 是否允许被改写为 assign 语句。默认为 OFF 表示不会做改写。当变量为 ON 时,内核会尝试自动改写,改写成功后预期会提高执行性能。由于改写会修改 PL 的语句组成,造成优化前后编译生成的产物不一致,因此该变量会影响 PL cache 的匹配。
使用示例
执行如下命令,关闭 plsql_can_transform_sql_to_assign 变量:
obclient> SET plsql_can_transform_sql_to_assign = OFF;
执行如下命令,创建一个名为 func 的存储函数:
obclient> create or replace function func(a int) return int is
x int;
begin
select a into x from dual;
return x;
end;
/
调用 func 存储函数,发现耗时 9.147 秒:
obclient> SELECT func(level) FROM dual connect by level < 10000;
cost : 9999 rows in set (9.147 sec)
执行如下命令,开启 plsql_can_transform_sql_to_assign 变量:
obclient> SET plsql_can_transform_sql_to_assign = ON;
再次调用 func 存储函数,发现耗时 1.445 秒:
obclient> select func(level) from dual connect by level < 10000;
cost : 9999 rows in set (1.445 sec)
开启优化后,性能显著提升。