2017-06-02 1 views
2

j'ai une table avec 4 colonnesdéclencheur pour supprimer un enregistrement avant insertion

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

Je veux ajouter un élément déclencheur à cette table. Si les données que je suis d'insertion est

1.99999999 
2.2 
3.3298572857239 
4.(this can be blank) 

et les données qui est actuellement dans le tableau est

1.99999999 
2.1 
3.3298572857239 
4.(this can be blank) 

Trigger doit vérifier s'il y a cette msisdn 99999999 est déjà un record avec ce numéro de carte 3298572857239. Si un enregistrement existe déjà dans la table, le déclencheur doit supprimer l'entrée existante et insérer la nouvelle. Le résultat final devrait ressembler à ceci

1.99999999 
2.1 
3.3298572857239 
4.(this can be blank) 

Je veux garder la valeur de accountnumber identique avant et après le déclenchement. C'est ce que j'ai essayé jusqu'à présent, mais pour ce déclencheur, je ne reçois aucune donnée dans la colonne accountnumber. Veuillez aider quelqu'un

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

Avez-vous besoin d'un déclencheur ar un MERGE pourrait-il être une solution? Aussi, qu'avez-vous essayé jusqu'à présent? – Aleksej

+0

J'ai essayé d'ajouter des contraintes uniques sur msisdn et cardnumber mais cela n'a pas fonctionné (affectant la fonctionnalité de l'application). Si c'est un déclencheur je pensais que nous pouvons éviter plusieurs entrées de même numéro de carte attribué à un seul msisdn dans la table. –

Répondre

5

Ne pas effectuer de suppression et d'insertion. Vous voulez MERGE. La seule chose qui peut changer dans votre déclaration est accountnumber et subscriptiondate. Vous ne dites pas d'où proviennent les données, donc je suppose qu'il s'agit d'une procédure PL/SQL avec p_ * comme paramètres. Donc, vous voulez quelque chose comme ceci:

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) 

Cela fera un insert si la ligne n'existe pas ou mettre à jour une ligne existante si elle le fait.

+0

les données proviennent d'un service Web. il vérifie la TABLEA et fait l'insertion. désolé je suis un petit débutant dans ce genre de choses. et je ne pense pas que nous obtenons des données pour l'abonnement du webservice, l'insertion sera seulement numéro de compte, msisdn et cardnumber. –

+2

Cela suppose donc que vous exécutez une instruction PL/SQL où p_msisdn, p_cardnumber, p_accountnumber et p_subscriptiondate sont les paramètres. Si vous n'êtes pas abonné, vous pouvez simplement laisser tomber. – eaolson

+0

s'il vous plaît quand je choisis p_cardnumber de dual, il indique l'identificateur invalide. –