ORACLE 中报ORA-30926 无法在源表中获得稳定的行的处理
在库存处理的业务中有这么一个场景,一张处方划价单进行库存扣减处理,如果此单据同一商品有两行以上,同时扣减同一行库存记录,使用MERGE INTO批量更新是就会报错:ORA-30926 无法在源表中获得稳定的行。
库存表T_DRUGSTORE_DRUG_STOCK_TEMP 的记录

处方划价单T_OPD_QUOTN的记录(待出库信息),注意:这里 1、2行的同时要扣减了库存表中ID是93498记录的库存。

以上情况使用以下语句会因为批量更新时被更新的表记录出现了一对多行匹配导致异常错误


在扣减库存前要确保匹配行不能出现一对多,以下实现这里主要四点作为了解
1、使用 COUNT(distinct STOCK_ID) 求得单据药品涉及到的库存记录数。
2、MERGE INTO中的USING子查询使用了分组在库存扣减前对出库记录按照药品库存的ID进行分组求和待出库数量。
3、更新库存的时候使用 WHERE a.QUANTITY>=b.BASE_QUANTITY 仅更新库存足够的记录,后面通过 SQL%ROWCOUNT!=tn_rowcount 验证是否期待的库存记录都被更新了。
4、这样处理批量更新比逐行循环更新处理高效。
--取得出库单药品品种数和待出库总数量
SELECT COUNT(distinct STOCK_ID) AS rowcount,NVL(SUM(QUANTITY),0) AS quantity
INTO tn_rowcount,tn_quantity
FROM T_OPD_QUOTN WHERE HOSPITAL_ID=ow_hosid AND ORDER_WRITE_ID=writeId;
IF ow_count!=tn_quantity THEN
mess:='医嘱药品数量'||ow_count||'与划价单数量合计'||tn_quantity||'不符!';
RETURN;
END IF;
--进行库存扣减处理,更新划价单对应批次结存数量
MERGE INTO T_DRUGSTORE_DRUG_STOCK_TEMP a
USING (SELECT STOCK_ID,sum(BASE_QUANTITY) as BASE_QUANTITY FROM T_OPD_QUOTN
WHERE HOSPITAL_ID=ow_hosid AND ORDER_WRITE_ID=writeId GROUP BY STOCK_ID) b ON (a.ID=b.STOCK_ID)
WHEN MATCHED THEN UPDATE SET a.QUANTITY=a.QUANTITY-b.BASE_QUANTITY,UPDATE_OPER=operateId,UPDATE_DATE=SYSDATE WHERE a.QUANTITY>=b.BASE_QUANTITY;
IF SQL%ROWCOUNT!=tn_rowcount THEN
mess:='临时库存更新'||SQL%ROWCOUNT||'行,与划价记录行'||tn_rowcount||'不符,操作无效!';
RETURN;
END IF;
ORACLE 中报ORA-30926 无法在源表中获得稳定的行的处理的更多相关文章
- Oracle使用游标删除所有用户数据表中的所有记录脚本
应用场景:因为数据库中的数据涉及机密信息,希望一次性能删除掉所有数据,只保留数据表结构,供新项目开发程序用 测试结果:经查询已删除所有数据 存在问题:数据表如果存在外键的话下面脚本可能执行不成功,请自 ...
- Sql server的Merge语句,源表中如果有重复数据会导致执行报错
用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说 ...
- 一定要 先删除 sc表 中的 某元组 行,,, 再删除 course表中的 元组行
一定要 先删除 sc表 中的 某元组 行,,, 再删除 course表中的 元组行 course表 SC表 删除 course表中的 元组行,,出现错误 sc ---->参 ...
- 从远程oracle上导入到本地同一张表中不存在的记录的方法
场景:在远程oracle上存在一张表A,在本地同样存在一张相同表结构的表B.由于本地表B中保存了业务系统操作产生的几条记录,同时原来导入了A中的部分记录,但是并没有保存A中全部的记录.A中有15条记录 ...
- oracle一条sql语句统计充值表中今天,昨天,前天三天充值记录
select NVL(sum(case when create_date_time>=to_date('2014-11-24 00:00:00','yyyy-mm-dd hh24:mi:ss') ...
- ORA-30926: 无法在源表中获得一组稳定的行ORA-06512: 在 "STG.FP_MO_SPLIT", line 1562 临时
- Oracle 从 dual 表中查询返回多行记录
同时查询出十条数据 ; 按照这个特性计算两个日期之间的工作日: select days, week as days, to_char(to_date(, 'day') as week from dua ...
- C# DataAdapter.Update() 无法更新数据表中删除的数据行
用DataAdapter.Update() 方法更新删除了部分DataRow 的 DataTable .但是数据库中的数据没有随着更新而变化. 原因:DataTable 删除 DataRow 时,使用 ...
- iOS-查询数据库-->指定数据表中的当前数据行的总数量
很多时候,我们在查询一个表的时候,不想得到里面的记录内容,只是想简单的得到符合查询条件的记录条数. FMDB中有一个很简单的方法就可以实现,见下面的代码实例: #import "FMdata ...
- Oracle中 如何用一个表的数据更新另一个表中的数据
准备阶段 1.建表语句: create table table1( idd varchar2(10) , val varchar2(20) ); create table table2( idd va ...
随机推荐
- Mongodb的配置与登录
1.下载完mongo后,把mongo的路径加入到用户与电脑的环境变量里面,如下图第二行. 2.新建一个文件夹,下面有db和log,两个文件夹,log里面新建一个mongodb.log文件,分别存放数据 ...
- 原生鸿蒙中的RN日志系统
一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...
- cornerstone中raft_server_req_handlers源码解析
1.概述 之前说过raft_server是cornerstone的核心,其中充满了很多req的发送,那么follower收到leader的req会怎么处理呢? 本文就是来解析cornerstone中处 ...
- 《Django 5 By Example》阅读笔记:p237-p338
<Django 5 By Example>学习第11天,p237-p338总结,总计102页. 一.技术总结 1.follow system(关注功能) 表之间的关系有三种:OneToOn ...
- Lucene 源代码剖析-2 Lucene是什么
转载自 http://download.csdn.net/source/858994 源地址下是 Word 文档,这里转换成HTML 格式 1 Lucene是什么 Apache L ...
- Python之pandas读取Excel
#! -*- coding utf-8 -*- """ 模块功能:读取当前文件夹下的Source里的Excel文件,显示其相关信息 说明:默认把Excel的第一行当做列名 ...
- 【项目学习】Pendle 项目的简单调研
项目介绍 将 1 ETH 质押成 1 stETH,年利率为 5%,那么到期后 1 stETH 就能收回 1 ETH(本金)+ 0.05 ETH(收益).而 Pendle 所做的就是把 1 stETH ...
- Vue 二维码组件
1.前言 该组件依赖qrcode.js与element-ui 支持二维码大小配置,点击大图预览 该组件以vue文件形式进行封装,需要配置httpVueLoader插件进行引入,其他格式请自行更改源码 ...
- JavaScript ES6基础
1.let声明 1.let不像var有变量声明提升,未声明直接使用会报错 console.log(a); //undefined var a; console.log(b); //报错 let b; ...
- 一比一还原axios源码(七)—— 取消功能
按照惯例,我们先来看下官方的例子: 你可以通过axios的CancelToken工厂函数,生成一个source,然后把这个对象作为参数传递给axios,最后,需要取消的时候调用source的cance ...