36

PLSQLブロックでいつ使用するかを理解するのを手伝ってくれる人はいますか?私はそれらの使用法を理解するのが非常に難しいと感じてい:NEWます.:OLD

4

16 に答える 16

45

通常、トリガーの用語を 使用: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が含まれ、新しい値が含まれます。

于 2012-10-30T08:49:26.760 に答える
30

:New と :Old の値は、DML ステートメントで区別できます。
Insert -- :Old = NULL :New = 挿入された新しい値

Update -- :Old = Update ステートメントの前にテーブルに存在する値 Triggered :New = Update に新しい値を与える

削除 -- :Old = 削除前の値 :New = NULL

于 2016-05-10T12:27:04.590 に答える
11

:old および :new は、行レベル トリガーを使用する場合に行レベル データにアクセスするために参照される疑似レコードです。

  • :old - 古い値を参照
  • :new - 新しい値を参照

以下の操作では、それぞれの古い値と新しい値:

  1. INSERT - :old.value= NULL、:new value= 挿入後の値
  2. DELETE - :old.value= 削除前の値、:new value= null
  3. 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);
于 2016-06-01T13:33:59.973 に答える
3

:old は古い値です。:new は新しい値です。

Creation_Date および Modified_By フィールドなどのトリガーで多く使用されます

于 2017-04-11T20:14:21.877 に答える
0

トリガー本体内で、:OLD および :NEW キーワードを使用すると、トリガーの影響を受ける行の列にアクセスできます。

:OLD は、更新または削除される前に列の古い値を取得するために使用されます。したがって、OLD は、delete または update ステートメントのトリガーでのみ使用されます。

:NEW は、更新された値またはデータベースに挿入されたばかりの値を取得するために使用されます。したがって、NEW は update ステートメントと insert ステートメントのトリガーでのみ使用されます。

于 2022-01-06T11:04:41.170 に答える