for each row 是针对于行级触发器的,每一行都会执行触发器
第一个触发器:
/* 插入一条记录后,自动打印“成功插入一个员工” */ create or replace trigger firstTrigger after insert on emp begin dbms_output.put_line('成功插入一个员工'); end; /
实例一:实施复杂的安全性检查
/* 实施复杂的安全性检查 限制非工作时间向数据库插入(emp)数据: 周末: to_char(sysdate,'day') in ('星期六','星期日') 上班前,下班后:to_number(to_char(sysdate,'hh24')) not between 9 and 18 */ create or replace trigger securityEmp before insert on emp begin if to_char(sysdate,'day') in ('星期六','星期日','星期三') or to_number(to_char(sysdate,'hh24')) not between 9 and 18 then raise_application_error(-20001,'不能在非工作时间插入数据'); end if; end; /
RAISE_APPLICATION_ERROR:在子程序内部使用时,能从存储子程序中抛出自定义的错误消息。这样就能将错误报告给应用程序而避免范围未捕获异常。
语法如下:error_number
是范围在-20000到-20999之间的负整数
RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]);
实例二:确认数据(行级触发器)
/* 确认数据(涨后的薪水不能少于涨前的薪水) */ create or replace trigger checksal before update on emp for each row begin if :new.sal < :old.sal then raise_application_error(-20001,'涨后的薪水不能少于涨前的薪水.涨前:'||:old.sal||' 涨后:'||:new.sal); end if; end; /
伪记录变量,代表一行,针对行级触发器
练习:每个部门最多只能有5名员工
create or replace trigger empNumLimitTrigger before insert on emp2 for each row declare empCount number:=0; begin select count(*) into empCount from emp2 where deptno=:new.deptno; if empCount+1>5 then raise_application_error(-20001,'每个部门最多只能有五名员工!,添加失败!'); end if; end empNumTrigger;