一个表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
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
解决方案 »
- analyze table xxx compute statistics 后系统CPU占用率经常100%
- oracle 数据库互访的问题
- 一个SQL语句中的条件
- Oracle中怎么使用事务处理?
- 如何判断子存储过程执行是否出现错误?
- 这样能实现吗?
- 我的查询执行后结果不显示在sql plus中,请问怎样显示受影响的记录?
- ****关于分区表建立的问题!**** “未启用功能:Partitioning“?:(
- 如何把foxpro数据库导入到oracle数据库?
- 更新历史标志的触发器
- 关于ORACLE 大数据量分页
- oracle 报Item ‘XXX’ does not pass validation tes
判断:new是否变成0了?
如果是,按照你的规则设定:new.batch_no的值(如楼上所说,你没说清楚规则)
然后结束
很基础的,语法自己查一下吧。
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;
我觉得这么设计不合理,若表的数据量很大,更新频繁,会有很大的问题
依据is_valid由1更新成0时开始更新
voucher表记录120万以内。is_valid由1变成0,是在业务人员作废业务数据的情况下发生的,新增、修改业务数据时is_valid都是为1。是否可以用触发器来更新batch_no批次号????