Oracle的触发器的练习

  --    1、用触发器来实现主键自动增长
  --    2、数据操作日志记录 emp。
create or replace trigger TRI_AUTO_HWL
  before insert on emp_hwl  
  for each row
declare
  -- local variables here
  v_addId number;--    增长后的Id
  v_curtId number;--    当前Id
begin
  select max(e.empno) into v_curtId from emp_hwl e;
  if v_curtId is null then 
    v_addId := 1;
  else
    v_addId := v_curtId + 1;  
  end if;
  select v_addId into :new.empno from dual;
  dbms_output.put_line(v_curtId ||'   ------------');
end TRI_AUTO_HWL;

CREATE OR REPLACE TRIGGER TRI_EMP_INSERT_HWL
  BEFORE INSERT OR UPDATE OR DELETE --insert update delete 触发   
ON emp_hwl
  FOR EACH ROW
DECLARE

BEGIN

  IF inserting THEN
    insert into EMP_LOG_HWL
      (autoId, addTime, oprate, tableName, EMPNO)
    values
      (SEQ_TEST.NEXTVAL, trunc(sysdate), 'insert', 'emp_hwl',:old.empno);
  ELSIF updating THEN
    insert into EMP_LOG_HWL
      (autoId, addTime, oprate, tableName, EMPNO)
    values
      (SEQ_TEST.NEXTVAL, trunc(sysdate), 'update', 'emp_hwl',:old.empno);
  ELSIF deleting THEN
    insert into EMP_LOG_HWL
      (autoId, addTime, oprate, tableName, EMPNO)
    values
      (SEQ_TEST.NEXTVAL, trunc(sysdate), 'delete', 'emp_hwl',:old.empno);
  END IF;
END TRI_EMP_INSERT_HWL;
--    测试
insert into emp_hwl
  (ENAME, JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
values
  ('汉斯','SALESMAN',7902,to_date('2014/5/30','yyyy/mm/dd'),5000,1000,10);

delete emp_hwl e where e.ename = '汉斯';

 注意:触发器中不能有事务控制语句(commit/callback/savepoint),因其不能保证事务的完整性,若加入自治事务则可以。只需PL/SQL的声明部分加PRAGMAAUTONOMOUS_TRANSACTION就可以了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值