重构PL/SQL

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条件.

Ton*_*ews 6

正如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时执行不同的操作 - 即它将查询定制为所使用的参数.