存储过程和触发器-行触发器

本文介绍如何使用Oracle数据库中的触发器来维护数据一致性。通过创建部门和员工两张表,并设置触发器,确保员工表变动时能自动更新部门表的员工数量,以及部门ID变更时同步更新员工表中的对应ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
行触发器在受影响的每一行上执行,可以使用Create Trigger语句创建语句触发器语法如下
CREATE TRIGGER 
[BEFORE|AFTER]  ON 
FOR EACH ROW
<pl>
*/</pl>
--创建两个表,做未试验用
DROP TABLE DEPARTMENT;
DROP TABLE EMPLOYEES;
DROP TRIGGER TESTROWTRIGGER1;
DROP TRIGGER TESTROWTRIGGER2;
CREATE TABLE DEPARTMENT(
	DEPARTID NUMBER(3) NOT NULL UNIQUE,
	DEPARTNAME VARCHAR2(20),
	EMPNUM NUMBER(3)
);
CREATE TABLE EMPLOYEES(
	EMPID NUMBER(3) NOT NULL,
	EMPNAME VARCHAR2(20),
	DEPARTID NUMBER(3) NOT NULL,
	EMPAGE NUMBER(3)
);
/*
目标:
1、当EMPLOTEES有增加的时候,DEPARTMENT中相应的EMPNUM需要增减
2、当DEPARTMENT中的DEPARTID修改的时候,需要修改EMPLOYEES中的DEPARTID以保证数据的一致性
*/
--语句触发器
CREATE OR REPLACE TRIGGER TESTROWTRIGGER1
AFTER INSERT OR DELETE ON EMPLOYEES
DECLARE
	N_NUM NUMBER(5);
	CURSOR CUR_DEPART IS
	SELECT DEPARTID
	FROM DEPARTMENT;
	REC_DEPART DEPARTMENT.DEPARTID%TYPE;
BEGIN
	OPEN CUR_DEPART;
		LOOP
			FETCH CUR_DEPART INTO REC_DEPART;
			EXIT WHEN CUR_DEPART%NOTFOUND;
				SELECT COUNT(1) INTO N_NUM FROM EMPLOYEES WHERE DEPARTID=REC_DEPART;
				UPDATE DEPARTMENT SET EMPNUM = N_NUM WHERE DEPARTID=REC_DEPART;
		END LOOP;
	CLOSE CUR_DEPART;
END;
/
--验证触发器
SQL> INSERT INTO DEPARTMENT VALUES(1,'JIA',0);
已创建 1 行。
SQL> select * from department;

  DEPARTID DEPARTNAME               EMPNUM
---------- -------------------- ----------
         1 JIA                           3
--行触发器
CREATE OR REPLACE TRIGGER TESTROWTRIGGER2
AFTER UPDATE ON DEPARTMENT
FOR EACH ROW
DECLARE
BEGIN
	--:NEW和:OLD是两个虚拟的表
	--:NEW表示执行INSERT,UPDATE,DELETE操作之后的新表
	--:OLD表示执行INSERT,UPDATE,DELETE操作之前的旧表
	UPDATE EMPLOYEES SET DEPARTID = :NEW.DEPARTID WHERE DEPARTID = :OLD.DEPARTID;
END;
/

--验证触发器
SQL> update department set departid=4 where departid=2;
已更新 1 行。
SQL> commit;
--结果
SQL> select * from employees;
     EMPID EMPNAME                DEPARTID     EMPAGE
---------- -------------------- ---------- ----------
         1 CHENZW                        4         28
         1 CHENZW                        4         28
         1 CHENZW                        4         28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值