...这个触发器调了一早上还是没有用,实在调不出来了,pl/sql developer老报编译错误,是不是我的语法有问题?
还有想顺便问下该怎么调试触发器啊?报编译错误我都没法插入,这个触发器就没法执行,在网上看到可以创建过程来调试,可是我这个触发器里有:new这个伪列,似乎不能创建过程...
有这三张表-----------------------库存信息--------------------------
CREATE TABLE WSSSTORAGE(
       MID CHAR(5),
       STOAMOUNT NUMBER(3),
       SELLSUM NUMBER(3),
       PREINPRICE NUMBER(6),
       AVGINPRICE NUMBER(6),
       SELLSUMPRICE NUMBER(10),
       STOID CHAR(2),--该商品所存放仓库的id
       CONSTRAINTS STORAGE_MSTO_PK PRIMARY KEY(MID, STOID)     
);
-----------------库存调拨表--------------------
CREATE TABLE WSSSTORAGEALLOCATE(
       ALLOID CHAR(14),
       ALLODATE DATE,
       STAID CHAR(3),
       OPRTID CHAR(3),
       FROMSTOID CHAR(2),--调出仓库
       TOSTOID CHAR(2),--调入仓库
       CONSTRAINTS STORAGEALLOCATE_ALLOID_PK PRIMARY KEY(ALLOID)
);-------------------库存调拨表详细---------------------
CREATE TABLE WSSSTORAGEALLOCATEDETAIL(
       ALLOID CHAR(14),
       MID CHAR(5),--仓库id
       MAMOUNT NUMBER(3),
       CONSTRAINTS STORAGEALLOCATEDETAIL_ALLOM_PK PRIMARY KEY(ALLOID,MID)
);外键关联没有写上来,我想用触发器实现一个库存调拨的功能,就是把一个仓库的商品放到另外一个仓库里
--定义在库存调拨详表上修改数据时同步更新库存表的触发器
CREATE OR REPLACE TRIGGER WSSSTOALLD_WSSSTO
AFTER INSERT ON WSSSTORAGEALLOCATEDETAIL 
FOR EACH ROW
DECLARE
    V_FROMSTO WSSSTORAGEALLOCATE.FROMSTOID%TYPE;
    V_TOSTO WSSSTORAGEALLOCATE.TOSTOID%TYPE;
    V_MPREINPRICE WSSSTORAGE.PREINPRICE%TYPE;
    V_MAVGINPRICE WSSSTORAGE.AVGINPRICE%TYPE;
BEGIN
      --首先找出调拨商品的调出仓库和调入仓库
      SELECT STOA.FROMSTOID, STOA.TOSTOID
      INTO V_FROMSTO, V_TOSTO
      FROM WSSSTORAGEALLOCATE STOA
      WHERE STOA.ALLOID = :NEW.ALLOID;
      
      --再找出调拨产品的上次进价和成本均价
      --连接条件:库存表产品id与商品id相等且库存表仓库号与商品调出仓库号相等
      --同时连接仓库号是为了保证返回值只有一行
      SELECT STO.PREINPRICE, STO.AVGINPRICE
      INTO V_MPREINPRICE, V_MAVGINPRICE
      FROM WSSSTORAGE STO
      WHERE STO.MID = :NEW.MID AND STO.STOID = V_FROMSTO;
      
      
      --对于调拨的商品,在库存表中找出该商品,调出仓库中数量减少
      --不可能找不到,因为调出商品是从库存中查出来的
      UPDATE WSSSTORAGE STO
             SET STO.STOAMOUNT = STO.STOAMOUNT - :NEW.MAMOUNT
             WHERE STO.STOID = V_FROMSTO AND STO.MID = :NEW.MID;
      
      --对于调拨的商品,在库存表中找出该商品,调入仓库中数量增加
      --可能找不到,因为调入的仓库中可能还不存在这件商品,
      UPDATE WSSSTORAGE STO
             SET STO.STOAMOUNT = STO.STOAMOUNT + :NEW.MAMOUNT
             WHERE STO.STOID = V_TOSTO AND STO.MID = :NEW.MID;       
             --如果没找到,就新建一条记录,
             --注意:新建记录的上次进价和平均进价与调出仓库的相应字段值相同
             IF SQL%NOTFOUND THEN
                INSERT INTO WSSSTORAGE VALUES(
                       :NEW.MID, :NEW.MAMOUNT, 0, V_MPREINPRICE, V_MAVGINPRICE, 0, V_TOSTOID
                );
             END IF;
END;