我有一个表格:
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:"系统。TEST_PROC",#4的地方
- ORA-06512:#9的地方
问题出在哪里?
基本上,我想获得这样的信息:
SELECT CUST_ID FROM test
GROUP BY CUST_ID
HAVING SUM(Bon)< 3 AND SUM(Netturnover) > 450;
。只是自动使用程序。
首先,您只使用两个值进行调用,但需要三个值:
declare
p_id number;
begin
p_id := 3;
EXECUTE TEST_Proc (pid, 450, ??);
end;
然后,您的查询真的很奇怪,因为您正在传回传入的值。 好的,将其称为IN OUT
参数。 更重要的是,子查询可能不返回任何行,并且您不会处理它。
你可以做:
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;
请注意,参数名称带有前缀,以帮助避免与列名称发生冲突。