oracle触发器中定义变量

本文介绍了一个具体的Oracle数据库触发器案例,展示了如何通过触发器实现自动业务逻辑处理,如投票限制和账户金额变动等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;



----------------------------------------------------------
--每进行一次交易,就要调用触发器,自动扣除或增加账户金额
----------------------------------------------------------
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值