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 ...
随机推荐
- i-MES生产制造管理系统-可视化看板
可视化看板最主要的目的是为了将生产状况透明化,让大家能够快速了解当前的生产状况以及进度,通过大数据汇总分析,为管理层做决策提供数据支撑,看板数据必须达到以下基本要求: 数据准确--真实反映生产情况 数 ...
- 十分钟配置完成Go开发环境
本文介绍了GO环境搭建以及GOPATH.GOROOT等基本概念,希望让你少走弯路 SDK下载 如果要使用Golang,我们首先要安装Golang的SDK开发包 Golang是网友给Go语言起的另一个称 ...
- php open_basedir的使用
今天跨省问为什么file_exists检测一个相对路径的文件无法获取到true,文件明明有,但是获取不到,我看了一下,感觉可能是因为这个文件是软链接过来的有关系. 然后他找了找发现是和这么一个文件.u ...
- Python prometheus_client使用方式
#!/usr/bin/env python # -*- coding: utf8 -*- import socket,re from prometheus_client import generate ...
- Lua之基础篇
新到一家公司,接触有些业务竟然直接通过服务器,在nginx层面就完成了,主要是基于OpenResty和Lua来实现的.打算深入了解一下这门神奇的语言... 为了嵌入应用程序中,从而为应用程序提供灵活的 ...
- ZCMU-1101
这个题不怎么难,就是当时没有理解到字典序的意思:我一直以为是自己元素间的比较,后再同学帮助下明白这里是与其他比,这样就很简单了.就是要求当前那个最小就可以了. 对这道题我有点吐槽明明自己都说了最后一组 ...
- Node.js 文件读写
1.fs模块 在node.js中,所有文件的操作都是通过fs模块来实现的.包括文件目录的创建,删除,查询以及文件的读取,写入. 在fs模块中,所有的方法都分成同步和异步两种实现,具有sync后缀的为同 ...
- HarmonyOS Next 入门实战 - 文字转拼音,文字转语音
文字转拼音 安装 pinyin4js 三方库 ohpm install @ohos/pinyin4js pinyin4js 提供了以下接口: ● 文字转拼音(带声调和不带声调) ● 文字转拼音首字母 ...
- .net core 文本比对的一个诡异设计
9-11 发现的,过久了都忘了,记一下 string s = Encoding.ASCII.GetString(new byte[] { 0x57, 00, 0x49, 00, 0x4e, 00, 0 ...
- ChannelInboundHandlerAdapter和SimpleChannelInboundHandler区别
ChannelInboundHandlerAdapter和SimpleChannelInboundHandler是我们在使用Netty处理Handler时候很常用的两个继承类,虽然说二者实现的功能大致 ...