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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM