Я столкнулся со следующим кодом 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-строчный запрос, поэтому рефакторинг может улучшить его читабельность и сделать его простым.
Редактировать:
Чтобы устранить проблему в ответе Кевина Бертона, я обновилГДЕ состояние.