PLSQL Déclencheur pour mettre à jour la valeur du champ d'une autre table
Je suis tout à fait nouveau pour les déclencheurs alors, évidemment, je suis en train de faire quelque chose de mal, quelque part. Je suis en train de travailler sur un rapport de tableau qui permettra de récupérer les données dans les tables d'origine. Pour simplifier, disons qu'il y a une table et puis il y a un tableau des rapports.
Table d'origine (orig_tab)
CREATE TABLE orig_tab (
PK NUMBER(8) not null,
NAME VARCHAR2(20) ,
);
INSERT INTO orig_tab (PK, NAME) VALUES (1, 'AAA');
INSERT INTO orig_tab (PK, NAME) VALUES (2, 'BBB');
INSERT INTO orig_tab (PK, NAME) VALUES (3, 'CCC');
Puis il y a les rapports de la table (rep_tab)
CREATE TABLE rep_tab (
PK NUMBER(8) not null,
NAME VARCHAR2(20) ,
);
Maintenant de l'interface utilisateur, quelqu'un change la valeur de l'enregistrement 2. Évidemment, cela doit être traité comme un insert (parce que ce dossier n'existe pas) pour l'établissement des rapports tableau. Puis, après quelque temps, la valeur est modifiée de sorte qu'il est une mise à jour de cas pour la déclaration de la table.
Question: Comment puis-je faire de cette sorte de déclencheur? Je suppose que c'est une fusion statemement cas.
C'est ce que j'ai fait:
create or replace trigger vr_reporting_trigger
after update on orig_tab
for each row
begin
MERGE INTO rep_tab d
USING (SELECT pk FROM orig_tab) s
ON (d.pk = s.pk)
WHEN MATCHED THEN
UPDATE SET d.pk = s.pk,
d.name = s.name
WHEN NOT MATCHED THEN
INSERT (d.pk, d.name) VALUES (s.pk, s.name);
end vr_reporting_trigger;
Des suggestions ou des recommandations qui peuvent m'aider à comprendre? Merci.
OriginalL'auteur Jaanna | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Il y a quelques cas particuliers qui ne sont pas gérées dans les réponses précédentes.
Que si un correspondant pk existe déjà dans le tableau, lorsqu'une ligne est insérée. (Nous n'aurions pas normalement s'attendre à ce que cela arrive, mais considérer ce qui se passerait si quelqu'un a supprimé une ligne de la orig_tab, puis inséré à nouveau. (C'est le genre de problème qui va des cultures dans la production, pas de test, au plus mauvais moment. Mieux planifier maintenant.)
OriginalL'auteur spencer7593
De fusion déclaration sonne comme un plan, sauf que le trigger ne se déclenche pas lorsque vous faites de la première insertion parce que vous avez mentionné, c'est l'un APRÈS déclencheur de mise à JOUR, pas APRÈS déclencheur d'INSERTION.
Aussi, le
SELECT pk FROM orig_tab
entraînera La mutation de la table de problème.Meilleure façon serait de définir un APRÈS l'INSERTION OU la mise à JOUR de déclenchement, les combiner avec d'INSERTION/mise à JOUR des mots clés pour gérer les insertions, mises à jour & utiliser
:new
/:old
pour traiter de nouvelles données & les anciennes données, respectivement.vous pouvez vérifier la présence de l'enregistrement & insert, si il n'est pas présent
elsif mise à jour alors si rep_tab.pk <> :vieux.pk ensuite l'INSÉRER DANS rep_tab (pk,nom) values (:NOUVEAU.pk, :NEW.nom); d'autre mise à JOUR rep_tab r SET nom = :NEW.nom OÙ r.pk = :vieux.pk; endif; ne fonctionne pas
re, vous ne pouvez pas se référer à un enregistrement de la table en utilisant simplement
tablename.columnname
OriginalL'auteur Sathyajith Bhat
C'est une Extension de
Sathya Answer
commeJaanna
demandé si l'enregistrement est mise à jour en orrig_tab et aucun enregistrement correspondant dans rep_tab ensuite, le dessous de la logique de satisfaire la demande ci-dessous .Merci de ne pas me juger avec cette réponse que cette solution appartient à Sathyasur l'INSERT (lorsqu'il n'est pas assortie), ne pourrait-il pas être
VALUES (:new.PK, :new.name)
? Et sur la mise à JOUR (quand a égalé) devrait pas êtred.name = :new.name
? Est-ce à gérer le cas lorsque la valeur du pk colonne est mis à jour?votre commentaire doit avoir été sur ma réponse, je n'ai pas reçu la notification. Aussi, ne pas ajouter des points-virgules pour le nom. Cela dit, cela semble très bien.
OriginalL'auteur Gaurav Soni