از نسخه Oracle 23ai به بعد، تابع JSON_ARRAY قابلیت دریافت یک Subquery به عنوان ورودی را دارد. این بهروزرسانی باعث تطابق بیشتر این تابع با استاندارد SQL/JSON شده و انعطافپذیری بیشتری در کار با دادههای JSON ارائه میدهد.
برای مثالهای این مقاله، ابتدا دو جدول emp و dept را ایجاد میکنیم که دادههای مربوط به بخشها و کارکنان را ذخیره میکنند:
drop table if exists emp purge;
drop table if exists dept purge;
create table dept (
deptno number(2) constraint pk_dept primary key,
dname varchar2(14),
loc varchar2(13)
);
create table emp (
empno number(4) constraint pk_emp primary key,
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2) constraint fk_deptno references dept
);
با استفاده از دستورات زیر، دادههای نمونهای را به جداول اضافه میکنیم:
insert into dept values (10,’ACCOUNTING’,’NEW YORK’);
insert into dept values (20,’RESEARCH’,’DALLAS’);
insert into dept values (30,’SALES’,’CHICAGO’);
insert into dept values (40,’OPERATIONS’,’BOSTON’);
insert into emp values (7369,’SMITH’,’CLERK’,7902,to_date(’17-12-1980′,’dd-mm-yyyy’),800,null,20);
— سایر دادههای کارکنان نیز در ادامه به جدول اضافه شدهاند
commit;
بررسی JSON_ARRAY در نسخههای قبلی Oracle
تابع JSON_ARRAY برای اولین بار در Oracle 12.1 معرفی شد. این تابع امکان تبدیل لیستی از مقادیر به فرمت JSON را فراهم میکند:
select json_array(empno, ename)
from emp
where deptno = 10;
خروجی:
[۷۷۸۲,”CLARK”]
[۷۸۳۹,”KING”]
[۷۹۳۴,”MILLER”]
در نسخههای اولیه، امکان استفاده از Subquery در تابع JSON_ARRAY وجود نداشت، که کار با دادههای پیچیدهتر را دشوار میکرد. برای مثال، برای ایجاد سند JSON یک بخش به همراه کارکنان، مجبور به استفاده از JSON_ARRAYAGG بودیم:
select json_serialize(
json_object(‘department_number’ : d.deptno,
‘department_name’ : d.dname,
’employees’ : (select json_arrayagg(json_object(’employee_number’ : e.empno,
’employee_name’ : e.ename))
from emp e
where e.deptno = d.deptno)
)
pretty) as output
from dept d
where d.deptno = 10;
خروجی:
{
“department_number” : 10,
“department_name” : “ACCOUNTING”,
“employees” :
[
{
“employee_number” : 7782,
“employee_name” : “CLARK”
},
{
“employee_number” : 7839,
“employee_name” : “KING”
},
{
“employee_number” : 7934,
“employee_name” : “MILLER”
}
]
}
قابلیتهای جدید در Oracle 23ai
در Oracle 23ai، امکان استفاده مستقیم از Subquery در JSON_ARRAY اضافه شده است. این ویژگی، فرآیند ایجاد JSON شامل دادههای تو در تو را سادهتر کرده است. اکنون میتوانیم نمونه قبلی را به صورت زیر بازنویسی کنیم:
select json_serialize(
json_object(‘department-number’ : d.deptno,
‘department-name’ : d.dname,
’employees’ : json_array(select json_object(’employee-number’ : e.empno,
’employee-name’ : e.ename)
from emp e
where e.deptno = d.deptno)
)
pretty) as output
from dept d
where d.deptno = 10;
خروجی:
json
Copy code
{
“department-number” : 10,
“department-name” : “ACCOUNTING”,
“employees” :
[
{
“employee-number” : 7782,
“employee-name” : “CLARK”
},
{
“employee-number” : 7839,
“employee-name” : “KING”
},
{
“employee-number” : 7934,
“employee-name” : “MILLER”
}
]
}
استفاده از تابع JSON_ARRAY با Subquery در Oracle 23ai امکان کار با دادههای JSON پیچیده را بهطور بهینهتری فراهم کرده است. این قابلیت به توسعهدهندگان کمک میکند تا با کاهش پیچیدگی کد، دادههای JSON مورد نیاز خود را به راحتی و به صورت استاندارد تولید کنند.