oracle procedure trigger 小例子

  --sql window中写存储过程(本例对dept_copy表的操作)
create or replace procedure p_update_dept(
  l_remarker in number,--0增,1删,2改
  l_deptno in number,
  l_dname in varchar2,
  l_loc in varchar2,
  l_result out varchar2 --传出参数
)
is
begin
  l_result := '0000';
  if l_remarker = 0 then --0 增加
   insert into dept_copy values(l_deptno,l_dname,l_loc);
  elsif l_remarker = 1 then  --1删除
   delete from dept_copy p where p.deptno = l_deptno;
  elsif l_remarker = 2 then  --2修改
    update dept_copy p set p.loc = l_loc,p.dname = l_dname where p.deptno = l_deptno;
  end if;
  commit;
  exception
    when others then
      rollback;
      l_result:='1111';
 end;

-----------------------------------------------
  --调用存储过程(主要是java中调用)
-- test window中调用存储过程(可在output选项卡中看到执行返回的结果,对哪个表操作,看哪个表也能看出来。)
declare 
  -- Local variables here
  l_result varchar2(4); --返回值的长度是好写上
begin
  -- Test statements here
  p_update_dept(0,99,'ACCOUNTING','NEW YORK',l_result); --p_update_dept为存过程名称,括号里为存储过程定义的参数。
  dbms_output.put_line(l_result);
end;
========================触发器小例子===================

--行级触发器,一个表中数据发生变化时同时修改另一个表中对应字段的值
create or replace trigger trig2
  after update on dept_copy
  for each row  --针对每一行
begin
  update emp_copy e
     set e.deptno = :NEW.deptno
   where e.deptno = :old.deptno;
end;
/*当表dept_copy的deptno字段发生变化,修改对应表emp_copy的deptno字段的值
*/
-- 当执行更新下表时触发器被触发
update dept_copy d set d.deptno = 99 where d.deptno = 10;
---------------------------------------------------
---语句级触发器(用的较少)
create or replace trigger t_emp_copy
  before insert or delete or update on emp_copy
begin
  if inserting then
    insert into emp_copy_log
    values
      (seq_emp_copy_log.nextval, 'insert', user, sysdate);
  elsif deleting then
    insert into emp_copy_log
    values
      (seq_emp_copy_log.nextval, 'delete', user, sysdate);
  elsif updating then
    insert into emp_copy_log
    values
      (seq_emp_copy_log.nextval, 'update', user, sysdate);
  end if;
end;

猜你喜欢

转载自ych0108.iteye.com/blog/1938839
今日推荐