在ODB11G中创建或替换程序

时间:2017-10-23 11:53:11

标签: sql oracle stored-procedures oracle11g

我有一张桌子:

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;

...只需自动执行程序。

1 个答案:

答案 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;

请注意,参数名称是前缀的,以帮助避免与列名冲突。