PLSQL: применить проверку оператора IN условно - PullRequest
0 голосов
/ 22 февраля 2019

Пользовательские номера ввода (1,2,3 и т. Д.).Мое требование заключается в том, что если пользовательский номер ввода присутствует в таблице базы данных, то должны быть получены только эти записи. Если пользователь НЕ ввел данные, то должны быть извлечены ВСЕ записи из таблицы .

Номера ввода пользователя хранятся в table type, а соответствующий код указан ниже.

CREATE OR REPLACE TYPE ACCNT_NUMBER_TYPE AS TABLE OF NUMBER; // ACCNT_NUMBER_TYPE будет иметь значения 1,2,3 и т. Д.

Ниже приведена моя процедура.

CREATE OR REPLACE PACKAGE BODY pr_retrieve_data as
PROCEDURE FETCH_MYTABLE_DETAILS() is

FOR indx in (select column1,
                    column2
             from   SOMEOTHERTABLE SOT
             WHERE  SOT.ACCNT_NUMBER IN (SELECT * FROM TABLE(L_ACCNT_NUMBER)))
LOOP

...
-- Around 300 lines of code goes here

END LOOP;

end FETCH_MYTABLE_DETAILS;
end pr_retrieve_data;

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу написать логикудля случая, когда пользователь не имеет входных данных.В этом случае я должен восстановить все записи. Но, согласно вышеописанному циклу FOR, если пользователь не вводит данные, он НЕ будет извлекать какие-либо записи.

Я мог бы написать еще один цикл FOR, поставив условие, если данные пользователя равны null.Но будет повторение 300 строк кода.Это увеличит maintenace.

Как я могу настроить цикл FOR таким образом, чтобы, если пользователь вводит данные, то извлекалась только эта запись, а когда пользователь не вводил данные, тогда извлекались бы ВСЕ записи?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Похоже, переменная инициализирована и заполнена нулями.Проверьте, есть ли ненулевые значения в l_accnt_number и создайте условие цикла, как здесь:

... 
procedure fetch_mytable_details() is
  l_accnt_not_null number(6);
begin
  select count(1) 
    into l_accnt_not_null 
    from table(l_accnt_number) 
    where column_value is not null;

  for indx in (select  column1, column2
                 from  someothertable sot
                 where l_accnt_not_null = 0 
                    or sot.accnt_number in (select * from table(l_accnt_number)))
...
0 голосов
/ 22 февраля 2019

Я думаю, что вы хотите not exists:

select column1, column2
from SOMEOTHERTABLE SOT
where SOT.ACCNT_NUMBER in (select * from TABLE(L_ACCNT_NUMBER)) or
      not exists (select 1 from TABLE(L_ACCNT_NUMBER));

Это вернет все строки во внешнем запросе, если в таблице входов нет строк.

...