【记一次项目上线的经历】(一)

本文讲述了在医院HIS系统项目中遇到的数据迁移问题,包括跨库数据获取、Navicat连接Oracle的环境配置、Oracle的dblink使用、数据一致性校验和业务理解的重要性。作者通过实例分享了在收费项目字典、套餐明细表处理中的错误及解决方案,强调了备份、验证和理解业务细节的重要性,并提到在数据更新时避免使用联表更新,推荐使用游标处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

故事背景

由于各种原因,客户的数据被他的软件公司掌握并拒不配合提供准确资料,而客户的数据运营人员又不管事,导致这个坑被我接了。

由于是医院HIS系统项目,主要需要的数据就是,收费项目字典,物价信息,库存,患者档案,核算类别,收费套餐主从表。

以下是导数据的踩坑经历

1跨库数据如何获取

当时我想到的是数据迁移工具,但是很多不太熟悉且时间有限就没采用,如果小伙伴有好的推荐可以给我评论。最后是用了Navicat的传输功能将表同步过来再处理。弊端就是不是实时同步的。

  1. navicat连接oracle的坑
    首先就是本地缺少oracle环境,链接数据库报错。
    最后发现是navicat缺少OCI环境。Navicat 12 安装instantclient_21_3的oracle环境即可

  2. oralce的链接数据库dblink(推荐)
    具体的可以百度关键字。设置好之后可以直接通过 表名@链接服务器名称获取跨库的数据

YPGL.XXXX@link_XXXX

2思考和理解比行动更重要

公司收费字典是设计成一个表,而客户公司是三个表对应,药品,诊疗,材料的收费项目。收费项目字典有个很重要的字段是代码,通过code医生可以快速找到项目,且这个字段不会重复。新旧数据的code要保持一致,第一个坑就是没有校验对方表数据的code是否重复,对方单独表中code是没有重复的,但是药品表的code会和诊疗项目表的code重复,导致后续发现已方数据中出现重复code,且数据都是通过code关联,导致一步错步步错,给后面大佬挖了一个大坑。因此特别是,关键的字段一定要校验是否重复

备份,备份,备份,每次大量更新万一逻辑写错就GG。所以请常用类似的备份表

CREATE TABLE HISBASE.CHARGE_ITEM_XXXXX_1201   AS
SELECT * FROM HISBASE.CHARGE_ITEMXXXXX

理解业务细节再去行动导收费套餐遇到的一个坑就是,套餐明细一般都是检验,检查项目,这些项目被我理所当然的认为都是归类于诊疗类。却没有想到检验检查的材料属于材料类。导致收费套餐明细表缺少很多材料的项目。
正确姿势是各自通过代码联表union all

insert into 套餐明细表(
)
select XXX  from 诊疗表
inner join XXX....
union all
insert into 套餐明细表(
)
select XXX  from 材料表

不要相信注释,多去验证
另外一个坑,就是对方表里有个字段 isUsed 注释叫做是否停用。只有开启和停用,我理所当然的理解成了状态,通过此字段控制药品是否启用。没想到最后发现停用的也可以是逻辑删除的意思,对方数据库存在一些重复的数据,其中很多是停用状态。

联表更新(NO)

MERGE INTO JKGL.表1  A  USING(
SELECT
		B.FADVCODE,
		SUM(B.FPRICE*B.FSL) AS MONEY
		FROM JKGL.表2 B
		GROUP BY 	B.FADVCODE
	) B
	ON(A.CODE = B.FADVCODE)
	WHEN MATCHED THEN
	UPDATE SET
			A.FEE_AMOUNT = B.MONEY 	--上期记录ID

游标(YES)

BEGIN
 FOR CUR_PRES_ITEM_REC IN ( 
SELECT
		B.FSTD,
		C.ID
		FROM  JKGL.XXXX@link_XXXX
		INNER JOIN HISBASE.CHARGE_ITEM C ON B.FMCODE=C.CODE WHERE TRIM(FSTD) IS NOT NULL   ) LOOP	 HISBASE.SP_PARSE_DOSE(CUR_PRES_ITEM_REC.FSTD,V_DOSE,V_DOSE_UNIT);
		 -- DBMS_OUTPUT.PUT_LINE(V_DOSE||'--'||V_DOSE_UNIT);
			update hisbase.CHARGE_ITEM_DRUG_INFO set
			  dose = V_DOSE
			, dose_unit = V_DOSE_UNIT
		  where ITEM_ID =  CUR_PRES_ITEM_REC.ID;
		 END LOOP;
		 END;

3大佬来救场

预知后事如何且听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值