首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

醫療資訊系統:Oracle PL/SQL 醫囑執行費用上傳函數實作解析

     編輯:Oracle 資料庫相關知識

功能概述

本函數 of_zy_yzfy 用於住院醫囑執行後,將費用明細(藥品、診療項目)組裝為醫保介接標準格式,透過交易介面 f_UserBargaingApply 上傳至醫保中心,並處理回傳結果與錯誤碼。

介面定義

FUNCTION of_zy_yzfy (astr_jyxx IN S_yb_zy_yzfy) RETURN BOOLEAN;
-- 參數結構包含:住院號陣列 inzyhm、輸出失敗住院號 outzyhm、醫囑流水號 outyzls、費用流水號 outfyls

資料組裝邏輯

  1. 取得交易序號:of_get_tradeid(33) 申請交易 ID,失敗則回傳 False。
  2. 迴圈處理每筆住院號:
    • 查詢 ZY_SFMX(住院費用明細)中 YBTJ='0'(非退費)的筆數。
    • 以游標 SFMX 逐筆擷取流水號 LSXH。
    • 依 XMLX(項目類別:1=藥品, 2=診療)關聯 GY_YPML(藥品主檔)、GY_FYML(費用主檔)、GY_YSML(醫師主檔)取得名稱、規格、單位、單複方標志等欄位。
    • 組裝單筆明細字串,欄位間以 %% 分隔,包含:流水號、就診類型(21住院)、退藥標志、類別標志、中心端編號、醫院端編碼/名稱/規格/單位、醫囑日期、醫師姓名、單價、數量、貼數、金額、自負比例、單複方標志。
  3. 分批封裝:每 10 筆明細為一批,存入 lpData[1..3] 陣列,格式為 $$~~~~~~住院號~~筆數~~明細內容。

交易送出與回應處理

FOR k = 1 TO 3
  IF NOT ISNULL(lpData[k]) THEN
    li_Rtn = f_UserBargaingApply(33, uniquelytradeid, lpData[k], lpMessage, ls_data2)
    lpMessage = of_dataunwrap(lpMessage)  -- 解封裝
    of_checkout(lpMessage, REF ls_checkdata)  -- 解析回傳結構
    -- 依回傳碼處理:
    -- -1: 上傳失敗
    -- -2: 住院號不在住院中校驗失敗
    -- -3: 費用明細無法儲存
    -- 解析失敗清單寫入 astr_jyxx 輸出參數
  END IF
NEXT

關鍵資料結構對照表

欄位來源表/欄位說明
LSXHZY_SFMX.LSXH明細流水號
JZLX固定 '21'就診類型:住院
TYBZ固定 '0'退藥標志:正常
LBBZZY_SFMX.XMLX類別:1藥品/2診療
XMZXBHZY_SFMX.YBXH醫保中心項目編號
XMYYBMZY_SFMX.XMXH醫院端項目編號
XMYYMCGY_YPML.YPMC / GY_FYML.FYMC項目名稱
XMYYGGGY_YPML.YPGG規格(費用類為 '無')
XMYYDWGY_YPML.ZYDW單位(費用類為 '無')
YZRQZY_SFMX.FYRQ醫囑日期 (YYYY.MM.DD)
YSXMGY_YSML.YSXM醫師姓名
XMDJZY_SFMX.FYDJ單價 (99999990.0000)
XMSLZY_SFMX.FYSL數量(退藥為負)
XMTS固定 '1'貼數
XMJEFYDJ*FYSL金額 (999990.0000)
ZFBLZY_SFMX.ZFBL自負比例 (0.0000)
DFFBZGY_YPML.DFFBZ單複方標志(費用類為 '0')

錯誤處理與資料完整性

  • 使用 NVL 處理可能為 NULL 的名稱/規格欄位,預設值 '無'。
  • 交易失敗時,解析回傳的 ls_wfbc_zyhlb(失敗住院號)、ls_wfbc_yzlslb(失敗醫囑流水號)、ls_wfbc_fylslb(失敗費用流水號),寫回輸出結構供上層重試或人工處理。
  • 陣列索引計算 i+int(j/10)+1+h-1-1 確保多批次資料不覆蓋。

效能與優化建議

  1. 游標改為 BULK COLLECT:將 SFMX 游標改用 BULK COLLECT LIMIT 1000 分批擷取,減少 Context Switch。
  2. 合併查詢:藥品/診療明細可用 UNION ALL 或單一查詢搭配 LEFT JOIN 一次取回,避免迴圈內逐筆 SELECT。
  3. 交易批次大小:目前固定 10 筆/批,建議依醫保介接規範調整為最大允許筆數,減少網路往返。
  4. 例外處理:加入 EXCEPTION WHEN OTHERS THEN 記錄錯誤堆疊至 Log 表,避免靜默失敗。

結語

此函數展示了醫療資訊系統中核心的醫保介接邏輯:資料蒐集、格式轉換、批次傳輸、錯誤回寫。透過現代化 PL/SQL 技術(BULK COLLECT、FORALL、集合操作)可大幅提升處理效能與穩定性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved