故事背景
由于各种原因,客户的数据被他的软件公司掌握并拒不配合提供准确资料,而客户的数据运营人员又不管事,导致这个坑被我接了。
由于是医院HIS系统项目,主要需要的数据就是,收费项目字典,物价信息,库存,患者档案,核算类别,收费套餐主从表。
以下是导数据的踩坑经历
1跨库数据如何获取
当时我想到的是数据迁移工具,但是很多不太熟悉且时间有限就没采用,如果小伙伴有好的推荐可以给我评论。最后是用了Navicat的传输功能将表同步过来再处理。弊端就是不是实时同步的。
-
navicat连接oracle的坑
首先就是本地缺少oracle环境,链接数据库报错。
最后发现是navicat缺少OCI环境。Navicat 12 安装instantclient_21_3的oracle环境即可 -
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大佬来救场
预知后事如何且听下回分解。