有人可以解释一下吗?

时间:2014-01-21 13:50:13

标签: plsql oracle11g

我有两张桌子,

  • reorder_table(item_id number,stock_level number) and
  • stock(item_id number,item_desc varchar2(20),stock_level number)

enter image description here

根据此数据PENPENCIL应该需要重新排序,因为他们的库存水平低于重新订购库存值。

我有一个日志表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。不是笔。 为什么会这样?

3 个答案:

答案 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