рефакторинг PL / SQL - PullRequest
       35

рефакторинг PL / SQL

2 голосов
/ 16 августа 2011

Я столкнулся со следующим кодом 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;

Я думаю, что вышеупомянутое эквивалентно следующему:

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-строчный запрос, поэтому рефакторинг может улучшить его читабельность и сделать его простым.

Редактировать:

Чтобы устранить проблему в ответе Кевина Бертона, я обновилГДЕ состояние.

Ответы [ 2 ]

6 голосов
/ 16 августа 2011

Как сказал Кевин Бертон, ваш новый запрос не эквивалентен. Это все же:

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;

Однако оригинальный код может быть более эффективным, поскольку может использовать индекс для a.w, когда i_w не равен нулю, но делает что-то другое, когда он равен нулю - то есть он адаптирует запрос к используемым параметрам.

1 голос
/ 16 августа 2011

если aw равен нулю, вы не выберете записи

, так как

a.w=NVL(i_w,a.w); 

будет

a.w=NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...