在循环游标中未找到数据
Posted
技术标签:
【中文标题】在循环游标中未找到数据【英文标题】: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;
这段代码有什么问题吗?任何人都可以让我知道更正吗?谢谢!
【问题讨论】:
【参考方案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
【讨论】:
以上是关于在循环游标中未找到数据的主要内容,如果未能解决你的问题,请参考以下文章