Обновление данных JSON, хранящихся в CLOB в Db2 - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу выполнить обновление данных JSON, хранящихся в столбце CLOB в таблице Db2.

Например, часть данных CLOB в настоящее время выглядит следующим образом

 "commercialOfferPersonRoleList" : [ {
          "commercialOfferPersonRolePK" : {
            "commercialOfferId" : 100000000008817
          },
          "personId" : {
            "personID" : "1000019579"
          }
         },
         "roleBusinessPartner" : {
          "value" : 1
        }
       ]

и после обновления я хочу, чтобы это выглядело так

"commercialOfferPersonRoleList" : [ {
              "commercialOfferPersonRolePK" : {
                "commercialOfferId" : 100000000008817
              },
              "personId" : {
                "personID" : "1000019579"
              },
              "roleBusinessPartner" : {
              "value" : 1
               }
             }
            ]

Когда наше приложение попадает в список, значения заполняются в соответствующих тегах, и это значение CLOB сохраняется в таблице.Из-за некоторых изменений мне нужно обновить значения COLB для почти 10 тыс. Записей аналогичным образом.

Есть ли способ написания универсального сценария для реализации такого рода изменений?

Ранее я использовал xquery для обновления структуры XML, но здесь нам нужно изменить положение тега вдольс соответствующим значением, и на этот раз это просто данные JSON

, просто для упрощения моя цель:

before Update :

                            commercialOfferPersonRolePK
                                         |
               ----------------------------------------------------
               |                                                  |
    -----------------------------                            roleBusinessPartner
    |                           |
    commercialOfferId         personId

после обновления:

  commercialOfferPersonRolePK
           |                                                  
----------------------------------------------------------                            
|                           |                            |
commercialOfferId         personId                   roleBusinessPartner

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Регулярное выражение может решить вашу проблему ... зависит от того, насколько сложна ваша полная проблема ... например,

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
0 голосов
/ 14 сентября 2018

Для данных 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

Вам нужно будет преобразовать данные в BSON с помощью SYSTOOLS.JSONTOBSON изатем снова с 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 } }
        ]
     }
     }'
     ))
...