create or replace trigger t_table_triger
after insert on t_table
for each row
declare
msg varchar2(22);
returnMsg varchar2(180);
xsBH varchar2(10);
sourceUserTpCount number:=0;
begin
if inserting then --inserting表示插入操作,每种操作类型都有对应的关键字
msg:=:NEW.msg; --获取触发事件插入的数据值
msg:=Replace(msg,'+','');--变量赋值
msg:=Replace(msg,'-','');--替换,跟MSSQL里函数相同
if LOWER(SUBSTR(msg,1,1))='v' and LENGTH(msg)>3 then
if sysdate<to_date('2009-12-26','yyyy-MM-dd') then --时间比较,sysdate是当前时间
select count(*) into sourceUserTpCount from t_siteuser where userid=sourceUser and TO_CHAR(gentime,'YYYYMMDD')= TO_CHAR(sysdate,'YYYYMMDD');
if sourceUserTpCount<=20 then
dbms_output.put_line(xsBH);--打印信息
insert into t_siteuser(id,bh,gentime) values (SEQ_t_siteuser.nextval,xsBH,sysdate);--SEQ_t_siteuser.nextval获取标识ID
returnMsg:='感谢您对'||xsBH||'号的支持!';--字符串与变量结合
else
returnMsg:='对不起,网站每天限投20票!';
end if;
else
returnMsg:='活动已结束,欢迎您继续关注!';
end if ;
end if;
end if;
end;
after insert on t_table
for each row
declare
msg varchar2(22);
returnMsg varchar2(180);
xsBH varchar2(10);
sourceUserTpCount number:=0;
begin
if inserting then --inserting表示插入操作,每种操作类型都有对应的关键字
msg:=:NEW.msg; --获取触发事件插入的数据值
msg:=Replace(msg,'+','');--变量赋值
msg:=Replace(msg,'-','');--替换,跟MSSQL里函数相同
if LOWER(SUBSTR(msg,1,1))='v' and LENGTH(msg)>3 then
if sysdate<to_date('2009-12-26','yyyy-MM-dd') then --时间比较,sysdate是当前时间
select count(*) into sourceUserTpCount from t_siteuser where userid=sourceUser and TO_CHAR(gentime,'YYYYMMDD')= TO_CHAR(sysdate,'YYYYMMDD');
if sourceUserTpCount<=20 then
dbms_output.put_line(xsBH);--打印信息
insert into t_siteuser(id,bh,gentime) values (SEQ_t_siteuser.nextval,xsBH,sysdate);--SEQ_t_siteuser.nextval获取标识ID
returnMsg:='感谢您对'||xsBH||'号的支持!';--字符串与变量结合
else
returnMsg:='对不起,网站每天限投20票!';
end if;
else
returnMsg:='活动已结束,欢迎您继续关注!';
end if ;
end if;
end if;
end;
----------------------------------------------------------
--每进行一次交易,就要调用触发器,自动扣除或增加账户金额
----------------------------------------------------------
create table account
(
customerName varchar2(30) primary key,
cardID varchar2(8),
currentMoney number
);
insert into account values('Daivd','10010001',5000);
insert into account values('Jason','10010002',3000);
create table trans
(
transDate date,
cardID varchar2(8),
transType varchar2(10),
transMoney number
);
insert into trans
values(sysdate,'10010001','取款',1000);
create or replace trigger trans_trigger
before insert
on trans
for each row
declare
v_currentMoney account.currentMoney%type;
begin
--判断类型
if :new.transType='取款' then
--取款
select currentMoney into v_currentMoney
from account
where cardID=:new.cardID;
if v_currentMoney < :new.transMoney then
raise_application_error(-20001,'余额不足');
end if;
update account
set currentMoney=currentMoney-:new.transMoney
where cardID=:new.cardID;
else
--存款
update account
set currentMoney=currentMoney+:new.transMoney
where cardID=:new.cardID;
end if;
exception
when no_data_found then
raise_application_error(-20002,'无效的帐户');
end;
--模式(schema)级触发器
create or replace trigger schema_trigger
before drop
on schema
begin
dbms_output.put_line('schema_trigger called');
dbms_output.put_line(ora_dict_obj_name);
dbms_output.put_line(ora_dict_obj_type);
if ora_dict_obj_name='ACCOUNT' then
raise_application_error(-20003,'ACCOUNT表不能被删除');
end if;
end;
drop table account;
--ora_dict_obj_name 操作对象名称
--ora_dict_obj_type 操作对象类型
--启用触发器
alter trigger schema_trigger enable;
--禁用触发器
alter trigger schema_trigger disable;
-------------------------自己写的-------------------
-----------------------测试表---------------------
create table Test
(
iKey int,
iValue int,
primary key(iKey)
);
create table Test_Log
(
iKey int,
iClass varchar(4)
);
create trigger Test_Tri after insert on Test
for each row
begin
if :new.iValue>90 then
insert into Test_log values(:new.iKey,1);
end if;
end;
insert into Test values(12,120);
insert into Test values(18,60);
insert into Test values(10,90);
本文介绍了一个具体的Oracle数据库触发器案例,展示了如何通过触发器实现自动业务逻辑处理,如投票限制和账户金额变动等功能。

563

被折叠的 条评论
为什么被折叠?



