تابع Json_Transform که در اوراکل نسخه 21c ارائه شد، امکان انجام تغییرات در JSON documentها را فراهم می سازد. این تابع عملکری مشابه با تابع JSON_MERGEPATCH دارد البته با قابلیتهای بسیار بیشتر.
با استفاده از تابع Json_Transform می توان آیتمهای موجود در JSON documentها را UPDATE(SET)، REMOVE و RENAME کرد و یا item جدیدی به آن اضافه نمود.
این تابع می تواند در دستور select و update استفاده شود که استفاده از آن در دستور select صرفا می تواند در خروجی دستور تغییر ایجاد کند و برای بروزرسانی پایدار باید از دستور update استفاده شود.
در ادامه با توضیح عملگرهای SET، INSERT، REMOVE و RENAME بیشتر با تابع Json_Transform آشنا خواهیم شد.
SET: با استفاده از عبارت SET می توان فیلدی را به JSON document اضافه و یا مقدار موجود را بروزرسانی کرد. برای مثال، از طریق کوئری زیر، به ستون ettelaat که حاوی Json Decument است، آیتم City را اضافه می کنیم(البته صرفا در خروجی دستور):
select json_transform(ettelaat,
set ‘$.City’ = ‘Tehran}’ returning clob pretty) as data
from usef.tbl_JSON_21c
where rownum = 1;
{
“First_Name” : “Vahid”,
“Last_Name” : “Usefzadeh”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “091111111117”
},
“City” : “Tehran}”
}
برای بروزرسانی اطلاعات جدول، باید از دستور update به جای دستور select استفاده کنیم:
SQL> update tbl_JSON_21c
2 set ettelaat = json_transform(ettelaat, set ‘$.City’ = ‘Tehran}’)
3 where id = 2;
1 row updated
SQL> select json_serialize(t.ettelaat) from tbl_JSON_21c t;
{
“First_Name” : “Vahid”,
“Last_Name” : “Usefzadeh”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “09128110897”
},
“City” : “Tehran}”
}
در صورتی که item از قبل موجود باشد، مقدار قبلی بروزرسانی خواهد شد:
select json_transform(ettelaat,
set ‘$.Last_Name’=’Firozjah}’
returning clob pretty) as data
from usef.tbl_JSON_21c
where rownum=1;
{
“First_Name” : “Vahid”,
“Last_Name” : “Firozjah}”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “091111111117”
}
}
INSERT: برای درج یک فیلد جدید در JSON DECUMENT می توان از عملگر INSERT استفاده کرد:
select json_transform(ettelaat,
insert ‘$.Last_Name2’=’Firozjah}’
returning clob pretty) as data
from usef.tbl_JSON_21c
where rownum=1;
{
“First_Name” : “Vahid”,
“Last_Name” : “Usefzadeh”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “09128110897”
},
“Last_Name2” : “Firozjah}”
}
در زمان استفاده از عبارت INSERT اگر item از قبل موجود باشد، دستور با خطا مواجه خواهد شد:
select json_transform(ettelaat,
insert ‘$.Last_Name’=’Firozjah}’
returning clob pretty) as data
from usef.tbl_JSON_21c
where rownum=1;
ORA-40763: existing value in JSON_TRANSFORM ()
REMOVE: برای حذف یک آیتم از عبارت REMOVE استفاده می شود:
select json_transform(ettelaat,
REMOVE ‘$.Last_Name’
returning clob pretty) as data
from usef.tbl_JSON_21c
where rownum=1;
{
“First_Name” : “Vahid”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “09128110897”
}
}
RENAME: برای تغییر نام یک فیلد می توان از عملگر RENAME استفاده کرد:
select json_transform(ettelaat,
rename ‘$.First_Name’ = ‘F_Name’
returning clob pretty) as data
from usef.tbl_JSON_12c_varchar
where rownum=1;
{
“Last_Name” : “Usefzadeh”,
“Contact” :
{
“Email” : “vahidusefzadeh@gmail.com”,
“Phone” : “09128110897”
},
“F_Name” : “Vahid”
}
Comment (1)