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:
-
Beschränken Sie die ungültige DELETE-Operation.
-
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
. patient
enthä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 |