مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۳ دقیقه·۱ ماه پیش

بررسی Graphql در پایگاه داده Oracle 23ai


graphql چیست؟

“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 به ما امکان می دهد تا از داده های رابطه ای با استفاده از نحو 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>

نماهای دوگانگی GraphQL و Json

دو روش برای ایجاد دیدگاه های دوگانگی json وجود دارد.

  • SQL SYNTAX – نمای با استفاده از تماس های عملکرد SQL/JSON در SQL تعریف شده است.
  • SYNTAX GRAPHQL – نمای با استفاده از GraphQL تعریف شده است ، که در پشت صحنه به SQL تبدیل می شود.
خدمات داده Data GraphQL و Oracle (ORDS)

پشتیبانی GraphQL به Oracle Rest Data Services (ORDS) نسخه ۲۳٫۳ اضافه شد.

graphqloracle 23aiخدمات اوراکلآموزش اوراکلمسعود سلطانی راد
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید