SQL:触发器语法

时间:2012-12-10 15:22:06

标签: sql oracle triggers

我正在做一些课程,我应该创建一个触发器,在创建订单之前检查库存水平,以查看库存中是否有足够的产品来满足订单。问题是讲师没有正确地教我们创建触发器的语法,我的问题是我不知道如何告诉触发器我正在检查的库存表中的哪一行/列。我需要加入桌子吗?

这是我到目前为止的代码(我只是在这里发表它,它不起作用,但是我把它放在这里让你知道我想要的是什么):

CREATE OR REPLACE TRIGGER stock_check
BEFORE INSERT OR UPDATE OF product_quantity ON orderline
FOR EACH ROW
DECLARE
Newtotal number;
insufficient_stock exception;
BEGIN
IF(:NEW.product_quantity > product_stock.stock_quantity) then
raise insufficient_stock;
Else
:new.product_stock.stock_quantity - product_quantity = newtotal
Update stock_quantity
Set product_quantity = newtotal


END IF;
exception
when insufficient_stock then
raise_application_error(-20604,'There is not enoguh stock available');
END;

2 个答案:

答案 0 :(得分:1)

我猜您需要以下内容:

CREATE OR REPLACE TRIGGER stock_check
  BEFORE INSERT ON orderline
  FOR EACH ROW
DECLARE
  oldtotal NUMBER
  newtotal NUMBER;
  insufficient_stock EXCEPTION;
BEGIN
  SELECT stock_quantity INTO old_total
    FROM product_stock
   WHERE product_id = :new.product_id:

  IF(:new.product_quantity > oldtotal) then
     RAISE insufficient_stock;
  ELSE 
    newtotal := oldtotal - :new.product_quantity;        
    UPDATE stock_quantity
       SET product_quantity = newtotal
     WHERE product_id = :new.product_id;
  END IF;
EXCEPTION
  WHEN insufficient_stock THEN
    RAISE_APPLICATION_ERROR(-20604,'There is not enoguh stock available');
END;

您仍然需要为某种product_id添加列。我没有处理UPDATE案件......

答案 1 :(得分:1)

例如:

SQL> create table product_stock (prod_id number, stock_quantity number);

Table created.

SQL> create table orderline (prod_id number, product_quantity number);

Table created.

SQL> insert into product_stock values (1, 1002);

1 row created.

SQL>
SQL> CREATE OR REPLACE TRIGGER stock_check
  2  BEFORE INSERT OR UPDATE OF product_quantity ON orderline
  3  FOR EACH ROW
  4  DECLARE
  5    v_stock_quantity product_stock.prod_id%type;
  6    v_Newtotal number;
  7    insufficient_stock exception;
  8  BEGIN
  9    if updating
 10     then
 11       v_Newtotal := :new.product_quantity - :old.product_quantity;
 12     else
 13             v_Newtotal := :new.product_quantity;
 14     end if;
 15
 16      Update product_stock
 17      Set stock_quantity = stock_quantity - v_Newtotal
 18             where prod_id = :new.prod_id
 19             returning stock_quantity into v_stock_quantity;
 20
 21    IF (v_stock_quantity < 0)
 22    then
 23      raise insufficient_stock;
 24    END IF;
 25  exception
 26    when insufficient_stock then
 27      raise_application_error(-20604,'There is not enoguh stock available');
 28  END;
 29  /

Trigger created.

SQL> show errors
No errors.
SQL> select * from product_stock;

   PROD_ID STOCK_QUANTITY
---------- --------------
         1           1002

SQL> insert into orderline values (1, 1000);

1 row created.

SQL> select * from product_stock;

   PROD_ID STOCK_QUANTITY
---------- --------------
         1              2

SQL> insert into orderline values (1, 3);
insert into orderline values (1, 3)
            *
ERROR at line 1:
ORA-20604: There is not enough stock available
ORA-06512: at "DTD_TRADE.STOCK_CHECK", line 17
ORA-04088: error during execution of trigger 'DTD_TRADE.STOCK_CHECK'


SQL> select * from product_stock;

   PROD_ID STOCK_QUANTITY
---------- --------------
         1              2

首先执行更新以有意创建锁(就好像两个会话一次执行此调用,您希望第二个阻止以避免库存低于0)。