Oracle存储过程的创建怎么破

图片说明
有员工表和部门表
创建存储过程, 员工新进一个部门时,部门表对应部门人数加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;

大致就是这样,还可以再写个删除的触发器就可以了。如果坚持要使用存储过程,需要涉及调用,从技术和业务角度讲,触发器更加合适。