首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 觸發器創建實戰:行級同步增刪改、:NEW/:OLD 引用與 ORA-00984 排查

     編輯:Oracle 資料庫相關知識

語法模板

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF col]} ON table_name
FOR EACH ROW
BEGIN
-- PL/SQL 塊
END;

同步副表三類觸發器

-- INSERT 同步
CREATE TRIGGER tri_emp_ins AFTER INSERT ON employees
FOR EACH ROW
INSERT INTO emp_backup VALUES (:NEW.sno, :NEW.sname, :NEW.sex, :NEW.depart);

-- DELETE 同步
CREATE TRIGGER tri_emp_del AFTER DELETE ON employees
FOR EACH ROW
DELETE FROM emp_backup WHERE sno = :OLD.sno;

-- UPDATE 同步
CREATE TRIGGER tri_emp_upd AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
DELETE FROM emp_backup WHERE sno = :OLD.sno;
INSERT INTO emp_backup VALUES (:NEW.sno, :NEW.sname, :NEW.sex, :NEW.depart);
END;

常見編譯錯誤 ORA-00984

錯誤代碼:INSERT INTO emp_backup VALUES (emp_old.sno, ...)
原因:觸發器體內不能直接用 表名.欄位,必須用偽記錄 :NEW/:OLD。
修正:INSERT INTO emp_backup VALUES (:NEW.sno, :NEW.sname, ...)

關鍵點

  • BEFORE 可修改 :NEW 值,AFTER 僅可讀
  • 多語句必須包在 BEGIN ... END; 內,每句以分號結尾
  • 行級觸發器對每行觸發,大量 DML 慎用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved