قصد داریم در جدول 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”}
Comments (2)