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

Oracle PL / SQL - Vor DELETE Trigger-Beispiel

Dieser Artikel zeigt Ihnen, wie SieBEFORE DELETE TRIGGER verwenden. Er wird ausgelöst, bevor der Löschvorgang ausgeführt wird. In realen Szenarien wird es hauptsächlich für folgende Zwecke verwendet:

  1. Beschränken Sie die ungültige DELETE-Operation.

  2. Löschen Sie Daten aus einer anderen Tabelle.

1. Beschränken Sie die ungültige DELETE-Operation

In diesem Beispiel haben wir zwei Tabellenitem_details undorder_details. Die Tabelleorder_details enthält Werte von Bestellungen von Artikeln aus der Tabelleitem_details. Wann immer der Benutzer einen Artikel aus item_details löschen möchte, müssen wir prüfen, ob für diesen Artikel eine PENDING-Bestellung vorhanden ist oder nicht.

Wenn eine ausstehende Bestellung gefunden wird, lassen wir das Löschen des Elements nicht zu und lösen einen Anwendungsfehler vonBEFORE DELETE TRIGGER aus, um den Löschvorgang aufitem_details einzuschränken

1.1 Create tables and trigger.

ARTIKELDETAILS

CREATE TABLE ITEM_DETAILS
(
    ITEM_ID number(10) primary key,
    ITEM_NAME varchar2(30),
    TYPE varchar2(50),
    PRICE_IN_DOLLAR number(10)
);

BESTELLDETAILS

CREATE TABLE ORDER_DETAILS
(
    ORDER_ID number(10) primary key,
    ITEM_ID number(10),
    QUANTITY number(5),
    ORDER_DATE date,
    STATUS varchar2(20)
);

trg_before_item_delete

CREATE OR REPLACE TRIGGER trg_before_item_delete
BEFORE DELETE
  on item_details
  FOR EACH ROW

DECLARE
pending_orders number;

BEGIN
pending_orders := 0;
-- Find pending orders
SELECT count(1) INTO pending_orders FROM order_Details WHERE item_id = :OLD.item_id AND STATUS = 'PENDING';

   -- Check whether any pending order exists or not
    IF (pending_orders > 0) THEN
      RAISE_APPLICATION_ERROR(-20000,pending_orders||
        ' pending orders found for this item. First COMPLETE or CANCEL the order and then delete.');
    END IF;

END;

1.2 Insert data for testing.

INSERT INTO ITEM_DETAILS VALUES (1,'Fidget Spinner','TOYS',10);
INSERT INTO ITEM_DETAILS VALUES (2,'Radio','ELECTRONICS',15);
INSERT INTO ITEM_DETAILS VALUES (3,'Toys Car','TOYS',25);
INSERT INTO ITEM_DETAILS VALUES (4,'Mobile','ELECTRONICS',150);

alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO ORDER_DETAILS VALUES (101,1,5,'10-JUN-2017','COMPLETED');
INSERT INTO ORDER_DETAILS VALUES (102,2,2,'15-JUN-2017','CANCELLED');
INSERT INTO ORDER_DETAILS VALUES (103,4,1,'17-JUN-2017','PENDING');
INSERT INTO ORDER_DETAILS VALUES (104,4,1,'01-JUN-2017','COMPLETED');

1.3 Display the data.

select * from ITEM_DETAILS;
ARTIKEL IDENTIFIKATIONSNUMMER ARTIKELNAME TYPE PRICE_IN_DOLLAR

1

Fidget spinner

TOYS

10

2

Radio

ELEKTRONIK

15

3

Spielzeugauto

TOYS

25

4

Handy, Mobiltelefon

ELEKTRONIK

150

select * from ORDER_DETAILS;
AUFTRAGSNUMMER ARTIKEL IDENTIFIKATIONSNUMMER MENGE BESTELLDATUM STATUS

101

1

5

10-JUN-2017

ABGESCHLOSSEN

102

2

2

15. Juni 2017

ABGESAGT

103

4

1

17. Juni 2017

STEHT AUS

104

4

1

