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)。

原创粉丝点击