我有一张桌子:
CUST_ID;Bon;Netturnover
1;2;440
1;1;500
2;3;9000
3;1;2500
我创建了一个程序,但它不起作用:
CREATE OR REPLACE PROCEDURE TEST_Proc
(P_ID OUT NUMBER, F1 IN NUMBER, M1 IN NUMBER) AS
BEGIN
SELECT CUST_ID INTO P_ID FROM test WHERE CUST_ID = P_ID
GROUP BY CUST_ID
HAVING SUM(Bon)< F1 AND SUM(Netturnover) > M1;
END TEST_Proc;
EXECUTE TEST_Proc (3,450);
错误讯息:
- ORA-01403:无数据
- ORA-06512:“SYSTEM.TEST_PROC”,#4的地方
- ORA-06512:#9
的地方
有什么问题?
基本上,我想获得这样的信息:
SELECT CUST_ID FROM test
GROUP BY CUST_ID
HAVING SUM(Bon)< 3 AND SUM(Netturnover) > 450;
...只需自动执行程序。
答案 0 :(得分:0)
首先,您只使用两个值进行调用,但需要三个:
declare
p_id number;
begin
p_id := 3;
EXECUTE TEST_Proc (pid, 450, ??);
end;
然后,你的查询真的很奇怪,因为你传回了传入的值。好的,称之为IN OUT
参数。更重要的是,子查询可能会返回 no 行,而您无法处理这些行。
你可以这样做:
CREATE OR REPLACE PROCEDURE TEST_Proc (
in_out_P_ID IN OUT NUMBER,
in_F1 IN NUMBER,
in_M1 IN NUMBER
) AS
BEGIN
SELECT (CASE WHEN SUM(Bon)< in_F1 AND SUM(Netturnover) > in_M1
THEN CUST_ID
END) INTO P_ID
FROM test
WHERE CUST_ID = in_out_P_ID
END TEST_Proc;
请注意,参数名称是前缀的,以帮助避免与列名冲突。