Oracle触发器例子

-- set serveroutput on
create or replace TRIGGER check_out_jiecun_trigger 
before UPDATE -- 更新当前表的字段时,里只能 before, 不能 after; 否则会报ORA-04084:无法更改此触发器类型的新值
ON check_out
for each row
DECLARE
  -- 声明使用自治事务(触发器里引用了被触发的表,解决方案就是用自治事务.注意业务代码后的 commit.)
  -- 报错参考: ORA-04091: 发生了变化, 触发器/函数不能读它
  pragma autonomous_transaction;
  pv_res varchar2(255);
  pn_last_jiecun number; -- 上期结存
  pi_cnt_id int; -- 合同id
BEGIN
  pi_cnt_id := :old.contract_id;
  pv_res := '查询上期结存, pi_cnt_id: '||pi_cnt_id;
  dbms_output.put_line(pv_res);
  select nvl(max(p.jie_cun), 0) into pn_last_jiecun
  from (
      select c.bid_amount as jie_cun
      , row_number() over(order by c.id desc) as rn -- 按id倒序生成序号
      from check_out c
      where c.contract_id=pi_cnt_id
        and c.id<:old.id -- 当期之前的数据
        and c.status=2 
        and c.reverse_Status=1
  ) p
  where p.rn=1
  ;
  pv_res := '更新结存 '||sysdate||' pn_last_jiecun: '||pn_last_jiecun;
  dbms_output.put_line(pv_res);
  :new.bid_Amount := case when (:old.SALE_AMOUNT+pn_last_jiecun)>nvl(:old.REAL_PAY_AMOUNT,0) 
      then -mod(-(:old.SALE_AMOUNT+pn_last_jiecun) + nvl(:old.REAL_PAY_AMOUNT,0),100) 
      else :old.SALE_AMOUNT + pn_last_jiecun - nvl(:old.REAL_PAY_AMOUNT,0) 
    end;
    -- 自治事务手动提交 
    COMMIT;
end;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值