有员工表和部门表
创建存储过程, 员工新进一个部门时,部门表对应部门人数加1,员工调换部门时,原先部门人数减1,现在部门人数加1
CREATE OR REPLACE PROCEDURE ap.update_data (var_emp IN VARCHAR2,
var_new_dpt IN VARCHAR2,
var_omsg OUT VARCHAR2)
AS
l_exit EXCEPTION;
l_count INT;
l_old_dpt VARCHAR2 (50);
----table : emp_table dpt _able
BEGIN
SELECT COUNT (*)
INTO l_count
FROM emp_table
WHERE empname = var_emp;
IF l_count <= 0
THEN
var_o_msg := 'emp not exists';
RAISE l_exit;
END IF;
SELECT dptid
INTO l_old_dpt
FROM emp_table
WHERE empname = var_emp;
UPDATE dpt_table
SET dptnumber = dptnumber + 1
WHERE (dptid = var_new_dpt or dptname =var_new_dpt);--看你传入参数是部门id还是名称
UPDATE dpt_table
SET dptnumber = dptnumber - 1
WHERE dptid = l_old_dpt;
var_omsg := 'information updated ';
COMMIT;
RETURN;
EXCEPTION
WHEN l_exit
THEN
ROLLBACK;
RETURN;
WHEN OTHERS
THEN
ROLLBACK;
END;
随手写的,用触发器其实更好一点,没必要写什么存储过程。
你的表结构设计不好,你不应该这么做,而应该在表中记录每个人和所属的部门
员工调换部门,修改人员表对应的部门的id
要统计某个部门的人员数,用select count(*) from emp表 where dept_id = 部门的id
使用触发器更好些
create trigger test_trigger after insert on emp for each row
begin
update dept set SET dptnumber = dptnumber + 1 where deptid =:NEW.deptid;
end test_trigger insert;
大致就是这样,还可以再写个删除的触发器就可以了。如果坚持要使用存储过程,需要涉及调用,从技术和业务角度讲,触发器更加合适。