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)))
...
用户输入数字(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)))
...