-- 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就可以了。