“GraphQL یک پرس و جو و دستکاری داده برای API است ، که به client امکان می دهد داده های مورد نیاز خود را تعیین کند (” داده های اجرای داده “). یک سرور GraphQL می تواند یک منبع جداگانه برای یک پرس و جو ایجاد کند و نتایج را در یک نمودار یکپارچه ارائه دهد ، بنابراین به هر پایگاه داده یا موتور ذخیره سازی گره خورده است. ”
آشنایی با قابلیت های پایگاه داده Oracle 23ai
ما برخی از جدول ها را برای کار با آنها ایجاد و جمع می کنیم.
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
);
create index emp_dept_fk_i on emp(deptno);
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);
insert into emp values (7499,’ALLEN’,’SALESMAN’,7698,to_date(’20-2-1981′,’dd-mm-yyyy’),1600,300,30);
insert into emp values (7521,’WARD’,’SALESMAN’,7698,to_date(’22-2-1981′,’dd-mm-yyyy’),1250,500,30);
insert into emp values (7566,’JONES’,’MANAGER’,7839,to_date(‘2-4-1981′,’dd-mm-yyyy’),2975,null,20);
insert into emp values (7654,’MARTIN’,’SALESMAN’,7698,to_date(’28-9-1981′,’dd-mm-yyyy’),1250,1400,30);
insert into emp values (7698,’BLAKE’,’MANAGER’,7839,to_date(‘1-5-1981′,’dd-mm-yyyy’),2850,null,30);
insert into emp values (7782,’CLARK’,’MANAGER’,7839,to_date(‘9-6-1981′,’dd-mm-yyyy’),2450,null,10);
insert into emp values (7788,’SCOTT’,’ANALYST’,7566,to_date(’13-JUL-87′,’dd-mm-rr’)-85,3000,null,20);
insert into emp values (7839,’KING’,’PRESIDENT’,null,to_date(’17-11-1981′,’dd-mm-yyyy’),5000,null,10);
insert into emp values (7844,’TURNER’,’SALESMAN’,7698,to_date(‘8-9-1981′,’dd-mm-yyyy’),1500,0,30);
insert into emp values (7876,’ADAMS’,’CLERK’,7788,to_date(’13-JUL-87′, ‘dd-mm-rr’)-51,1100,null,20);
insert into emp values (7900,’JAMES’,’CLERK’,7698,to_date(‘3-12-1981′,’dd-mm-yyyy’),950,null,30);
insert into emp values (7902,’FORD’,’ANALYST’,7566,to_date(‘3-12-1981′,’dd-mm-yyyy’),3000,null,20);
insert into emp values (7934,’MILLER’,’CLERK’,7782,to_date(’23-1-1982′,’dd-mm-yyyy’),1300,null,10);
commit;
عملکرد جدول GraphQL به ما امکان می دهد تا از داده های رابطه ای با استفاده از نحو GraphQL استفاده کنیم.
در مثال زیر جدول DEPT را پرس و جو می کنیم و خروجی مورد نیاز را با استفاده از GraphQL تعریف می کنیم. GraphQL ساختار سند JSON را که بازگردانده خواهد شد ، نشان می دهد و ستون هایی را که هر عنصر را ارائه می دهد ، ارجاع می دهد.
select * from graphql (‘
department : dept
{
departmentNumber: deptno
departmentName : dname
location : loc
}’);
JSON_OBJECT(‘DEPARTMENTNUMBER’VALUE”DEPTNO”,’DEPARTMENTNAME’VALUE”DNAME”,’LOCATI
——————————————————————————–
{“departmentNumber”:10,”departmentName”:”ACCOUNTING”,”location”:”NEW YORK”}
{“departmentNumber”:20,”departmentName”:”RESEARCH”,”location”:”DALLAS”}
{“departmentNumber”:30,”departmentName”:”SALES”,”location”:”CHICAGO”}
{“departmentNumber”:40,”departmentName”:”OPERATIONS”,”location”:”BOSTON”}
SQL>
ما می توانیم کاری مشابه با جدول EMP انجام دهیم.
select * from graphql(‘
employees : emp
{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
hireDate : hiredate
}’);
JSON_OBJECT(‘EMPLOYEENUMBER’VALUE”EMPNO”,’EMPLOYEENAME’VALUE”ENAME”,’JOB’VALUE”JOB”,’SALARY’VALUE”SAL”,’HIREDATE’VALUE”HIREDATE”NULLONNULLEMPTYONNOROWSRETURNINGJSONETAG)
——————————————————————————————————————————————————————————————————–
{“employeeNumber”:7369,”employeeName”:”SMITH”,”job”:”CLERK”,”salary”:800,”hireDate”:”1980-12-17T00:00:00″}
{“employeeNumber”:7499,”employeeName”:”ALLEN”,”job”:”SALESMAN”,”salary”:1600,”hireDate”:”1981-02-20T00:00:00″}
{“employeeNumber”:7521,”employeeName”:”WARD”,”job”:”SALESMAN”,”salary”:1250,”hireDate”:”1981-02-22T00:00:00″}
{“employeeNumber”:7566,”employeeName”:”JONES”,”job”:”MANAGER”,”salary”:2975,”hireDate”:”1981-04-02T00:00:00″}
{“employeeNumber”:7654,”employeeName”:”MARTIN”,”job”:”SALESMAN”,”salary”:1250,”hireDate”:”1981-09-28T00:00:00″}
{“employeeNumber”:7698,”employeeName”:”BLAKE”,”job”:”MANAGER”,”salary”:2850,”hireDate”:”1981-05-01T00:00:00″}
{“employeeNumber”:7782,”employeeName”:”CLARK”,”job”:”MANAGER”,”salary”:2450,”hireDate”:”1981-06-09T00:00:00″}
{“employeeNumber”:7788,”employeeName”:”SCOTT”,”job”:”ANALYST”,”salary”:3000,”hireDate”:”1987-04-19T00:00:00″}
{“employeeNumber”:7839,”employeeName”:”KING”,”job”:”PRESIDENT”,”salary”:5000,”hireDate”:”1981-11-17T00:00:00″}
{“employeeNumber”:7844,”employeeName”:”TURNER”,”job”:”SALESMAN”,”salary”:1500,”hireDate”:”1981-09-08T00:00:00″}
{“employeeNumber”:7876,”employeeName”:”ADAMS”,”job”:”CLERK”,”salary”:1100,”hireDate”:”1987-05-23T00:00:00″}
{“employeeNumber”:7900,”employeeName”:”JAMES”,”job”:”CLERK”,”salary”:950,”hireDate”:”1981-12-03T00:00:00″}
{“employeeNumber”:7902,”employeeName”:”FORD”,”job”:”ANALYST”,”salary”:3000,”hireDate”:”1981-12-03T00:00:00″}
{“employeeNumber”:7934,”employeeName”:”MILLER”,”job”:”CLERK”,”salary”:1300,”hireDate”:”1982-01-23T00:00:00″}
۱۴ rows selected.
SQL>
۱
در مثال زیر ما یک سند JSON حاوی اطلاعات بخش را برمی گردانیم ، که شامل اطلاعات مربوط به کارمندان آن بخش است.
select * from graphql(‘
department : dept
{
departmentNumber: deptno
departmentName : dname
location : loc
employees : emp
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
}’);
JSON_OBJECT(‘DEPARTMENTNUMBER’VALUE”DEPTNO”,’DEPARTMENTNAME’VALUE”DNAME”,’LOCATION’VALUE”LOC”,’EMPLOYEES’VALUE(SELECTJSON_ARRAYAGG(JSON_OBJECT(‘EMPLOYEENUMBER’VALUE”EMPNO”,’EMPLOYEENAME’VALUE”ENAME”,
——————————————————————————————————————————————————————————————————–
{“departmentNumber”:10,”departmentName”:”ACCOUNTING”,”location”:”NEW YORK”,”employees”:[{“employeeNumber”:7782,”employeeName”:”CLARK”,”job”:”MANAGER”,”salary”:2450},{“employeeNumber”:7839,”employeeNam
e”:”KING”,”job”:”PRESIDENT”,”salary”:5000},{“employeeNumber”:7934,”employeeName”:”MILLER”,”job”:”CLERK”,”salary”:1300}]}
{“departmentNumber”:20,”departmentName”:”RESEARCH”,”location”:”DALLAS”,”employees”:[{“employeeNumber”:7369,”employeeName”:”SMITH”,”job”:”CLERK”,”salary”:800},{“employeeNumber”:7566,”employeeName”:”JON
ES”,”job”:”MANAGER”,”salary”:2975},{“employeeNumber”:7788,”employeeName”:”SCOTT”,”job”:”ANALYST”,”salary”:3000},{“employeeNumber”:7876,”employeeName”:”ADAMS”,”job”:”CLERK”,”salary”:1100},{“employeeNum
ber”:7902,”employeeName”:”FORD”,”job”:”ANALYST”,”salary”:3000}]}
{“departmentNumber”:30,”departmentName”:”SALES”,”location”:”CHICAGO”,”employees”:[{“employeeNumber”:7499,”employeeName”:”ALLEN”,”job”:”SALESMAN”,”salary”:1600},{“employeeNumber”:7521,”employeeName”:”W
ARD”,”job”:”SALESMAN”,”salary”:1250},{“employeeNumber”:7654,”employeeName”:”MARTIN”,”job”:”SALESMAN”,”salary”:1250},{“employeeNumber”:7698,”employeeName”:”BLAKE”,”job”:”MANAGER”,”salary”:2850},{“emplo
yeeNumber”:7844,”employeeName”:”TURNER”,”job”:”SALESMAN”,”salary”:1500},{“employeeNumber”:7900,”employeeName”:”JAMES”,”job”:”CLERK”,”salary”:950}]}
{“departmentNumber”:40,”departmentName”:”OPERATIONS”,”location”:”BOSTON”,”employees”:[]}
SQL>
در مثال قبلی ، پیوستن مورد نیاز به دلیل تعریف کلید خارجی به طور خودکار تشخیص داده شد. ما می توانیم صریحاً ستون کلید خارجی را با استفاده از دستورالعمل Link ارجاع دهیم.
select * from graphql(‘
department : dept
{
departmentNumber: deptno
departmentName : dname
location : loc
employees : emp @link (to : [“deptno”])
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
}’);
این بار ما اطلاعات کارمندان از جمله نام بخش آنها را با استفاده از داده های بخش باز می گردانیم.
select * from graphql(‘
employees : emp
{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
dept @unnest
{
departmentName : dname
}
}’);
JSON_OBJECT(‘EMPLOYEENUMBER’VALUE”EMPNO”,’EMPLOYEENAME’VALUE”ENAME”,’JOB’VALUE”JOB”,’SALARY’VALUE”SAL”,UNNEST(SELECTJSON_OBJECT(‘DEPARTMENTNAME’VALUE”DNAME”NULLONNULLEMPTYONNOROWSRETURNINGJSONETAG)FR
——————————————————————————————————————————————————————————————————–
{“employeeNumber”:7369,”employeeName”:”SMITH”,”job”:”CLERK”,”salary”:800,”departmentName”:”RESEARCH”}
{“employeeNumber”:7499,”employeeName”:”ALLEN”,”job”:”SALESMAN”,”salary”:1600,”departmentName”:”SALES”}
{“employeeNumber”:7521,”employeeName”:”WARD”,”job”:”SALESMAN”,”salary”:1250,”departmentName”:”SALES”}
{“employeeNumber”:7566,”employeeName”:”JONES”,”job”:”MANAGER”,”salary”:2975,”departmentName”:”RESEARCH”}
{“employeeNumber”:7654,”employeeName”:”MARTIN”,”job”:”SALESMAN”,”salary”:1250,”departmentName”:”SALES”}
{“employeeNumber”:7698,”employeeName”:”BLAKE”,”job”:”MANAGER”,”salary”:2850,”departmentName”:”SALES”}
{“employeeNumber”:7782,”employeeName”:”CLARK”,”job”:”MANAGER”,”salary”:2450,”departmentName”:”ACCOUNTING”}
{“employeeNumber”:7788,”employeeName”:”SCOTT”,”job”:”ANALYST”,”salary”:3000,”departmentName”:”RESEARCH”}
{“employeeNumber”:7839,”employeeName”:”KING”,”job”:”PRESIDENT”,”salary”:5000,”departmentName”:”ACCOUNTING”}
{“employeeNumber”:7844,”employeeName”:”TURNER”,”job”:”SALESMAN”,”salary”:1500,”departmentName”:”SALES”}
{“employeeNumber”:7876,”employeeName”:”ADAMS”,”job”:”CLERK”,”salary”:1100,”departmentName”:”RESEARCH”}
{“employeeNumber”:7900,”employeeName”:”JAMES”,”job”:”CLERK”,”salary”:950,”departmentName”:”SALES”}
{“employeeNumber”:7902,”employeeName”:”FORD”,”job”:”ANALYST”,”salary”:3000,”departmentName”:”RESEARCH”}
{“employeeNumber”:7934,”employeeName”:”MILLER”,”job”:”CLERK”,”salary”:1300,”departmentName”:”ACCOUNTING”}
۱۴ rows selected.
SQL>
دو روش برای ایجاد دیدگاه های دوگانگی json وجود دارد.
پشتیبانی GraphQL به Oracle Rest Data Services (ORDS) نسخه ۲۳٫۳ اضافه شد.