如何在函数内部使用'IN'来查询动态数据

时间:2016-11-20 12:00:32

标签: sql oracle oracle11g

我有一个函数,我根据传递的变量查询数据,如下所示:

    CREATE OR REPLACE FUNCTION IR.SRG (
       IR_item       IN VARCHAR2,
       IR_comp          VARCHAR2,
       IR_locn          VARCHAR2,
       IR_Type          VARCHAR2,
       IR_fromdate           DATE,
       IR_tilldate           DATE
    )
       RETURN NUMBER
       DETERMINISTIC
    IS
       IR_qty   NUMBER;
    BEGIN

      IF IR_Type = 'O' 
       THEN
            SELECT   SUM(QTY)
              INTO   IR_qty
              FROM   STOCK_LEDGER 
             WHERE                          
          ITEM_CODE = IR_item       AND   
                     LOCATION_CODE IN
                              DECODE(IR_locn,
                                 'ALL',
                                 '('
                                 || '''D2'', ''D4'', ''D5'', ''D11'''
                                 || ')',
                                 '(' || IR_locn || ')')

                     AND DOCUMENTDATE <= IR_TILLDATE
        AND DOCUMENTDATE >= IR_FROMDATE;
       END IF;

  RETURN (NVL (IR_QTY, 0));
EXCEPTION
   WHEN ZERO_DIVIDE
   THEN
      RETURN 0;
END;
/

如果用户为D2参数传递了IR_locn,则应该针对该特定位置运行查询,如果用户通过ALL,则应该针对这四个位置运行查询{ {1}}如指定的那样。

我无法使用D2, D4, D5,D11来实现它,数据不会返回任何记录。

我尝试使用IN运行查询,DUAL子句的格式看起来很好。

IN

我正在使用Select DECODE ('ALL', 'ALL', '(' || '''D2'', ''D4'', ''D5'', ''D11''' || ')', '(' || 'D5' || ')' ) FROM DUAL 运行它,结果如下:

ALL

3 个答案:

答案 0 :(得分:1)

如果问题仍然存在!我刚刚找到了解决问题的方法,你创建了一个Oracle定义的集合。

let buttonNames = ["Button1Name"; "Button2Name"]

let createRadioButton (offset, radioButtons) name = 
    let newRadioButton = new RadioButton(Text=name, Location=new Point(20, offset), Width=350)
    (offset + 20, newRadioButton::radioButtons)

let (_, buttonsReversed) = buttonNames |> List.fold createRadioButton (0, []) 

let buttons = buttonsReversed |> List.rev

解决方案来自以下链接:Oracle PL/SQL - How to create a simple array variable?

答案 1 :(得分:0)

这种逻辑能做你想做的吗?

WHERE ITEM_CODE = IR_item AND 
      DOCUMENTDATE <= IR_TILLDATE AND
      DOCUMENTDATE >= IR_FROMDATE AND
      (LOCATION_CODE = IR_locn OR IR_locn = 'ALL')

答案 2 :(得分:0)

您可以创建一个varchar2变量(All_IR_locn),其中包含if语句结果的字符串:

If IR_locn = 'ALL' then

    All_IR_locn := ''D2','D4','D5','D11'';

Else

   All_IR_locn := IR_locn;

End If;

在您的查询中,您将替换:

DECODE(IR_locn,
                             'ALL',
                             '('
                             || '''D2'', ''D4'', ''D5'', ''D11'''
                             || ')',
                             '(' || IR_locn || ')')

通过

(All_IR_locn)

希望这可以提供帮助