我有一个函数,我根据传递的变量查询数据,如下所示:
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
答案 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)
希望这可以提供帮助