programing

PLSQL : 신규 및 :늙은

telebox 2023. 3. 13. 20:22
반응형

PLSQL : 신규 및 :늙은

언제 사용해야 하는지 아는 사람 있나요?:NEW ★★★★★★★★★★★★★★★★★」:OLDPLSQL の pl pl pl pl pl pl 。

일반적으로 트리거의 항을 사용합니다.: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 Value DML 스테이트먼트
삽입 --: 이전 = NULL: 새로 만들기 = 새 값을 삽입했습니다.

Update --:Update 문 트리거됨:New = 업데이트할 새 값 이전 테이블에 있는 값

삭제 --:이전 = 삭제 전 값:새로 만들기 = NULL

:old 및 :new는 행 레벨트리거를 사용할 때 액세스행 레벨 데이터를 참조하는 의사 코드입니다.

  • : old - 오래된 값을 나타냅니다.
  • : new - 새로운 값을 나타냅니다.

아래 연산의 경우 각 이전 및 새 값:

  1. INSERT-:old.value=NULL,:new value=post insert 값
  2. DELETE-:old.value= 사전 삭제 값,:new value=null
  3. UPDATE-:old.value= 사전 업데이트 값,:new value=Post Update 값

예:

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);

:new는 삽입하려는 새 값을 의미합니다.old는 데이터베이스 내의 기존 값을 의미합니다.

: old는 오래된 값입니다.new는 새로운 값입니다.

예를 들어 Creation_Date 및 Modified_By 필드에서 트리거로 많이 사용됩니다.

: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;

이것이 신구 개념을 설명해 주길 바란다.

:new는 새로운 값입니다.트리거 실행 후 컬럼의 값입니다.old는 오래된 값입니다.트리거 실행 후 이 값은 :new 값으로 대체됩니다.

New 및 Old는 트리거 내의 업데이트 작업과 더 관련이 있으며 필드 use old 및 최근 값 use new의 이전 값을 가져옵니다.

간단하게 말하면

데이터를 테이블로 조작하면 트리거가 실행됩니다.트리거 호출 중에는 두 가지 값이 모두 표시됩니다.하나는 오래된 데이터 값이고 다른 하나는 최근에 업데이트/삭제/삽입한 새로운 데이터 값입니다.

insert - old value는 null이고 new value에는 값 갱신이 포함되어 있습니다.old 및 new에는 값이 있지만 new에는 값이 포함되지 않습니다.

따라서 다음을 사용합니다.OLD 및 :NEW는 이력을 유지할 다른 테이블을 삽입/갱신하거나 :OLD 또는 :NEW 값을 기반으로 다른 종속 테이블을 삽입/갱신할 수 있습니다.

이게 도움이 됐으면 좋겠는데..

매우 간단합니다.

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;

: OLD 및 :NEW는 Record 유형의 변수이며 트리거가 실행되는 테이블 행과 컬럼이 동일합니다.행 레벨 트리거에만 사용할 수 있습니다.트리거는 사전 정의된 이벤트에서 자동으로 발생하므로 다음과 같습니다.OLD 및 :NEW도 자동으로 값을 가져옵니다.이름에서 알 수 있듯이 : OLD는 테이블에 존재하는 완전한 행 값(업데이트 및 삭제의 경우 기존 값)과 다음과 같은 값을 가집니다.NEW는 해당 행에 대해 새로운 값을 갖게 됩니다(업데이트 및 삽입의 경우 행 값을 갖게 됩니다).

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;
/

하시면 됩니다.:OLD 전후 100% 중/ 100% ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ★:NEW는, (또는 갱신에 의해서 입니다.:OLD래된값값 값값값다다이다.

주로 여기에 언급되는 단어들이 있다.

: old는 트리거 발생 전 이전 값을 나타냅니다.:new는 트리거 발생 후 값을 포함합니다.

데이터베이스 수정(업데이트)을 시도할 때 이 메시지가 나타날 수 있습니다.를 삽입할 때:New표시됩니다.기존 데이터가 없으므로 다음과 같이 표시되지 않습니다.:Old 기존 할 때 기존 됩니다.:Old된 상세 을 「」로 합니다.:New.

트리거 본체 내 : OLD 및 :NEW 키워드를 사용하면 트리거의 영향을 받는 행의 열에 액세스할 수 있습니다.

: OLD는 컬럼이 갱신 또는 삭제되기 전에 컬럼의 오래된 값을 취득하기 위해 사용됩니다.따라서 OLD는 삭제 또는 업데이트 문의 트리거에만 사용됩니다.

:NEW는 갱신된 값 또는 데이터베이스에 삽입된 값 취득에 사용됩니다.따라서 NEW는 업데이트 및 삽입문 트리거에만 사용됩니다.

여기에 이미지 설명 입력

의사 코드에 관한 제약사항은 다음과 같습니다.

  • 레코드 레벨의 조작에는 의사 코드를 표시할 수 없습니다.

예를 들어 트리거에는 다음 문을 포함할 수 없습니다.

:신규:=특수;

  • 의사 코드는 실제 하위 프로그램 매개 변수가 될 수 없습니다.

( 의사 코드필드는 실제 서브 프로그램파라미터가 될 수 있습니다).

  • 트리거는 OLD 필드 값을 변경할 수 없습니다.

그렇게 하려고 하면 ORA-04085가 올라갑니다.

  • 트리거문이 DELETE인 경우 트리거는 새 필드 값을 변경할 수 없습니다.

이렇게 하면 ORA-04084가 올라갑니다.

  • 트리거가 발생하기 전에 트리거 문이 실행되므로 AFTER 트리거는 새 필드 값을 변경할 수 없습니다.

이렇게 하면 ORA-04084가 올라갑니다.

  • BEFORE 트리거는 INSERT 또는 UPDATE 문을 트리거하여 테이블에 입력하기 전에 새 필드 값을 변경할 수 있습니다.
  • 문이 BEFORE 트리거와 AFTER 트리거를 모두 트리거하고 BEFORE 트리거가 NEW 필드 값을 변경하면 AFTER 트리거가 "인식"합니다.

언급URL : https://stackoverflow.com/questions/13135295/plsql-new-and-old

반응형