在本章中,无涯教程将讨论PL/SQL中的触发器,触发器是存储的程序,在发生某些事件时会自动执行或触发。
创建触发器
创建触发器的语法是-
CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF } {INSERT [OR] | UPDATE [OR] | DELETE} [OF col_name] ON table_name [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] WHEN (condition) DECLARE Declaration-statements BEGIN Executable-statements EXCEPTION Exception-handling-statements END;
首先,无涯教程将使用在先前各章中创建并使用的CUSTOMERS表-
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
以下程序为客户表创建一个行级触发器,该触发器将针对在CUSTOMERS表上执行的INSERT或UPDATE或DELETE操作而触发。此触发器将显示旧值和新值之间的薪金差-
CREATE OR REPLACE TRIGGER display_salary_changes BEFORE DELETE OR INSERT OR UPDATE ON customers FOR EACH ROW WHEN (NEW.ID > 0) DECLARE sal_diff number; BEGIN sal_diff := :NEW.salary - :OLD.salary; dbms_output.put_line('Old salary: ' || :OLD.salary); dbms_output.put_line('New salary: ' || :NEW.salary); dbms_output.put_line('Salary difference: ' || sal_diff); END; /
当以上代码在SQL提示符下执行时,将产生以下输出-
Trigger created.
这里需要考虑以下几点-
OLD和NEW引用不适用于表级触发器,而是可以将它们用于记录级触发器。
如果要在同一触发器中查询表,则应使用AFTER关键字,因为触发器只有在应用了初始更改并且该表返回后,才能查询该表或再次对其进行更改。
以上触发器的编写方式使其可以在对表执行任何DELETE或INSERT或UPDATE操作之前触发,但是您可以将触发器编写为单个或多个操作,如BEFORE DELETE,每当在表上使用DELETE操作删除一条记录时,就会触发该事件。
触发触发器
让无涯教程在CUSTOMERS表上执行一些DML操作,这是一条INSERT语句,它将在表中创建一条新记录-
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, 'Kriti', 22, 'HP', 7500.00 );
在CUSTOMERS表中创建记录时,将触发上述创建触发器 display_salary_changes ,并显示以下输出-
Old salary: New salary: 7500 Salary difference:
因为这是新记录,所以旧工资不可用,并且以上输出为空,现在让无涯教程在CUSTOMERS表上再执行一次DML操作, UPDATE语句将更新表中的现有记录-
UPDATE customers SET salary = salary + 500 WHERE id = 2;
在CUSTOMERS表中更新记录时,将触发上述创建触发器 display_salary_changes ,并显示以下输出-
Old salary: 1500 New salary: 2000 Salary difference: 500
参考链接
https://www.learnfk.com/plsql/plsql-triggers.html
标签:salary,UPDATE,触发器,Triggers,CUSTOMERS,无涯,INSERT,SQL,DELETE From: https://blog.51cto.com/u_14033984/8939174