01. Juni 2017

ABGESCHLOSSEN

1.4 Delete item which have PENDING orders.

DELETE FROM item_details WHERE item_id = 4;

-- output
Error report -
ORA-20000: 1 pending orders found for this item. First COMPLETE or CANCEL the order and then delete.
ORA-06512: at "SYSTEM.TRG_BEFORE_ITEM_DELETE", line 11
ORA-04088: error during execution of trigger 'SYSTEM.TRG_BEFORE_ITEM_DELETE'

2. LÖSCHEN von einem anderen Tisch

In diesem Beispiel haben wir zwei Tabellenpatient undpatient_details. patiententhält grundlegende Details, währendpatient_details Werte eines Patienten wie Krankheit, Name des Arztes usw. enthält.

Wann immer der Benutzer Daten auspatient löschen möchte, müssen wir Daten auspatient_details löschen, auch da wir sie nach dem Löschen eines Patienten nicht mehr benötigen. Hier werden wir also Daten inBEFORE DELETE TRIGGER auf der Patiententabelle löschen.

2.1 Create tables and trigger.

GEDULDIG

CREATE TABLE PATIENT
(
    PATIENT_ID number(10) primary key,
    NAME varchar2(30),
    PHONE_NO number(12)
);

PATIENT_DETAILS

CREATE TABLE PATIENT_DETAILS
(
    PD_ID number(10) primary key,
    PATIENT_ID number(10),
    DISEASE varchar2(50),
    ADMITTED_DATE date,
    DOCTOR varchar2(30)
);

trg_delete_from_details

CREATE OR REPLACE TRIGGER trg_delete_from_details
BEFORE DELETE
  on patient
  FOR EACH ROW

BEGIN

-- Delete from PATIENT_DETAILS also
DELETE FROM PATIENT_DETAILS PD WHERE PD.PATIENT_ID = :OLD.PATIENT_ID;

END;

2.2 Insert data for testing.

alter session set nls_date_format = 'DD-MON-YYYY';

INSERT INTO PATIENT VALUES(1,'Devil Lal',9898989898);
INSERT INTO PATIENT VALUES(2,'Martin Kiyosaki',9090909090);

INSERT INTO PATIENT_DETAILS VALUES(101,1,'FEVER','10-JUN-2016','Dr. RJ Sharma');
INSERT INTO PATIENT_DETAILS VALUES(102,1,'COLD','01-DEC-2016','Dr. RJ Sharma');
INSERT INTO PATIENT_DETAILS VALUES(103,2,'ARTHRITIS','01-DEC-2015','Dr. KD Verma');
INSERT INTO PATIENT_DETAILS VALUES(104,2,'BACKPAIN','12-FEB-2017','Dr. KD Verma');

2.3 Display the data.

select * from PATIENT;
PATIENTEN ID NAME TELEFONNUMMER

1

Teufel Lal

9898989898

2

Martin Kiyosaki

9090909090

select * from PATIENT_DETAILS;
PD_ID PATIENTEN ID KRANKHEIT ADMITTED_DATE ARZT

101

1

FIEBER

10. Juni 2016

Dr. RJ Sharma

102

1

COLD

01. DEZ-2016

Dr. RJ Sharma

103

2

ARTHRITIS

01. DEZ-2015

Dr. KD Verma

104

2

RÜCKENSCHMERZEN

12. Februar 2017

Dr. KD Verma

2.4 Delete items from patient table. Überprüfen Sie die Tabellepatient_detail. Die zugehörigen Daten werden durch Auslösen automatisch gelöscht.

DELETE FROM patient WHERE patient_id = 2;

-- output
-- 1 row deleted.
select * from PATIENT;
PATIENTEN ID NAME TELEFONNUMMER

1

Teufel Lal

9898989898

select * from PATIENT_DETAILS;
PD_ID PATIENTEN ID KRANKHEIT ADMITTED_DATE ARZT

101

1

FIEBER

10. Juni 2016

Dr. RJ Sharma

102

1

COLD

01. DEZ-2016

Dr. RJ Sharma