触发器是由Oracle引擎在特定事件发生时自动调用的。当特定条件匹配时,触发器被存储在数据库中并重复调用。
触发器是存储程序,当发生某个事件时,它们将自动执行或触发。
触发器被编写为响应以下任何事件而执行。
触发器可以定义在表、视图、模式或与事件相关的数据库上。
以下是触发器的优点:
创建触发器的语法:
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.
以下几点需要在这里考虑:
让我们对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:
由于这是一个新记录,旧的薪水不可用,所以上述结果为null。现在让我们在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
本文链接:http://so.lmcjl.com/news/18243/