没有数据在循环光标中找到

时间:2013-07-19 13:54:01

标签: loops plsql cursor

当我在PLSQL中运行以下代码时,我收到了“找不到数据”错误。

 declare

    v_firm_id number;
    amount number;

    begin

    OPEN MT_CURSOR FOR
    SELECT firm_id
    FROM t_firm;

    LOOP

    FETCH MT_CURSOR INTO v_firm_id;

    EXIT WHEN MT_CURSOR%NOTFOUND;

    Select sum(TRN_AMOUNT) into amount 
    from t_sales
    where FIRM_ID = v_firm_id;

    update t_firm
    set matching_amount = amount
    where firm_id = v_firm_id; 

    END LOOP;


 end;

此代码有什么问题吗?谁能让我知道纠正?谢谢!

2 个答案:

答案 0 :(得分:1)

看来问题是光标返回的公司之一的表T_SALES中没有数据。要处理这个问题,您需要包含NO_DATA_FOUND的处理程序 例外,如果客户没有销售交易,则总销售额设置为零:

declare
  v_firm_id number;
  amount number;

begin
  OPEN MT_CURSOR FOR
    SELECT firm_id
    FROM t_firm;

  LOOP
    FETCH MT_CURSOR INTO v_firm_id;

    EXIT WHEN MT_CURSOR%NOTFOUND;

    BEGIN
      Select sum(TRN_AMOUNT) into amount 
        from t_sales
        where FIRM_ID = v_firm_id;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        AMOUNT := 0;
    END;

    update t_firm
      set matching_amount = amount
      where firm_id = v_firm_id; 

  END LOOP;
end;

分享并享受。

答案 1 :(得分:0)

  

如果我单独运行,我可以从该查询获得总和(trn_amount)。一世   试图按以下方式打印金额:dbms_output.put_line('amount:'   ||量);我得到的输出如下:(如果没有交易,则右转   销售它会显示0,但似乎是空的)金额:(BLANK)

我猜t_firm和t_sales之间没有基于firm_id的匹配。

一个小提示,用SQL语句替换它:

CREATE TABLE t_firm  ( matching_amount NUMBER, firm_id NUMBER );

CREATE TABLE t_sales ( trn_amount NUMBER, firm_id NUMBER );

INSERT INTO  t_firm  VALUES (100, 1);

INSERT INTO  t_sales VALUES (200, 1);

UPDATE  t_firm f
SET     f.matching_amount =
        (
            SELECT sum(s.trn_amount)
            FROM t_sales s
            WHERE f.firm_id = s.firm_id
        )
;

SELECT matching_amount FROM t_firm WHERE firm_id = 1;
-- 200