欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

oracle 触发器 for each row 理解 有大用 有大大用

for each row 场景中两个关键字 :old ,:new

:old.字段名  获取修改前的值

:new.字段名  获取修改后的值

场景1:更改员工的薪资时,不能小于原薪资。

  1. create or replace trigger trig
  2. after update on emp20
  3. for each row
  4. begin
  5. if(:old.sal > :new.sal) then
  6. raise_application_error(-20000,'新薪资不能少于原薪资');
  7. end if;
  8. end;

 

场景2:更改部门表的时候,级联修改员工表的部门。

  1. create or replace trigger trig
  2. after update on dept for each row
  3. begin
  4. update emp20 set deptno=:NEW.deptno where deptno=:OLD.deptno;
  5. end;

注意:触发器中不能存在commit或者是rollback;否则报错

--查看用户下的触发器
select * from user_triggers;

--通过触发器名称,查找其源码
select * from all_source where type = 'TRIGGER' and name = 'TRIG1';


           来自 https://blog.csdn.net/xldmx/article/details/81331615



           

加了,每一条都会触 发,就算是批操作,也会一条条的触 发。

不加,就是一次的触发,如果是批操作,就只会触发一次。

比如 update tab set col = 1 where col = 2 ,一次更新了10条记录 ,
则加了,就是触发10次,不加,就是一次。
追问
就是说加了的话,update就会有十条记录被更新,但是如果不加就只有一条记录被更新,其余的九条不会更新吗?
tzwtao
2013-05-31 · TA获得超过293个赞
别看那人的回答,纯误导你,update语句,哪里有for each row这个

这个一般是用在存储过程或触发器的

例如对于触发器来说,加上这个语句,就会影响所有的数据,不加,仅针对当前做操作
追问
for each row是在触发器里面,比如建了一个update触发器,加了for each row与不加对更新记录有什么影响?
追答
比如,你表中,有100条数据,你做了个触发器,想将其中某个条件的数据更新

加了for each row,触发器被触发后,原有的100条数据也会更新,不加,只针对新进入的数据进行更新

来自 https://zhidao.baidu.com/question/555109810.html

           


           

看到了触发器 中有个 for each row 不是很明白就查了查资料,因为只是简单研究,就先写总结一下。

触发器的一般语法:

CREATE [OR REPLACE] TIGGER 触发器名 触发时间 触发事件

ON 表名

[FOR EACH ROW]

BEGIN

PL/SQL 语句;

END;
           


           

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name 
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;            


           

for each row 的意思是:这个触发器是行触发器。            


           

行触发器和语句触发器的区别:

1、行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器

2、语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器

3、当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器
           


例子:

--限制更新操作
           

create or replace TRIGGER L_TEST_TRI

BEFORE UPDATE OF YEAR ON L_TEST

FOR EACH ROW

DECLARE

BEGIN

IF :NEW.YEAR<:OLD.YEAR THEN

RAISE_APPLICATION_ERROR(-20002,'更新后的年份比更新前小');

END IF;

END;

--在非规定事件内插入数据
           

create or replace TRIGGER L_TEST_TRI

BEFORE INSERT ON L_TEST

DECLARE

BEGIN

IF TO_CHAR(SYSDATE,'DAY') IN ('星期四','星期六','星期日')

OR TO_NUMBER(TO_CHAR(SYSDATE,'HH24')) NOT BETWEEN 8 AND 24 THEN

RAISE_APPLICATION_ERROR(-20000, '不能在规定事件之外插入数据');

END IF;

END;
           


           


           

来自 https://blog.csdn.net/yin_jia_521/article/details/66972935            


           

普通分类: