触发器介绍
触发器是特定事件出现的时候,自动执行的代码块(在插入,删除或修改特定表中的数据时触发执行)。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
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;
触发器介绍(不知道几百年前总结的。。。)
最新推荐文章于 2025-05-29 09:57:06 发布