触发器介绍(不知道几百年前总结的。。。)

触发器介绍
    触发器是特定事件出现的时候,自动执行的代码块(在插入,删除或修改特定表中的数据时触发执行)。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

ORACLE产生数据库触发器的语法为:
create or replace trigger 触发器名 触发时间 触发事件

on 表名

for each row

begin

sql 语句

end;

其中:

触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:

insert:数据库插入会触发此触发器;

update:数据库修改会触发此触发器;

delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。


举例:当A表更新后,B表同时更新。

create or replace trigger gg after update
on A
for each row

begin

update B set B.value = XX;

end;


调试信息输出方法:
DBMS_OUTPUT.PUT_LINE('新轮得分='||:new.SCORE);

调用方法:
--格式:变量名 := 方法包名.方法
t_times := jsc_common.getJscTotalTurns(username);

定义变量和游标:

declare

--变量,只是定义类型,变量附值在具体触发器内容中。
--定义一般类型的变量,格式:变量名 类型
v_sql varchar2(200);

--定义与表字段同一类型的变量,格式:变量名 表名.字段名%TYPE
oldbestturnid JSC_CHALLENGE_STATISTIC.BEST_TURN_ID%TYPE;

--定义与表同一类型的变量(用于遍历游标),格式:变量名 表名%rowtype
challenge      JSC_TRAIN_STATISTIC%rowtype;

--变量附值,格式:变量名 := 值
username := 'iori'

--游标
--格式:cursor 游标名 is 具体内容
cursor c_jsc_test_turn is
 select * from jsc_test_turn t where t.TURN_ID=:new.TURN_ID; --:new可以取得触发表更新后的数据
cursor c_jsc_train_challenge is
 select * from JSC_TRAIN_STATISTIC t where t.USER_NAME = username; --这里的username是一个变量

--遍历游标

--方式一:直接遍历,类似for循环,将游标中的值附给变量
--这种方式,如果游标为空,会自动退出
--格式:
--for 变量 in 游标 loop
-- 操作
--end loop;

FOR challenge IN c_jsc_test_turn LOOP
 username := challenge.user_name;
 total_numbers := challenge.TOTAL_QUESTIONS;
 update JSC_TRAIN_STATISTIC jts set jts.TOTAL_NUMBERS = total_numbers where jts.USER_NAME = username;
END LOOP;


--方式二:先打开游标,然后可以判断游标是否为空,操作完再关闭游标
--格式:
--open 游标名;
--fetch 游标名 into 变量;
-- if 游标名%notfound then
--  操作   
-- end if;
-- if 游标名%found then
--  操作   
-- end if;
--close 游标名;

OPEN it_jsc_challenge_statistic_0;
FETCH it_jsc_challenge_statistic_0  INTO challenge ;
 if it_jsc_challenge_statistic_0%notfound  then
  update JSC_CHALLENGE_STATISTIC jcs set jcs.MODIFY_TIME = sysdate; --sysdate取数据库系统当前时间
 end if;
 if it_jsc_challenge_statistic_0%found  then
  oldscore := challenge.SCORE;
  update JSC_CHALLENGE_STATISTIC jcs set jcs.SCORE = :new.SCORE where jcs.SCORE = oldscore;
 end if;
CLOSE it_jsc_challenge_statistic_0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值