dig*_*dug 2 oracle refactoring plsql
我在工作中遇到了以下PL/SQL代码(变量已修改):
PROCEDURE test(i_w IN a.w%type,o_result IN OUT resu_cur_type) IS
BEGIN
IF i_w IS NULL THEN
open o_result for SELECT a.x, b.y FROM a,b WHERE a.z=b.z;
ELSE
open o_result for SELECT a.x, b.y FROM a,b WHERE a.z=b.z AND a.w=i_w;
END IF;
END test;
Run Code Online (Sandbox Code Playgroud)
我认为上述内容相当于以下内容:
PROCEDURE test(i_w IN a.w%type,o_result IN OUT resu_cur_type) IS
BEGIN
open o_result for SELECT a.x, b.y FROM a,b WHERE a.z=b.z AND NVL(a.w,1)=NVL(NVL(i_w,a.w),1);
END test;
Run Code Online (Sandbox Code Playgroud)
不一样吗?有人可以解释是否有任何理由使用原始版本?请注意,原始游标是一个50行查询,因此重构可能会提高其可读性并保持简单.
编辑:
为了解决Kevin Burton的答案中的问题,我更新了WHERE条件.
正如Kevin Burton所说,你的新查询并不等同.这是:
PROCEDURE test(i_w IN a.w%type,o_result IN OUT resu_cur_type) IS
BEGIN
open o_result for SELECT a.x, b.y FROM a,b
WHERE a.z=b.z
AND (i_w IS NULL OR a.w=i_w);
END test;
Run Code Online (Sandbox Code Playgroud)
但是,原始代码可能更有效,因为当i_w不为null时可以在aw上使用索引但是当它为null时执行不同的操作 - 即它将查询定制为所使用的参数.
归档时间: |
|
查看次数: |
241 次 |
最近记录: |