2017-06-02 142 views
2

之前刪除記錄我有一個表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 99999999已經有這個cardnumber 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; 
/
+0

你需要一個觸發器嗎一個MERGE可以成爲一個解決方案嗎?另外,你到目前爲止嘗試過什麼? – Aleksej

+0

我試着在msisdn和cardnumber上添加獨特的約束,但它不起作用(影響應用程序的功能)。如果它的觸發器我認爲我們可以避免分配給表中單個msisdn的同一個cardnumber的多個條目。 –

回答

5

不要做刪除和插入。你需要MERGE。唯一可以改變的是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) 

這將執行插入如果該行不存在,或者如果它更新現有的行。

+0

數據來自Web服務。它檢查TABLEA並執行插入操作。對不起,我是這個東西的一個小初學者。我不認爲我們從webservice獲取任何subscriptiondate的數據,插入將只有accountnumber,msisdn和cardnumber。 –

+2

因此,這假定您正在運行PL/SQL語句,其中p_msisdn,p_cardnumber,p_accountnumber和p_subscriptiondate是參數。如果您沒有收到訂閱日期,則可以將其忽略。 – eaolson

+0

請當我從雙重選擇p_cardnumber時,它表示無效標識符。 –