PLSQL:有条件地应用 IN 运算符检查

PLSQL : Apply IN operator check conditionally

用户输入数字(1、2、3 等)。我的要求是用户输入的号码是否存在于数据库中 table 那么应该只检索那些记录。 如果用户未输入数据,则应检索 table 中的所有记录

用户输入的数字存储在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循环 那么它将不会获取任何记录。

如果用户数据是 null,我可以通过放置条件来编写另一个 FOR 循环。但是,会重复300行 代码。这将增加维护。

我如何调整 FOR 循环,以便在用户输入数据时仅检索该记录,而当用户输入数据时 不输入数据然后检索所有记录?

我想你想要 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));

如果 table 输入没有行,这将 return 外部查询中的所有行。

看起来变量已初始化并填充了空值。检查 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)))
...