...这个触发器调了一早上还是没有用,实在调不出来了,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;
还有想顺便问下该怎么调试触发器啊?报编译错误我都没法插入,这个触发器就没法执行,在网上看到可以创建过程来调试,可是我这个触发器里有: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;
当它告诉你有错误或警告,你直接 show err就知道了。说实话我没用过plsqldev,不知道它怎么看详细的错误信息。