【问题标题】:NO DATA FOUND in loop cursor在循环游标中未找到数据
【发布时间】:2013-07-19 13:54:00
【问题描述】:

在 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;

这段代码有什么问题吗?任何人都可以让我知道更正吗?谢谢!

【问题讨论】:

    标签: loops plsql cursor


    【解决方案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;
    

    分享和享受。

    【讨论】:

    • 嗨,如果我单独运行,我可以从该查询中得到 sum(trn_amount)。我尝试按如下方式打印金额: dbms_output.put_line('amount: ' || amount);我得到如下输出:(如果没有交易销售,它将显示 0,但似乎为空)金额:(空白)
    • Select sum(TRN_AMOUNT) into amount 更改为Select NVL(sum(TRN_AMOUNT), 0) into amount
    【解决方案2】:

    嗨,如果我单独运行,我可以从该查询中得到 sum(trn_amount)。一世 尝试按如下方式打印金额: dbms_output.put_line('amount: ' ||数量);我得到的输出如下:(如果没有交易,则正确 销售额将显示 0 但似乎为空)金额:(空白)

    我猜 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2022-01-18
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多