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.

Les bonnes réponses fournis, les plus grandes questions (la mutation de table d'exception ("chaque ligne" trigger qui n'est pas autorisé à sélectionner à partir de la table), probablement le souhaitez, APRÈS déclencheur INSERT OU UPDATE. Il y a aussi quelques cas de coin à considérer la manutention, telles que la mise à jour de orig_tab.pk ne voulez probablement pas à laisser des "vieux" de ligne dans le tableau); ou si la ligne existe déjà dans la déclaration de la table lors de la correspondance de la ligne est insérée à orig_tab.

OriginalL'auteur Jaanna | 2012-06-21