Quelqu'un peut-il m'aider à comprendre quand utiliser :NEW
et :OLD
dans des blocs PLSQL, je trouve très difficile de comprendre leur utilisation.
Vous utilisez normalement les termes d'un trigger en utilisant :old
pour référencer l'ancienne valeur et :new
pour référencer la nouvelle valeur.
Voici un exemple de la documentation Oracle liée à ci-dessus
CREATE OR REPLACE TRIGGER Print_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :new.sal - :old.sal;
dbms_output.put('Old salary: ' || :old.sal);
dbms_output.put(' New salary: ' || :new.sal);
dbms_output.put_line(' Difference ' || sal_diff);
END;
Dans cet exemple, le déclencheur déclenche BEFORE DELETE OR INSERT OR UPDATE
:old.sal
contient le salaire avant le déclenchement du déclencheur et :new.sal
contiendra la nouvelle valeur.
: New et: Old Value peuvent être différenciés dans les instructions DML.
Insert -: Old = NULL: New = Nouvelle valeur insérée
Update -: Old = Valeur présente dans le tableau avant l'instruction Update déclenchée: New = Nouvelle valeur à mettre à jour
Supprimer -: ancien = valeur avant suppression: nouveau = NULL
: old et: new sont des pseudo-enregistrements faisant référence à des données de niveau ligne lorsqu’un déclencheur de niveau ligne est utilisé.
Pour l'opération ci-dessous, les anciennes et nouvelles valeurs respectives:
Par exemple:
CREATE OR REPLACE TRIGGER get_dept
BEFORE DELETE OR INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT('Old Dept= ' || :OLD.dept|| ', ');
DBMS_OUTPUT.PUT('New Dept= ' || :NEW.dept );
END;
Déclaration de déclenchement:
UPDATE employees
SET dept ='Accounts'
WHERE empno IN (101 ,105);
: new signifie la nouvelle valeur que vous essayez d'insérer:old signifie la valeur existante dans la base de données
: old est votre ancienne valeur:nouveau est votre nouvelle valeur,
il est utilisé beaucoup dans les déclencheurs, par exemple avec les champs Creation_Date & Modified_By
: old et: new sont des pseudo-enregistrements auxquels il est fait référence lors de l'utilisation de déclencheurs au niveau des lignes.
•: old - fait référence à l'ancienne valeur •: new - fait référence à la nouvelle valeur
par exemple:
CREATE OR REPLACE TRIGGER mytrig BEFORE
INSERT OR
UPDATE
ON mytab FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT trunc(sysdate), trunc(sysdate) INTO :new.created, :NEW.last_updated FROM DUAL;
END IF; --INSERTING
IF UPDATING THEN
SELECT trunc(sysdate) INTO :NEW.last_updated FROM DUAL;
END IF; --UPDATING
END;
J'espère que cela explique le concept d'ancien et de nouveau.
: new est la nouvelle valeur - Après le déclenchement du déclencheur, il s'agit de la valeur de la colonne. :nouvelle valeur
New et Old plus pertinents pour l'opération de mise à jour à l'intérieur d'un déclencheur, pour récupérer l'ancienne valeur d'utilisation du champ old et pour la valeur récente