我有两张桌子,
reorder_table(item_id number,stock_level number) and
stock(item_id number,item_desc varchar2(20),stock_level number)
根据此数据PEN
和PENCIL
应该需要重新排序,因为他们的库存水平低于重新订购库存值。
我有一个日志表sql_errors
,用于记录需要重新排序的项目。这是我的代码
DECLARE
out_of_stock EXCEPTION;
v_item VARCHAR2(20);
CURSOR inv_cur
IS
SELECT a.item_id,
b.item_desc,
a.stock_level reorder_level,
b.stock_level stock_level
FROM reorder_level a,
stock b
WHERE a.item_id=b.item_id ;
BEGIN
BEGIN -- sub block
FOR c IN inv_cur
LOOP
IF c.reorder_level > c.stock_level THEN
v_item :=c.item_desc;
raise out_of_stock;
END IF;
END LOOP;
EXCEPTION
WHEN out_of_stock THEN
INSERT INTO sql_errors VALUES
('Item '||v_item|| ' Is out of Stock');
END; -- sub block ends
END;
我编写了内部块,以便即使在引发异常后仍继续执行并记录需要重新排序的所有项目。但是在日志表中只记录了项PENCIL
。不是笔。
为什么会这样?
答案 0 :(得分:1)
当您检测到某件商品缺货时,为什么使用例外而不是仅执行插入?
if c.reorder_level > c.stock_level then
v_item :=c.item_desc;
insert into sql_errors
values ('Item '||v_item|| ' Is out of Stock');
end if;
答案 1 :(得分:1)
您可以看到RAISE
将向控件发送它所在的EXCEPTION
块。执行后,块完成。在您的情况下,LOOP
被写入子块本身,因此在Exception
上,控件在第一个异常之后离开子块。
我已将您的子块移动到LOOP
内的子块,如下所示。
DECLARE
out_of_stock EXCEPTION;
v_item VARCHAR2(20);
CURSOR inv_cur
IS
SELECT a.item_id,
b.item_desc,
a.stock_level reorder_level,
b.stock_level stock_level
FROM reorder_level a,
stock b
WHERE a.item_id=b.item_id ;
BEGIN
FOR c IN inv_cur
LOOP
BEGIN -- sub block
IF c.reorder_level > c.stock_level THEN
v_item :=c.item_desc;
raise out_of_stock; /* goes to the exception block */
END IF;
EXCEPTION
WHEN out_of_stock THEN
INSERT INTO sql_errors VALUES
('Item '||v_item|| ' Is out of Stock');
END; -- sub block ends
/* Loop Continues! */
END LOOP;
END;
/
答案 2 :(得分:0)
insert into sql_errors
select 'Item '||b.item_desc|| ' Is out of Stock'
from reorder_level a, stock b
where a.item_id = b.item_id and a.stock_level > b.stock_level