PLSQL :NEW and :OLD

2910

使用するとき、私は理解することができます誰の助け:NEW:OLDPLSQLブロックでは、私はそれは非常に難しいその使用方法を理解するために見つけることです。オラクルplsqlトリガーシェアこの質問を改善するフォローする2018年7月31日23:10に編集martieva13144つのシルバーバッジ10ブロンズバッジ10個2012年10月30日8時37分に 尋ねたプラビン54722つのゴールドバッジ66つのシルバーバッジ1919個のブロンズバッジコメントを追加

13の回答

アクティブ最古投票40

通常、トリガー内の用語を 使用: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が含まれ、新しい値が含まれます。シェアこの答えを改善するフォローする20年12月14日3:03に編集Biplove Lamichhane3,13722つのゴールドバッジ99個のシルバーバッジ2626個のブロンズバッジ2012年10月30日8:49に 回答グラハムA5,5252525個のシルバーバッジ3636個のブロンズバッジ

  • それらは、トリガーが起動される前後の値を表示するのに役立つだけですか、それとも他の使用法ですか? – プラビン2012年 10月30日8:57
  • 3@Pravinの一般的なユースケースは、検証と監査です。上記の例を使用して、要件が従業員の給与履歴を追跡することであると想像してください。この場合、古い給与、変更日、およびユーザー名を履歴テーブルに挿入できます。私がATMで作業しているアプリケーションでは、座標が編集されたときにトリガーを使用してレコードの標高を更新します –  GrahamA 2012年 10月30日9:10 
  • 1また、参照用だけではありません。挿入または更新の前のトリガーで、値を:new値に割り当てることができます。一般的な使用法は、挿入前トリガーのシーケンスからの値を主キーに提供することです。 – トム 2012年10月30日11:30

コメントを追加25

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

更新 – :Old = Updateステートメントの前にテーブルに存在する値トリガー :New =更新する新しい値を指定

削除 – :Old =削除前の値 :New = NULLシェアこの答えを改善するフォローする2016年5月10日12:27に 回答ゴック37544つのシルバーバッジ1111個のブロンズバッジコメントを追加7

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

  • :old-古い値を指します
  • :new-新しい値を指します

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

  1. INSERT – :old.value = NULL、新しい価値=ポスト挿入値
  2. DELETE – :old.value =事前の削除値、新しい値= nullを
  3. UPDATE – :old.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年6月1日15:18に編集アダム4,47866つのゴールドバッジ2727個のシルバーバッジ3434個のブロンズバッジ2016年6月1日13:33に回答ウダイグプタ711シルバーバッジ1個3ブロンズバッジ3個

  • ステートメントがBEFOREではなくAFTERを使用している場合、挿入でOLDがnullになり、削除でNEWがnullになるというこの動作は変わりますか? –  2016年 10月5日13:27にソード
  • @Sawdいいえ、そうではありません。ただし、BEFORE(挿入または更新)トリガーでは、値を変更でき、変更は保存されたレコードに反映されます。 –  GolezTrol 2017年 5月19日14:57 

コメントを追加5

:newは、挿入しようとしている新しい値を意味します:oldは、データベース内の既存の値を意味しますシェアこの答えを改善するフォローする2015年10月22日9:56に 回答アルン・ナス611シルバーバッジ1個4ブロンズバッジ4個コメントを追加2

:oldはあなたの古い値です:newはあなたの新しい値です、

たとえば、Creation_DateフィールドとModified_Byフィールドなどのトリガーで多く使用されますシェアこの答えを改善するフォローする2017年4月11日20:14に 回答ジェルマン76266つのシルバーバッジ1717個のブロンズバッジコメントを追加2

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

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

例えば:

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;

これが新旧の概念を説明することを願っています。シェアこの答えを改善するフォローする18年6月19日17:10に 回答アルジュン314ブロンズバッジ4個コメントを追加1

