工作中遇到的问题

关于处理自己给自己挖的坑

问题背景:有一张差旅申请表,我需要对两个字段进行操作,一个是同行人ID字段,一个是同行人名称字段,这两个字段都是通过逗号分割数据的。以前的数据,在算法上,我们会默认在人数上加上申请人,但是后期觉得不合理,申请人可能存在不出差的情况。但是我们需要对旧数据进行处理,需要在原来的同行人的基础上加上申请人。但是我在处理的时候分成了两种情况,一种是同行人字段本身为空的时候,我们需要将同行人ID和名称字段的值更新为申请人的名称和ID;第二种是同行人字段本身有值,这个时候我们需要在原数据的基础上加上申请人的ID和字段,并用逗号分割。

批量更新的sql如下:

 -- 更新差旅申请出差同行人ID、名称字段

--先执行这个语句,处理旧数据存在同行人的数据
UPDATE Busi_t_Evectionaudit w 
SET w.associate = (w.travellername_  ||','||  w.associate) ,
w.associateid = (w.traveller ||','||  w.associateid)
where w.associate is not null

--再执行以下语句,处理旧数据不存在同行人的数据

UPDATE Busi_t_Evectionaudit w 
SET w.associate = w.travellername_,
w.associateid = w.traveller
where w.associate is null

问题出在:我将两条执行语句的顺序执行反了,并且我提交事务后没有及时对数据进行还原,导致数据无法还原了

如果能够及时还原数据,应该如下处理:

   --开启行移动功能 
 alter table 表名 enable row movement
 --恢复表数据
 select * from 表名 as of timestamp to_timestamp(还原时间点,'yyyy-mm-dd hh24:mi:ss') //查询还原时间点数据
 flashback table 表名 to timestamp to_timestamp('还原时间点','yyyy-mm-dd hh24:mi:ss')
 --关闭行移动功能 ( 千万别忘记 )
 alter table 表名 disable row movement

后来出现了错误数据:同行人名称和同行人ID存在逗号隔开的重复值,由于申请人只有一个人,所以错误数据有一个特征,就是同行人名称和ID都是A,A格式的数据,但是我不想使用存储过程(其实是自己不会使用存储过程),于是我通过一下方法解决了我的问题

思路:

  1. 找出所有同行人ID为A,A格式的数据
  2. 将同行人ID和名称改为申请人ID和名称

难点:
对于我而言,难点在于如何找出错误数据,然后我针对我的错误数据的特点,找数据中逗号个数为1的数据,并且逗号前面字符串等于字符串后面的数据

找出错误数据的sql

select w.keyid,w.associate,w.associateid,w.driverid,w.driver,w.totalcount from Busi_t_Evectionaudit w 
where (length(w.associateid)-length(replace(w.associateid,',',''))) = 1
and instr(','||substr(w.associateid,instr(w.associateid,',')+1,length(w.associateid)-1)||',',','||substr(w.associateid,1,instr(w.associateid,',')-1)||',')>0

最后通过自己的努力,终于把自己给自己挖的坑填好了!

你可能感兴趣的:(工作中遇到的问题)