我有一张四列的桌子
1.msisdn
2.accountnumber
3.cardnumber
4.subscriptiondate
我想向该表添加一个触发器。如果我要插入的数据是
1.99999999
2.2
3.3298572857239
4.(this can be blank)
并且表中当前的数据是
1.99999999
2.1
3.3298572857239
4.(this can be blank)
触发器应检查是否有此msisdn
99999999
已经使用此卡号3298572857239
进行了记录。如果表中已存在一条记录,则触发器应删除现有条目并插入新条目。最终结果应如下所示1.99999999
2.1
3.3298572857239
4.(this can be blank)
我想在触发之前和之后保持accountnumber的值相同。到目前为止,这是我尝试过的操作,但是对于此触发器,我在accountnumber列中未获取任何数据。请有人帮忙
DROP TRIGGER TRIG_TABLEA;
CREATE OR REPLACE TRIGGER TRIG_TABLEA
BEFORE INSERT ON TABLEA
REFERENCING OLD AS Old NEW AS New
FOR EACH ROW
BEGIN
:new.accountnumber := :old.accountnumber;
DELETE FROM TABLEA WHERE MSISDN = :new.MSISDN AND CARDNUMBER = :new.CARDNUMBER;
:new.MSISDN := :new.MSISDN;
:new.CARDNUMBER := :new.CARDNUMBER;
:new.accountnumber := :old.accountnumber;
END;
/
最佳答案
不要执行删除和插入操作。您要MERGE
。语句中唯一可以更改的是帐号和订阅日期。您没有说数据从哪里来,所以我假设这是一个以p_ *作为参数的PL / SQL过程。所以你想要这样的东西:
MERGE INTO mytable trg
USING ( SELECT p_accountnumber, p_subscriptiondate FROM dual ) src
ON ( trg.msisdn = p_msisdn AND trg.cardnumber )
WHEN NOT MATCHED INSERT ( msisdn, accountnumber, cardnumber, subscriptiondate )
VALUES ( p_msisdn, p_accountnumber, p_cardnumber, p_subscriptiondate )
WHEN MATCHED SET ( cardnumber = p_cardnumber, subscriptiondate = p_subscriptiondate)
如果该行不存在,将执行插入操作;如果存在则更新一个现有行。
关于oracle11g - 插入前触发删除记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44335510/