【问题标题】:PLSQL : Apply IN operator check conditionallyPLSQL:有条件地应用 IN 运算符检查
【发布时间】:2019-07-16 12:33:09
【问题描述】:

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

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

如何调整 FOR 循环,以便如果用户输入数据,则只检索该记录,当用户 不输入数据则检索所有记录?

【问题讨论】:

    标签: sql oracle performance plsql in-operator


    【解决方案1】:

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

    如果输入表没有行,这将返回外部查询中的所有行。

    【讨论】:

    • 它没有用。如果用户没有输入数据,那么在上述not exists 条件下,我没有得到所有记录。
    • 据我所知,您应该。我觉得 Gordon 的查询没问题。
    • @Littlefoot @Gordon :如果变量没有 null 值,我认为此解决方案有效。无论如何,我已经投票了。 @Ponder 提供的解决方案对我有用。
    【解决方案2】:

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

    【讨论】:

    • 是的,你猜对了。变量已初始化并用null 填充。可能这就是@Gordon 提供的解决方案不起作用的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多