:newは新しい値です-トリガーが起動された後、これは列の値です:oldは古い値です-トリガーが起動された後、この値は:new値に置き換えられますシェアこの答えを改善するフォローする2018年1月30日20:25に 回答praveen muppala1476ブロンズバッジ6個コメントを追加1

NewとOldは、トリガー内の更新操作、フィールドの古い値の取得、古い値の使用、最近の値の使用に関連性が高いシェアこの答えを改善するフォローする2018年9月30日16:08に 回答sudhirkondle695ブロンズバッジ5個コメントを追加1

簡単に言えば、

データをテーブルに操作すると、トリガーが起動します。したがって、トリガーが呼び出されている間は、両方の値があります。1つは古いデータ値を参照しており、もう1つは最近更新/削除/挿入した新しいデータ値です。の場合には

挿入-古い値はnullになり、新しい値には値が含まれます更新-古いものと新しいものには両方とも値があります削除-古いものには値がありますが、新しいものには値が含まれません。

したがって、:OLDおよび:NEWを使用すると、履歴を保持する他のテーブルを挿入/更新できます。または、:OLDまたは:NEW値に基づいて、他の依存テーブルを挿入/更新できます。

うまくいけば、これはあなたを助けます。シェアこの答えを改善するフォローする19年3月13日15:03に 回答harshkumarsatapara459ブロンズバッジ9個コメントを追加0

:OLDおよび:NEWはタイプRecordの変数であり、列はトリガーが起動されるテーブル行と同じです。これらは、行レベルのトリガーでのみ使用できます。トリガーは事前定義されたイベントで自動的に起動されるため、:OLDと:NEWも自動的に値を取得します。名前が示すように、:OLDはテーブルに存在する完全な行の値を持ち(つまり、更新と削除の場合は既存の値を持ちます)、: NEWはその行の新しい値を持ちます(つまり、更新と削除の場合は行の値を持ちます)挿入)。シェアこの答えを改善するフォローする20年2月18日7:00に 回答パワンラワット44777つのシルバーバッジ2222個のブロンズバッジコメントを追加0

A simple example that shows the use of old and new using triggers

CREATE TABLE emp_log(
emp_id NUMBER;
updated_by DATE,
new_salary VARCHAR2(15),
Action VARCHAR2(20));

CREATE OR REPLACE TRIGGER log_sal 
AFTER UPDATE OF sal on emp
FOR EACH ROW
BEGIN
INSERT INTO emp_log( emp_id, updated_by, new_salary, Action)
VALUES(:NEW.empno, USER, :NEW.sal, 'New salary');
END;
/

シェアこの答えを改善するフォローする20年3月6日5:37に 回答アリャ11ブロンズバッジ1個コメントを追加0

とても簡単です

If Insert :old = NULL and :New = New Inserted Value
If Update  :Old = Value already in the table  :New = Updated Value in the Table
If Delete :Old = Value before deletion :New = NULL

言い換えると

  1. INSERTトリガーの場合、OLDには値が含まれず、NEWには新しい値が含まれます。
  2. UPDATEトリガーの場合、OLDには古い値が含まれ、NEWには新しい値が含まれます。
  3. DELETEトリガーの場合、OLDには古い値が含まれ、NEWには値が含まれません。

例:

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
  UPDATE employees SET
    first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
    last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
  WHERE employee_id = :OLD.employee_id;
END;

シェアこの答えを改善するフォローする20年6月17日6:11に 回答ジオアップ176ブロンズバッジ6個コメントを追加0

:OLD更新後/更新前の作業中に使用できます100%の時間 :NEWは、:OLD古い値に対する(挿入または更新)によって追加された新しい値の記録 です。それらがなければ、トリガーは役に立たないシェアこの答えを改善するフォローする20年12月6日23:59に編集ジャンディル3,29666つのゴールドバッジ2020個のシルバーバッジ3939個のブロンズバッジ20年12月4日22:53に 回答Jobrane Ben Salah12ブロンズバッジ2個コメントを追加

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA