Oracle PL/SQL - Vor dem INSERT-Trigger-Beispiel

Oracle PL / SQL - Vor dem INSERT Trigger-Beispiel

Dieser Artikel zeigt Ihnen, wie SieBEFORE INSERT TRIGGER verwenden. Es wird ausgelöst, bevor eine INSERT-Operation ausgeführt wird. In realen Szenarien wird es hauptsächlich für Zwecke wie verwendet

  1. Datenvalidierung

  2. Werte automatisch aktualisieren (z. B. CREATED_BY, CREATION_DATE usw.)

1. Tabelle

Erstellen Sie einemployee_details. Wir werden versuchen, verschiedene Werte in diese Tabelle einzufügen und das Triggerverhalten zu beobachten.

Mitarbeiterdetails

--Creating employee_details table.

CREATE TABLE employee_details
(
    EMP_ID number(10) primary key,
    FIRST_NAME varchar2(50),
    LAST_NAME varchar2(50),
    DATE_OF_BIRTH date,
    DATE_OF_DEATH date,
    CREATED_BY varchar2(20),
    CREATED_DATE date
);

Ausgabe

table EMPLOYEE_DETAILS created.

2. Datenvalidierung

2.1 am before insert trigger example to restrict invalid data entry:

  1. Der Benutzer kann das Geburtsdatum des Mitarbeiters nicht eingeben, was nicht der Regel des 18-jährigen Alters des Mitarbeiters entspricht.

  2. Der Benutzer kann das zukünftige Todesdatum nicht eingeben.

2.2 Create a trg_before_emp_insr trigger on table employee_details

trg_before_emp_insr

CREATE OR REPLACE TRIGGER trg_before_emp_insr
BEFORE INSERT
  on employee_details
  FOR EACH ROW

DECLARE
emp_age number;

BEGIN

-- Finding employee age by date of birth
SELECT MONTHS_BETWEEN(TO_DATE(sysdate,'DD-MON-YYYY'), TO_DATE(:new.DATE_OF_BIRTH,'DD-MON-YYYY'))/12
   INTO EMP_AGE FROM DUAL;

   -- Check whether employee age is greater than 18 or not
    IF (EMP_AGE < 18) THEN
      RAISE_APPLICATION_ERROR(-20000,'Employee age must be greater than or equal to 18.');
    END IF;

    -- Allow only past date of death
    IF(:new.DATE_OF_DEATH > sysdate) THEN
      RAISE_APPLICATION_ERROR(-20000,'Date of death can not be Future date.');
    END IF;

END;

2.3 Normal data.

-- setting date format to to 'DD-MON-YYYY'
alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO employee_details VALUES (1,'Patel','Thomas','18-MAY-1999','01-MAY-2017','HR',sysdate);

-- output
1 rows inserted.

2.4 Test trigger raise error – Employee age must be greater than or equal to 18.

-- setting date format to to 'DD-MON-YYYY'
alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO employee_details VALUES (2,'Patel','Peter','18-MAY-2010','01-MAY-2017','HR',sysdate);

-- error
Error report -
ORA-20000: Employee age must be greater than or equal to 18.
ORA-06512: at "SYSTEM.TRG_BEFORE_EMP_INSR", line 18
ORA-04088: error during execution of trigger 'SYSTEM.TRG_BEFORE_EMP_INSR'

2.5 Test trigger raise error – Date of death can not be Future date.

-- setting date format to to 'DD-MON-YYYY'
alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO employee_details VALUES (3,'Patel','Thomas','18-MAY-1999','01-MAY-2040','HR',sysdate);

-- error
Error report -
ORA-20000: Date of death can not be Future date.
ORA-06512: at "SYSTEM.TRG_BEFORE_EMP_INSR", line 23
ORA-04088: error during execution of trigger 'SYSTEM.TRG_BEFORE_EMP_INSR'

3. Werte aktualisieren

Ein Trigger-Beispiel vor dem Einfügen, um einige Werte automatisch zu aktualisieren.

trg_before_emp_insr_userinfo

CREATE OR REPLACE TRIGGER trg_before_emp_insr_userinfo
BEFORE INSERT
  ON employee_details
  FOR EACH ROW

DECLARE
username varchar2(20);

BEGIN

  -- Replaced by the current logged in user "HR" by a trigger.
  SELECT USER INTO username FROM dual;

  -- Setting created_by and created_Date values.
  :NEW.CREATED_BY := username;
  :NEW.CREATED_DATE := sysdate;

END;
-- setting date format to to 'DD-MON-YYYY'
alter session set nls_date_format = 'DD-MON-YYYY';

select * from employee_details;

EMP_ID

VORNAME

NACHNAME

GEBURTSDATUM

STERBEDATUM

ERSTELLT VON

CREATED_DATE

1

Patel

Thomas

18. Mai 1999

01. MAI 2017

HR

24. MAI 2017

-- setting date format to to 'DD-MON-YYYY'
alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO employee_details VALUES (2,'Patel','Methew','01-JAN-1990','01-MAY-2005',null,null);

INSERT INTO employee_details VALUES (3,'Patel','Methew','01-JAN-1990','01-MAY-2005','XYZ',null);

select * from employee_details;

EMP_ID

VORNAME

NACHNAME

GEBURTSDATUM

STERBEDATUM

ERSTELLT VON

CREATED_DATE

1

Patel

Thomas

18. Mai 1999

01. MAI 2017

HR

24. MAI 2017

2

Patel

Methew

01. Januar 1990

01. MAI 2005

HR

24. MAI 2017

3

Patel

Methew

01. Januar 1990

01. MAI 2005

HR

24. MAI 2017