2017-06-02 4 views
2

Ich habe eine Tabelle mit 4 SpaltenTrigger einen Datensatz vor dem Einsetzen löschen

1.msisdn 
2.accountnumber 
3.cardnumber 
4.subscriptiondate 

ich einen Auslöser zu dieser Tabelle hinzugefügt werden soll. Wenn die Daten i Einfügen ist, sind

1.99999999 
2.2 
3.3298572857239 
4.(this can be blank) 

und die Daten, die aktuell in der Tabelle sind

1.99999999 
2.1 
3.3298572857239 
4.(this can be blank) 

Auslöser überprüfen sollten, ob dies msisdn ist 99999999 bereits 3298572857239 einen Datensatz mit dieser Kartennummer hat. Wenn in der Tabelle bereits ein Datensatz vorhanden ist, sollte der Trigger den vorhandenen Eintrag löschen und den neuen Eintrag einfügen. Das Endergebnis sollte so aussehen:

Ich möchte den Wert von accountnumber gleich vor und nach dem Trigger halten. Dies habe ich bisher versucht, aber für diesen Trigger bekomme ich keine Daten in der Spalte accountnumber. Bitte jemand helfen

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

Brauchen Sie einen Auslöser ar könnte eine MERGE eine Lösung sein? Was hast du bisher versucht? – Aleksej

+0

Ich habe versucht, einzigartige Einschränkungen auf msisdn und cardnumber hinzuzufügen, aber es hat nicht funktioniert (was die Funktionalität der App beeinflusst). Wenn es ein Auslöser ist, dachte ich, wir können mehrere Einträge derselben Kartennummer vermeiden, die einem einzelnen Geld in der Tabelle zugewiesen sind. –

Antwort

5

Tun Sie nicht eine Löschung-und-einfügen. Sie wollen MERGE. Die einzige Sache, die sich in Ihrer Aussage ändern kann, ist accountnumber und subscriptiondate. Sie sagen nicht, woher die Daten kommen, also nehme ich an, das ist eine PL/SQL-Prozedur mit p_ * als Parameter. Sie wollen also so etwas wie dieses:

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) 

Dies wird einen Einsatz tun, wenn die Zeile nicht vorhanden ist oder eine vorhandene Zeile aktualisieren, wenn es funktioniert.

+0

Die Daten stammen von einem Webdienst. Es überprüft die TABLEA und führt die Einfügung durch. Entschuldigung, ich bin ein kleiner Anfänger in diesem Zeug. und ich denke nicht, dass wir irgendwelche daten für das abonnementdatum vom webservice bekommen, die einfügung wird nur accountnumber, msisdn und cardnumber sein. –

+2

Dies setzt voraus, dass Sie eine PL/SQL-Anweisung ausführen, wobei p_msisdn, p_cardnumber, p_accountnumber und p_subscriptiondate die Parameter sind. Wenn Sie kein Abonnement erhalten, können Sie es einfach weglassen. – eaolson

+0

bitte, wenn ich p_cardnumber aus Dual wählen, sagt es ungültige Kennung. –

Verwandte Themen