Joh*_*ohn 3 sql oracle plsql oracle12c
我正在考虑将 if 块转换为我的 pl/sql 函数中的解码。由于我们不能直接在 pl/sql 中使用decode,因此计划是使用“selectdecode()tovariablefromdual”。现有的 if 块如下:
if var1 = 'a' then
var2 := 'x';
elseif var1 = 'b' then
var2 := 'y';
else
var2 := 'z';
end if;
Run Code Online (Sandbox Code Playgroud)
替换解码可以是:
select decode(var1,'a','x','b','y','z') into var2 from dual;
Run Code Online (Sandbox Code Playgroud)
通过解码可以显着减少代码行(对于类似的较大块),但这是更好的方法吗?
在 OraclePLSQL
块中,有两种类型的引擎工作。第一个SQL
引擎和另一个PLSQL
引擎。每当你SQL
在PLSQL
块中写入一条语句时,就会发生引擎的切换,这种现象称为Context
切换。上下文切换越多,应用程序的性能就越差。
当你这样做时:
if var1 = 'a' then
var2 := 'x';
elseif var1 = 'b' then
var2 := 'y';
else
var2 := 'z';
end if;
Run Code Online (Sandbox Code Playgroud)
该语句在引擎中进行计算PLSQL
,并且不会发生上下文切换。但是当你这样做时:
begin
select decode(var1,'a','x','b','y','z') into var2 from dual;
end;
Run Code Online (Sandbox Code Playgroud)
PLSQL
引擎将控制权更改为 SQL 引擎,并发生上下文切换。所以这个操作会降低性能。