Как обрабатывать необязательные параметры в запросе SQL?

Допустим, у меня есть образец таблицы:

 id_pk  value
------------
 1       a
 2       b
 3       c

И у меня есть образец блока PL / SQL, в котором есть запрос, который в настоящий момент выбирает одну строку в массив:

declare

  type t_table is table of myTable%rowtype;

  n_RequiredId myTable.id_pk%type := 1;  
  t_Output t_table := t_table();

begin

  select m.id_pk, m.value
    bulk collect into t_Output
    from myTable m 
   where m.id_pk = n_RequiredId;

end;

Мне нужно реализовать возможность для выбора одной строки в массиве, как показано в блоке выше, ИЛИ для выбора всех строк в массив, если n_RequiredID , который на самом деле является параметром ввода пользователя, установить на ноль .

И вопрос в том, как лучше всего справиться с такой ситуацией?

Я могу придумать, как изменить предложение where моего запроса на что-то вроде этого:

where m.id_pk = nvl(n_RequiredId, m.id_pk);

но я полагаю, что это будет чтобы замедлить запрос, если параметр не будет нулевым, и я помню, что Кайт сказал что-то очень плохое об этом подходе.

Я также могу подумать о реализации следующей логики PL / SQL:

if n_RequiredId is null then 

  select m.id_pk, m.value bulk collect into t_Output from myTable m;

else

  select m.id_pk, m.value bulk collect
    into t_Output
    from myTable m
   where m.id_pk = n_RequiredId;

end if;

Но это станет слишком сложным, если я столкнусь с более чем одним параметром такого типа.

Что вы мне посоветуете?

7
задан Kirill Leontev 6 September 2010 в 04:39
поделиться