我有一张四列的桌子

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/

10-14 15:44
查看更多