Oracle11g 插入前删除记录的触发器

Oracle11g 插入前删除记录的触发器,oracle11g,sqlplus,toad,Oracle11g,Sqlplus,Toad,我有一个4列的表 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) 触发器应检查是否存在此msisdn9999999已具有此卡号的记录329857285

我有一个4列的表

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
9999999
已具有此卡号的记录
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;
/

不要执行删除和插入操作。您需要
合并
。语句中唯一可以更改的是accountnumber和subscriptiondate。您没有说明数据来自何处,因此我假设这是一个以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)

如果行不存在,则执行插入操作;如果行存在,则更新现有行。

是否需要触发器ar合并可以作为解决方案?另外,到目前为止您尝试了什么?我尝试在msisdn和cardnumber上添加唯一约束,但没有成功(影响应用程序的功能)。如果这是一个触发器,我想我们可以避免将同一卡号的多个条目分配给表中的单个msisdn。数据来自web服务。它检查表格并进行插入。对不起,我对这东西有点初学者。我认为我们不会从Web服务中获得subscriptiondate的任何数据,插入的数据将只有accountnumber、msisdn和cardnumber。因此,假设您正在运行PL/SQL语句,其中p_msisdn、p_cardnumber、p_accountnumber和p_subscriptiondate是参数。如果您没有获取subscriptiondate,您可以将其忽略。请在我从dual中选择p_cardnumber时,它显示无效标识符。是的,我假设这是在一个存储过程中,这些是参数。您不希望在触发器内执行此合并(查找“mutating table”错误)。这将替换您正在执行的任何
insert