更新存储在Db2中的CLOB中的JSON数据

问题描述 投票:1回答:2

我想对存储在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
sql db2 clob
2个回答
1
投票

对于JSON数据,从Db2 11.1.3.3开始,使用SYSTOOLS.JSON_UPDATE更新JSON值

https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.swg.im.dbclient.json.doc/doc/r0070292.html

您将需要使用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 } }
        ]
     }
     }'
     ))

0
投票

一些正则表达式可能会解决您的问题..取决于您的完整问题有多复杂......例如

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
© www.soinside.com 2019 - 2024. All rights reserved.