如何解决数据库转换后的xml空值问题

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

如何解决数据库转换后的xml空值问题

Oracle转sql server或者sql server不同版本之间的转换,可能会遇到转换前的xml空值转换后变成空字符串的情况。对于星空来说,空字符串的xml程序可能会因为读取不到数据而报错,因为二者是截然不同的。例如:

image.webp

第一行为null值,第二行为空字符串

接下来在这里分享将空字符串的xml转换为null值xml的方案。直接暴力将目标数据库中的xml字段中的空字符串修改为null值,看似可以解决这个问题,但是也有可能矫枉过正——将原本应该是空字符串的字段修改为null值了。

下面以oracle转sql 为例来说明处理的过程:

1、创建表chl_havexml用来存储类型为xml类型的表名和字段(oracle数据库执行)

create table chl_havexml(table_name varchar2(100),column_name varchar2(100),
fkeycount number,fkeyfield varchar2(100),fnullvaluecount number)

2、收集类型为xml类型的表名和字段(oracle数据库执行)

insert into chl_havexml(table_name,column_name,fkeycount,fkeyfield,fnullvaluecount)
select table_name,column_name,0,'',0
from user_tab_cols  where data_type='XMLTYPE'

3、统计一下这些xml字段所属表的主键数量(oracle库执行)

update chl_havexml set fkeycount=0;
merge into chl_havexml a using 
(select t1.table_name,count(column_name)  fcount
from user_constraints t1 join user_cons_columns t2 on t1.constraint_name=t2.constraint_name
 where constraint_type ='P'
group by t1.table_name) b on (a.table_name=b.table_name )
when matched then update 
set a.fkeycount=b.fcount;

4、收集单一主键的表的主键字段名(oracle库执行)

merge into chl_havexml a using 
(select t1.table_name,column_name 
from user_constraints t1 join user_cons_columns t2 on t1.constraint_name=t2.constraint_name
 where constraint_type ='P' and t1.table_name in  (select table_name from chl_havexml  where   fkeycount=1)
) b 
on (a.table_name=b.table_name)
when matched then update 
set a.fkeyfield=b.column_name

5、动态凭借统计控制数据量sql,将查询到的sql复制出来执行(oracle库执行)

select 'update chl_havexml set fnullvaluecount=
(select count(1) from '||table_name||' where '||column_name||' is null)
where table_name='''||table_name||''' and column_name='''||column_name||''';' from  chl_have

6、查看这些待xml字段的表有多少个是存在空值数据的(oracle库执行)

select * from  chl_havexml  where fnullvaluecount<>0

7、查看存在空值数据的表不是单一主键的(oracle库执行)

select * from  chl_havexml  where fnullvaluecount<>0  and fkeycount<>1

视图的话可以不用处理,因为基表处理了视图自然也自动维护好了

像星空多语言表,有时候是两个主键,这些数据要单独处理了

8、查看存在空值数据的表是单一主键的(oracle库执行)

select * from  T_MDL_FORMMENUTPL_L where fxml is null

9、编写批量更新的SQL(oracle库执行)

select 'update    '||table_name||' set '||column_name||'=null where '||fkeyfield||' in
(select '||fkeyfield||' from openquery(ORC,''select '||fkeyfield||' from '||table_name||' where '||column_name||' is null''))
and convert(varchar(max),'||column_name||')='''';
' from chl_havexml where  fnullvaluecount<>0  and fkeycount=1

将查询的结果到sql server库执行。需要注意的是,这里面需要建立sql server到oracle的链接服务器,本实例中ORC为链接服务器的名称(关于如何建立sql server到oracle的链接服务器可以参考另一个帖子:

https://wenku.my7c.com/article/243415848155361536



--DROP TABLE chl_tablerecord
create table chl_tablerecord(ftablename varchar(300),fcount int,fcolumn_count int,fkeycount int);
insert into  chl_tablerecord(ftablename,fcolumn_count)
select a.table_name,b.fcount from user_tables a join (select table_name,count(1) fcount from user_tab_cols group by table_name) b on a.table_name=b.table_name
where a.table_name not  like 'TMP%' and a.table_name not like 'TM%'  and a.table_name not like 'MLOG%'    and a.table_name not like '%$%'  
and a.table_name not in ( select object_name from user_objects where object_type='MATERIALIZED VIEW'  );
update chl_tablerecord set fkeycount=0;
merge into chl_tablerecord a using 
(select t1.table_name,count(column_name)  fcount
from user_constraints t1 join user_cons_columns t2 on t1.constraint_name=t2.constraint_name
 where constraint_type ='P'
group by t1.table_name) b on (a.ftablename=b.table_name )
when matched then update 
set a.fkeycount=b.fcount;
COMMIT;
/
--统计数据量
declare 
var_ftablename varchar2(300);
cursor chl_cur is select  ftablename from chl_tablerecord;
begin
open chl_cur;
fetch chl_cur into var_ftablename;
while chl_cur%found loop  --使用游标属性
execute immediate 'update chl_tablerecord set fcount=(select count(1) from '||var_ftablename||') where ftablename='''||var_ftablename||'''' ;
fetch chl_cur into var_ftablename;
end loop;
close chl_cur;
end;
/
COMMIT;


如何解决数据库转换后的xml空值问题

Oracle转sql server或者sql server不同版本之间的转换,可能会遇到转换前的xml空值转换后变成空字符串的情况。对于星空来说,空字符串的x...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息