在触发器中,可以使用关键字NEW和OLD来引用触发器所作用的表中的新值和旧值,举5个列子
时间: 2024-02-15 14:04:03 浏览: 18
好的,下面是5个例子:
1. 在更新操作后,将新值和旧值进行比较,如果不同则记录日志:
```
CREATE OR REPLACE TRIGGER trg_emp_update
AFTER UPDATE ON employee
FOR EACH ROW
BEGIN
IF :NEW.salary != :OLD.salary THEN
INSERT INTO emp_log (emp_id, action, log_time)
VALUES (:OLD.id, 'Salary updated', SYSDATE);
END IF;
END;
/
```
2. 在插入操作前,检查新值是否已经存在,并防止重复插入:
```
CREATE OR REPLACE TRIGGER trg_emp_insert
BEFORE INSERT ON employee
FOR EACH ROW
BEGIN
IF EXISTS (SELECT 1 FROM employee WHERE id = :NEW.id) THEN
RAISE_APPLICATION_ERROR(-20001, 'Employee already exists');
END IF;
END;
/
```
3. 在删除操作后,将被删除的记录保存到历史表中:
```
CREATE OR REPLACE TRIGGER trg_emp_delete
AFTER DELETE ON employee
FOR EACH ROW
BEGIN
INSERT INTO emp_history (id, name, age, gender, deleted_time)
VALUES (:OLD.id, :OLD.name, :OLD.age, :OLD.gender, SYSDATE);
END;
/
```
4. 在更新操作前,检查是否有其他员工使用了相同的邮箱地址:
```
CREATE OR REPLACE TRIGGER trg_emp_update
BEFORE UPDATE ON employee
FOR EACH ROW
DECLARE
cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM employee WHERE email = :NEW.email AND id != :OLD.id;
IF cnt > 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Email address already in use');
END IF;
END;
/
```
5. 在插入操作后,根据新插入的员工信息,自动生成员工编号:
```
CREATE OR REPLACE TRIGGER trg_emp_insert
AFTER INSERT ON employee
FOR EACH ROW
DECLARE
max_id NUMBER;
BEGIN
SELECT MAX(id) INTO max_id FROM employee;
:NEW.emp_no := 'EMP' || LPAD(max_id + 1, 5, '0');
END;
/
```
以上是5个触发器的例子,用于演示如何使用NEW和OLD关键字来引用触发器所作用的表中的新值和旧值。这些例子只是触发器的冰山一角,实际应用中还有很多其他的用法和技巧。