在PLSQL中写匿名块自定义异常处理

之前在开发中遇到一个问题,当在PLSQL中使用SELECT INTO,并且表与表之间的关联关系是1..n的时候,会查询出多个结果,而这时候INTO到某一个变量中就会出现异常。某些时候业务逻辑必须这么弄的时候,当这个异常发生后,直接会抛到最外层的异常处理块,导致接下来本想要执行的语句不能执行。这个时候就用到了这个小技巧:
如下:
添加一个匿名块,进行自定义异常处理,当异常发生时(查不到数据或者其他),可以根据业务逻辑进行相应的处理。我这里是查不到数据,所以当异常发生时,我直接将当日入库数量和累积入库数量置为0,这样这个异常发生的时候就不会影响接下来语句的执行。
-- ========== 当日入库数量 ===========
-- ========== 累积入库数量 ===========
--一个成品对应多个物料类别,若有多个,将每个成品的每个物料类别汇总为 当日入库数量
BEGIN
FOR cur_flag IN (SELECT nvl(hmo.completed_flag, 'N') completed_flag,
hmo.make_order_id
FROM *** hmo,
*** hi,
*** ica,
*** hic,
*** lk
WHERE hmo.make_order_id = hmo.top_mo_id
AND hmo.item_id = hi.item_id
AND hmo.plant_id = hi.plant_id
AND ica.plant_id = hi.plant_id
AND ica.item_id = hi.item_id
AND ica.category_id = hic.category_id
AND hic.item_type_code = lk.lookup_code
AND lk.lookup_type_code = 'HPS_CHENGPING'
AND lk.meaning = cur.meaning) LOOP
--当top mo是已完工的时候,当日入库数量=直接汇总 已完工的mo_qty
IF cur_flag.completed_flag = 'Y' THEN
SELECT nvl(SUM(hmo.mo_qty), 0)
INTO ln_day_ware_qty
FROM *** hmo
WHERE hmo.make_order_id = cur_flag.make_order_id
AND hmo.completed_date = p_date;
--累积入库数量 ====当月====
SELECT nvl(SUM(hmo.mo_qty), 0)
INTO ln_month_ware_qty
FROM *** hmo
WHERE hmo.make_order_id = cur_flag.make_order_id
AND hmo.completed_date > to_date(trunc(p_date, 'MM')) --从当月第一天到今天
AND hmo.completed_date <= trunc(p_date, 'DD');
--当top mo未完工的时候, 当日入库数量=mo数量*(部件当日已报工数/部件总数)
ELSIF cur_flag.completed_flag = 'N' THEN
SELECT nvl(SUM(hmo.mo_qty) *
(SUM(mah.trx_qty) / SUM(mah.assembly_id)),
0)
INTO ln_day_ware_qty
FROM *** hmo, *** mah
WHERE hmo.make_order_id = hmo.top_mo_id
AND mah.make_order_id = hmo.make_order_id
AND mah.event_time > p_date - 1 --从前一天 0点到12 点
AND mah.event_time <= p_date
AND hmo.make_order_id = cur_flag.make_order_id;
--累积入库数量 ====当月====
SELECT nvl(SUM(hmo.mo_qty) *
(SUM(mah.trx_qty) / SUM(mah.assembly_id)),
0)
INTO ln_month_ware_qty
FROM *** hmo, *** mah
WHERE hmo.make_order_id = hmo.top_mo_id
AND mah.make_order_id = hmo.make_order_id
AND hmo.make_order_id = cur_flag.make_order_id
AND mah.event_time > to_date(trunc(p_date, 'MM')) --从当月第一天到今天
AND mah.event_time <= trunc(p_date, 'DD');
END IF;
ln_day_sum_qty := ln_day_sum_qty + ln_day_ware_qty;
ln_month_sum_qty := ln_month_sum_qty + ln_month_ware_qty;
END LOOP;
lr_data.day_ware_qty := ln_day_sum_qty;

lr_data.mul_ware_qty := ln_month_sum_qty;
EXCEPTION
WHEN OTHERS THEN
ln_day_ware_qty := 0; --如果发生异常(找不到或其他) 置为0
lr_data.mul_ware_qty := 0;
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值