Oracle 重构PL/SQL

Oracle 重构PL/SQL,oracle,plsql,refactoring,Oracle,Plsql,Refactoring,我在工作中遇到了以下PL/SQL代码(变量已修改): 我认为上述情况相当于以下情况: 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; 不会是一样的吗?。有人能解释一下有什么理由用这个吗

我在工作中遇到了以下PL/SQL代码(变量已修改):

我认为上述情况相当于以下情况:

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;
不会是一样的吗?。有人能解释一下有什么理由用这个吗 原始版本?。 请注意,原始游标是一个50行的查询,因此重构可能会提高其可读性并保持简单

编辑:


为了解决Kevin Burton答案中的问题,我更新了WHERE条件。

如果a.w为null,则不会选择记录

作为

将是

a.w=NULL

正如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;

但是,原始代码可能更有效,因为当i_w不为null时,可以在a.w上使用索引,但当i_w为null时,可以执行一些不同的操作-即,它根据使用的参数调整查询。

谢谢。看起来比NVL()更可读。我检查过了,没有任何可用于a.w.的索引,所以这应该不会是一个问题,除非我们稍后在列上创建索引,我怀疑我们会这样做。@digdugh:原始代码也不必担心绑定变量偷看将基数估计值减少95%。大多数性能问题可能与SQL有关,而不是PL/SQL。在这种情况下,减少一行SQL可能比减少几行PL/SQL要好。另一种选择是使用动态SQL;这可能会简化PL/SQL和SQL,但会引起许多其他问题,必须非常仔细地考虑。@jonearles:谢谢。你能解释一下“绑定变量窥视将基数估计值减少95%”吗?
a.w=NULL
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;