Oracle数据库中的触发器(trigger)是一种特殊的存储过程,当满足某些条件时自动执行。触发器可以用于在数据插入、更新或删除之前或之后自动执行某些操作,如验证数据完整性、自动更新其他表中的数据等。下面是一些Oracle触发器的示例及其写法。
示例 1:在插入数据前验证完整性
假设有一个名为`employees`的表,我们想确保在插入新员工时,其工资大于某个固定值(例如,大于零)。我们可以创建一个BEFORE INSERT触发器来实现这一点。
```sql
CREATE OR REPLACE TRIGGER trg_check_salary_before_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary <= 0 THEN
RAISE_APPLICATION_ERROR(-20001, '工资必须大于零');
END IF;
END;
/
```
这里我们定义了一个触发器,它会在插入新的记录之前触发并执行。如果新记录的`salary`字段小于或等于零,则会引发一个异常并提示用户工资必须大于零。
示例 2:在更新数据后自动更新另一个表的数据
假设我们有两个表:`orders`和`order_updates`。每当`orders`表中的订单状态发生变化时,我们希望将更新的订单信息记录到`order_updates`表中。这可以通过AFTER UPDATE触发器来实现。
```sql
CREATE OR REPLACE TRIGGER trg_after_order_status_update
AFTER UPDATE OF order_status ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_updates (order_id, old_status, new_status, update_date) VALUES (:OLD.order_id, :OLD.order_status, :NEW.order_status, SYSDATE);
END;
/
```
这个触发器会在订单状态字段更新后触发,并将旧的订单状态和新订单状态记录到`order_updates`表中。使用`:OLD.column_name`和`:NEW.column_name`可以访问更新前后的列值。