Update بخشی از اطلاعات JSON با کمک تابع JSON_MERGEPATCH – اوراکل 19c

قصد داریم در جدول MYTBL، بخشی از اطلاعات ستون ettelaat که از نوع JSON می باشد را update کنیم به این صورت که مقدار داده first_name، برای id شماره 1، از Vahid به RamTollah تغییر کند:

SQL> select id,ettelaat from mytbl d where id=1;

        ID ETTELAAT

———- ——————————

   1          {

               “first_name“:”Vahid“,

               “last_name“:”Usefzadeh“,

               “Salary“:”500000“,

               “phone“:”09128110000

               }

با انجام بروزرسانی به شیوه رایج در اوراکل، با خطا مواجه خواهیم شد:

SQL> update MYTBL  d set d.ettelaat.first_name =’RamTollah’ where  d.ettelaat.first_name=’Vahid’ and id=1;

ORA-40557: cannot update a JSON value

این کار تا قبل از نسخه 19c، به روش زیر قابل انجام بود:

SQL> update MYTBL  d set d.ettelaat =’

    {

    “first_name”:”RamTollah”,

    “last_name”:”Usefzadeh”,

    “Salary”:”500000”,

    “phone”:”09128110000”

    }’

     where  d.ettelaat.first_name=’Vahid’ and id=1;

1 row updated

SQL> commit;

Commit complete

SQL> select d.id,d.ettelaat.first_name,d.ettelaat.last_name from MYTBL d where  d.ettelaat.first_name=’RamTollah’;

        ID FIRST_NAME   LAST_NAME

———- ———— ———–

1           RamTollah Usefzadeh

با آمدن نسخه 19c، تابعی به نام json_mergepatch ارائه شد که ویرایش اطلاعات JSON را ساده تر می کند. برای مثال با اجرای دستور زیر، first_name به RamTollah تغییر خواهد کرد:

SQL> update mytbl d

set ettelaat = json_mergepatch(ettelaat,

‘{

“first_name” : “RamTollah”

  }’)

   where d.ettelaat.first_name=’Vahid’ and id=1;

1 row updated

SQL> commit;

Commit complete

SQL> select d.id,d.ettelaat.first_name,d.ettelaat.last_name from MYTBL d where  d.ettelaat.first_name=’RamTollah’;

        ID FIRST_NAME   LAST_NAME

———- ———— ———–

1            RamTollah Usefzadeh

همچنین می توان از طریق این تابع، propertyهای JSON را در سطح یک فیلد و یا ستون حذف کرد برای مثال با دستور زیر، last_name را از اطلاعات id=1 حذف می کنیم:

SQL> update json_tbl d

set ettelaat = json_mergepatch(ettelaat,

‘{“last_name”:null}’)

         where   id=1;

1 row updated

SQL> commit;

Commit complete

SQL> select * from json_tbl where id=1;

ID                ETTELAAT

— ——————————————————

1  {“first_name”:”RamTollah”,”Salary”:”500000”,”phone”:”09128110000”}

علاو بر حذف فیلد، می توانیم فیلدی با نام age را به اطلاعات فوق اضافه کنیم:

SQL> update json_tbl d

set ettelaat = json_mergepatch(ettelaat,

‘{

                    “Age”:”30

          }’)

         where   id=1;

1 row updated

SQL>select ETTELAAT from json_tbl where id=1;

ETTELAAT                                                                                              

——————————————————————————   

{“first_name”:”RamTollah”,”Salary”:”500000”,”phone”:”09128110000”,”Age”:30}              

علاوه بر دستور update، در دستور select هم می توان از این تابع استفاده کرد تا از این طریق اطلاعاتی که در خروجی نمایش داده می شوند را ویرایش کرد. برای مثال، با کمک این تابع، فیلد Salary را در خروجی دستور select حذف می کنیم:

SQL> select json_mergepatch(ettelaat, ‘{“Salary”:null}’) ettelaat from json_tbl where id=1;

ETTELAAT                                                                                               

——————————————————————————    

{“first_name”:”RamTollah”,”phone”:”09128110000”}    1

نکته پایانی:

در تابع json_mergepatch معمولا در پارامتر اول نام ستونی از جدول تعیین می شود(در مثال فوق، ستون ettelaat) اما به جای استفاده از نام ستون، می توان عبارت JSON را قرار داد البته اگر قسمتی از محتویات JSON در این پارامتر ورودی حذف شود و در ورودی دوم هم به آن اشاره ای نشده باشد، به صورت کلی از اطلاعات JSON حذف خواهد شد:

SQL> select ET1 from myt;

ET1

—————————————————————-

{“first_name“:”vahid”,”last_name“:”usefzadeh”,”Salary“:”500000”}

 

SQL> select json_mergepatch(‘

{  “last_name“: “usefzadeh“,

   “Salary“: “remove“}’,

‘{ “Salary“:  null,

    “Test“: “ttttttt“}’) ettelaat

  from myt

 where id = 1;

ETTELAAT

———————————————

{“last_name“:”usefzadeh”,”Test“:”ttttttt”}

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.