一个表voucher有3个字段:voucher_no、is_valid、batch_no。触发器需求:1、当voucher表is_valid字段由1变成0时,去更新voucher表的batch_no字段。2、batch_no规则如下:8位批次号-8位总笔数-8位流水号。更新的时候只更新:8位总笔数、8位流水号;为0的记录batch_no不用更新。例如:触发器更新前voucher表数据:voucher_no is_valid batch_no
0010010000001 1 00000001-00000004-00000001
0010010000002 1 00000001-00000004-00000002
0010010000003 1 00000001-00000004-00000003
0010010000004 1 00000001-00000004-00000004触发器更新后voucher表数据:voucher_no is_valid batch_no
0010010000001 1 00000001-00000003-00000001
0010010000002 1 00000001-00000003-00000002
0010010000003 0 00000001-00000004-00000003
0010010000004 1 00000001-00000003-00000003

解决方案 »

  1.   

    before update
    判断:new是否变成0了?
    如果是,按照你的规则设定:new.batch_no的值(如楼上所说,你没说清楚规则)
    然后结束
    很基础的,语法自己查一下吧。
      

  2.   

    CREATE OR REPLACE TRIGGER tg_voucher
    AFTER UPDATE of is_valid on voucher
    BEGIN
    UPDATE voucher A SET batch_no=(
    WITH c AS(SELECT voucher_no,substr(b.batch_no,1,9)||
      to_char(count(1)OVER(),'fm00000000') ||'-'||to_char(row_number()OVER(ORDER BY b.voucher_no),'fm00000000') n
    FROM voucher b WHERE is_valid='1')
    select n from c where c.voucher_no=a.voucher_no)
    WHERE is_valid='1';
    END;
    我觉得这么设计不合理,若表的数据量很大,更新频繁,会有很大的问题
      

  3.   


    依据is_valid由1更新成0时开始更新
      

  4.   


    voucher表记录120万以内。is_valid由1变成0,是在业务人员作废业务数据的情况下发生的,新增、修改业务数据时is_valid都是为1。是否可以用触发器来更新batch_no批次号????