Oracle触发器
来源:互联网 发布:云计算就业方向 编辑:程序博客网 时间:2024/06/13 20:47
接到个任务,目的如下:前台POS销售,付款方式是积分抵换金额的不能传入SAP,因为相当大的积分抵换成金额后,就会上很多税。
零售系统和接口是当初软件公司给我们的,源代码不可能开放,只留了个数据库。找软件公司无疑要收manday。只能从数据库这里想办法。
所以想到一个移花接木的办法,将原来的接口取数的临时表的根源改一下。改根源就要改主表。但是主表明显不能改。所以得克隆一个和主表一模一样的表。
数据表逻辑是这样的:
A 表 记录来自POS前台收集的每条销售单据记录,金额字段是各种付款方式的总额;
B 表 记录来自POS前台收集的一条销售单据,各种付款方式的金额;
A和B表的关系是一对多的关系。
有个重要一点是,经过对log日志的分析,找到POS前台收集销售信息后,信息传回总部服务器写入对应的表里,先往A表写,然后才是B表。
首先分析A表,发现A表有个字段记录着B表付款方式的数量。这点就可以作为写这个触发器的切入点了。
创建触发器,AFTER INSERT ON B表 FOR EACH ROW .以B表作为基表建触发器,
因为B表是A对应多的关系。
声明4个变量:
declare
numoftender number;--A表付款方式数量
existtender number;--B表付款种类数量
netamount number(16,4);--A表金额
payamount number(16,4);--B表付款方式是JF的金额
将A表的金额和付款方式数量取出,根据检索条件写入变量里。
select a.xf_netamount, a.xf_numoftender
into netamount, numoftender
from a
where a.xx = :new.xx
and a.zz= :new.zz
and a.yy = :new.yy;
用COUNT函数计算B表条数,用DECODE函数,来判断那条付款方式是积分。
根据检索条件写入变量里。
selectcount(1),sum(decode(tt,'JF', xf_payamount,0))
into existtender, payamount
from B+(触发器里好像基表不能用自己,所以得事先克隆一个B出来)
where a.xx = :new.xx
and a.zz= :new.zz
and a.yy = :new.yy;
if existtender >= numoftenderthen
insertinto C
SELECT A表的所有字段,其中金额字段为变量金额netamount - payamount。
这个触发器就完成了。这个是憋弄了3天后的结果,3天前为找到方法,大概写了不止10个触发器,一直摸索中过来的。不过PL/SQL的debug功能确实帮了不少忙,大力推荐下,路径:
新建—测试窗口。执行的时候是:调试—开始(F9)。
- oracle 触发器
- Oracle触发器
- Oracle触发器
- oracle触发器
- ORACLE触发器
- oracle触发器
- Oracle 触发器
- oracle触发器
- Oracle触发器
- Oracle 触发器
- Oracle 触发器
- Oracle 触发器
- oracle触发器
- oracle 触发器
- Oracle触发器
- oracle触发器
- ORACLE触发器
- ORACLE 触发器
- GPIO的英文全称General-Purpose Input /Output Ports
- Csharp: Treeview check list value
- Android特色开发之桌面组件
- 最全android开发知识汇总
- Matlab的集合运算
- Oracle触发器
- 男人最讨厌和女人一起做的五件事
- xPath对xml文档的处理入门6
- PHP session有效期问题
- HP UINX磁带管理
- Eclipse Android 自动补全
- you may be a victim of software counterfeiting解决方法
- delphi webbrowser与delphi互动
- 对上拉下拉电阻的作用作个总结