ORACLE 中的 PL/SQL、IF-ELSE 或 SELECT DECODE 哪个更好

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)

通过解码可以显着减少代码行(对于类似的较大块),但这是更好的方法吗?

XIN*_*ING 5

在 OraclePLSQL块中,有两种类型的引擎工作。第一个SQL引擎和另一个PLSQL引擎。每当你SQLPLSQL块中写入一条语句时,就会发生引擎的切换,这种现象称为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 引擎,并发生上下文切换。所以这个操作会降低性能。