Oracle數(shù)據(jù)庫中的觸發(fā)器(trigger)是一種特殊的存儲過程,當滿足某些條件時自動執(zhí)行。觸發(fā)器可以用于在數(shù)據(jù)插入、更新或刪除之前或之后自動執(zhí)行某些操作,如驗證數(shù)據(jù)完整性、自動更新其他表中的數(shù)據(jù)等。下面是一些Oracle觸發(fā)器的示例及其寫法。
示例 1:在插入數(shù)據(jù)前驗證完整性
假設(shè)有一個名為`employees`的表,我們想確保在插入新員工時,其工資大于某個固定值(例如,大于零)。我們可以創(chuàng)建一個BEFORE INSERT觸發(fā)器來實現(xiàn)這一點。
```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;
/
```
這里我們定義了一個觸發(fā)器,它會在插入新的記錄之前觸發(fā)并執(zhí)行。如果新記錄的`salary`字段小于或等于零,則會引發(fā)一個異常并提示用戶工資必須大于零。
示例 2:在更新數(shù)據(jù)后自動更新另一個表的數(shù)據(jù)
假設(shè)我們有兩個表:`orders`和`order_updates`。每當`orders`表中的訂單狀態(tài)發(fā)生變化時,我們希望將更新的訂單信息記錄到`order_updates`表中。這可以通過AFTER UPDATE觸發(fā)器來實現(xiàn)。
```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;
/
```
這個觸發(fā)器會在訂單狀態(tài)字段更新后觸發(fā),并將舊的訂單狀態(tài)和新訂單狀態(tài)記錄到`order_updates`表中。使用`:OLD.column_name`和`:NEW.column_name`可以訪問更新前后的列值。