PLSQLブロックでいつ使用するかを理解するのを手伝ってくれる人はいますか?私はそれらの使用法を理解するのが非常に難しいと感じてい:NEW
ます.:OLD
16 に答える
通常、トリガーの用語を 使用:old
して、古い値:new
を参照し、新しい値を参照します。
上記にリンクされているOracleドキュメントの例を次に示します。
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;
この例では、トリガーファイアBEFORE DELETE OR INSERT OR UPDATE
:old.sal
には、トリガーファイア前の給与:new.sal
が含まれ、新しい値が含まれます。
:New と :Old の値は、DML ステートメントで区別できます。
Insert -- :Old = NULL :New = 挿入された新しい値
Update -- :Old = Update ステートメントの前にテーブルに存在する値 Triggered :New = Update に新しい値を与える
削除 -- :Old = 削除前の値 :New = NULL
:old および :new は、行レベル トリガーを使用する場合に行レベル データにアクセスするために参照される疑似レコードです。
- :old - 古い値を参照
- :new - 新しい値を参照
以下の操作では、それぞれの古い値と新しい値:
- INSERT - :old.value= NULL、:new value= 挿入後の値
- DELETE - :old.value= 削除前の値、:new value= null
- UPDATE - :old.value= 更新前の値、:new value= 更新後の値
例えば:
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;
トリガーステートメント:
UPDATE employees
SET dept ='Accounts'
WHERE empno IN (101 ,105);
:old は古い値です。:new は新しい値です。
Creation_Date および Modified_By フィールドなどのトリガーで多く使用されます
トリガー本体内で、:OLD および :NEW キーワードを使用すると、トリガーの影響を受ける行の列にアクセスできます。
:OLD は、更新または削除される前に列の古い値を取得するために使用されます。したがって、OLD は、delete または update ステートメントのトリガーでのみ使用されます。
:NEW は、更新された値またはデータベースに挿入されたばかりの値を取得するために使用されます。したがって、NEW は update ステートメントと insert ステートメントのトリガーでのみ使用されます。