我想对存储在Db2表中的CLOB列中的JSON数据执行更新。
例如,CLOB数据的一部分当前看起来像这样
"commercialOfferPersonRoleList" : [ {
"commercialOfferPersonRolePK" : {
"commercialOfferId" : 100000000008817
},
"personId" : {
"personID" : "1000019579"
}
},
"roleBusinessPartner" : {
"value" : 1
}
]
更新后,我希望它看起来像这样
"commercialOfferPersonRoleList" : [ {
"commercialOfferPersonRolePK" : {
"commercialOfferId" : 100000000008817
},
"personId" : {
"personID" : "1000019579"
},
"roleBusinessPartner" : {
"value" : 1
}
}
]
当我们的应用程序被命中时,值将填充在各自的标记中,并且此CLOB值将存储在表中。由于一些变化,我需要以类似的方式更新几乎10k记录的COLB值。
有没有办法编写通用脚本来实现这种改变?
我之前使用xquery来更新XML结构,但是这里我们需要更改标记的位置以及相应的valum,这次是JSON数据
为了简化,我的目标是:
before Update :
commercialOfferPersonRolePK
|
----------------------------------------------------
| |
----------------------------- roleBusinessPartner
| |
commercialOfferId personId
更新后:
commercialOfferPersonRolePK
|
----------------------------------------------------------
| | |
commercialOfferId personId roleBusinessPartner
对于JSON数据,从Db2 11.1.3.3开始,使用SYSTOOLS.JSON_UPDATE
更新JSON值
您将需要使用SYSTOOLS.JSONTOBSON
将数据转换为BSON,然后在更新后再使用SYSTOOLS.BSONTOJOSN
返回
例如。这样的事情
values
SYSTOOLS.BSON2JSON(
SYSTOOLS.JSON_UPDATE(
SYSTOOLS.JSON2BSON(
'{ "commercialOfferPersonRoleList" :
[
{ "commercialOfferPersonRolePK" : { "commercialOfferId" : 100000000008817 }
, "personId" : { "personID" : "1000019579" }
}
, {"roleBusinessPartner" : { "value" : 1 } }
]
}')
, '{ $set:
{ "commercialOfferPersonRoleList" :
[
{"commercialOfferPersonRolePK" : { "commercialOfferId" : 100000000008817 } }
, {"personId" : { "personID" : "1000019579" } }
, {"roleBusinessPartner" : { "value" : 1 } }
]
}
}'
))
一些正则表达式可能会解决您的问题..取决于您的完整问题有多复杂......例如
create table clob(c clob(1M))
;
insert into clob values ('{ "commercialOfferPersonRoleList" :
[
{"commercialOfferPersonRolePK" : { "commercialOfferId" : 100000000008817 }
, "personId" : { "personID" : "1000019579" } }
, {"roleBusinessPartner" : { "value" : 1 } }
]
}')
;
select regexp_replace(c,'(,\s*)("personId"(.*?\}){1}?)\s*\}', '} \1 { \2 }', 1, 0, 'n') from clob;
返回
{ "commercialOfferPersonRoleList" :
[
{"commercialOfferPersonRolePK" : { "commercialOfferId" : 100000000008817 }
} , { "personId" : { "personID" : "1000019579" } }
, {"roleBusinessPartner" : { "value" : 1 } }
]
}
所以你可以这样做,例如
update clob set c = regexp_replace(c,'(,\s*)("personId"(.*?\}){1}?)\s*\}', '} \1 { \2 }',1,0,'n')
where regexp_like (c,'(,\s*)("personId"(.*?\}){1}?)\s*\}' ,1 ,'n');
我建议您在实际运行更新之前使用SYSTOOLS.JSON2BSON
检查转换的blob是否仍然是有效的JSON。
在这个例子中,我可以运行这个来检查更新列仍然是有效的JSON
select SYSTOOLS.BSON2JSON(SYSTOOLS.JSON2BSON(c)) from clob