触发器
在PLSQL中也有个类似与我们Java Web中过滤器的概念,就是触发器...触发器的思想和Filter的思想几乎是一样的....
值得注意的是:对于触发器而言,是不针对查询操作的。也就是说:触发器只针对删除、修改、插入操作!
触发器语法
CREATE [or REPLACE] TRIGGER 触发器名
{BEFORE | AFTER}
{ INSERT | DELETE|-----语句级
UPDATE OF 列名}----行级
ON 表名
-- 遍历每一行记录
[FOR EACH ROW]
PLSQL 块【declare…begin…end;/】
创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示"hello world"
CREATE OR REPLACE TRIGGER insertempTiriger
BEFORE
INSERT
ON EMP
BEGIN
dbms_output.put_line('helloword');
END;
调用:
INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (1, '2', '3', 4, NULL, NULL, NULL, 10);
星期一到星期五,且9-20点能向数据库emp表插入数据,否则使用函数抛出异常,
语法:raise_application_error('-20000','例外原因')
CREATE OR REPLACE TRIGGER securityTrigger
BEFORE
INSERT
ON EMP
DECLARE
pday VARCHAR2(10);
ptime NUMBER;
BEGIN
/*得到星期几*/
SELECT to_char(sysdate, 'day')
INTO pday
FROM dual;
/*得到时间*/
SELECT to_char(sysdate, 'hh24')
INTO ptime
FROM dual;
IF pday IN ('星期六', '星期日') OR ptime NOT BETWEEN 7 AND 23
THEN
RAISE_APPLICATION_ERROR('-20000', '非工作事件,请工作时间再来!');
END IF;
END;
插入数据、响应触发器:
INSERT INTO EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES (3, '2', '3', 4, NULL, NULL, NULL, 10);
创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资,语法:for each row/:new.sal/:old.sal
可以使用:new.sal/:old.sal来对比插入之前的值和插入之后的值
CREATE OR REPLACE TRIGGER checkSalTrigger
BEFORE
UPDATE OF sal
ON EMP
FOR EACH ROW
BEGIN
IF :new.sal <= :old.sal
THEN
RAISE_APPLICATION_ERROR('-20001', '你涨的工资也太少了把!!!!');
END IF;
END;
调用:
UPDATE emp
SET sal = sal - 1
WHERE empno = 7369;
作者:Java3y
链接:http://www.imooc.com/article/25261
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作