在 ODB11G 中创建或替换过程



我有一个表格:

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;

请注意,参数名称带有前缀,以帮助避免与列名称发生冲突。

最新更新