触发器实例收藏
/*DROP TABLE KUCUN;
DROP TABLE WUZI;*/
--创建表 库存表
CREATE TABLE KUCUN(
GOODSID NUMBER(10), --货物
PURCHASETIME DATE,--进货时间
PRICE NUMBER(20,4) --货物单价
);
/
--创建表 物资表 (被更新的主表)
CREATE TABLE WUZI(
GOODSID NUMBER(10), --货物
PRICE NUMBER(20,4) --货物单价
);
/
--生成测试数据
BEGIN
FOR I IN 1..10 LOOP
INSERT INTO KUCUN VALUES(I,SYSDATE - NUMTODSINTERVAL(I,'HOUR'),I+I*0.1);
END LOOP;
COMMIT;
END;
/
SELECT * FROM KUCUN;
--生成测试数据
BEGIN
FOR I IN 1..10 LOOP
INSERT INTO WUZI VALUES(I,I);
END LOOP;
COMMIT WORK;
END;
/
SELECT * FROM WUZI;
--触发器,写入一条心的GOODSID为1的信息,然后更新主表,创建触发器
CREATE OR REPLACE TRIGGER TRI_KUCUN
--在插入之前
BEFORE INSERT OR UPDATE ON KUCUN
FOR EACH ROW
DECLARE
N_PRICE KUCUN.PRICE%TYPE;
BEGIN
--得到插入数据之前的最早的价格
--比如本次插入的是13,但是实际上查出来的是1-10的GOODSID日期最小的价格,而不是1-10包含13
BEGIN
SELECT DISTINCT FIRST_VALUE(T.PRICE) OVER(PARTITION BY T.GOODSID ORDER BY T.PURCHASETIME)
INTO N_PRICE
FROM KUCUN T
WHERE T.GOODSID = :NEW.GOODSID;
EXCEPTION
--处理NO_DATA_FOUND异常
--用于处理那种,先进先出,但是进去的已经被处理掉了的情况,即所有的库存表中的记录都已经被更新到物资表中
WHEN NO_DATA_FOUND THEN
N_PRICE:=:NEW.PRICE;
END;
--更新物资表的GOODSID的价格
UPDATE WUZI
SET WUZI.PRICE = N_PRICE
WHERE WUZI.GOODSID = :NEW.GOODSID;
--如果物资表的GOODSID不存在的话,则插入
IF SQL%ROWCOUNT <1 THEN
INSERT INTO WUZI(GOODSID,PRICE) VALUES(:NEW.GOODSID,N_PRICE);
END IF;
END;
/
--测试数据
--插入GOODSID为1,PRICE为100,应该更新为1.1
INSERT INTO KUCUN VALUES(1,SYSDATE,100);
SELECT * FROM WUZI;
--插入GOODSID为13,PRICE为100,应该插入一条新的为100
INSERT INTO KUCUN VALUES(13,SYSDATE,100);
SELECT * FROM WUZI;
与你共亲到无可亲密时,便知友谊万岁是尽头。

浙公网安备 33010602011771号