یکی دیگر از قابلیتهای جدید اوراکل در نسخه 23cء، JSON Schema است از طریق این قابلیت می توانیم برای هر کدام از keyهای JSON، دیتاتایپی را تنظیم کنیم و محدودیتهای دیگر نظیر minLength و maxLength را برای هر کدام از کلیدها اعمال کنیم. این کار با اضافه کردن عبارت VALIDATE به متن دستور create table قابل انجام است.
ساختار جدول زیر را در نظر بگیرید! در این جدول صرفا JSON Documentای را می توانیم در ستون ettelaat ذخیره کنیم که حداقل شامل فیلدهای First_Name و Last_Name باشند(“required”: [“First_Name”, “Last_Name”]) و این دو فیلد باید از نوع string هم باشند همچنین در صورت وجود فیلد Age در داکیومنت JSON، این فیلد باید از نوع number باشد.
SQL> CREATE TABLE TB_Person ( 2 id NUMBER PRIMARY KEY, 3 ettelaat json VALIDATE '{ 4 "type": "object", 5 "properties": { 6 "First_Name": { 7 "type": "string", 8 "minLength": 5, 9 "maxLength": 20 10 }, 11 "Last_Name": { 12 "type": "string", 13 "minimum": 5, 14 "maximum": 30 15 }, 16 "Age": { 17 "type": "number" 18 } 19 }, 20 "required": ["First_Name", "Last_Name"] 21 }' 22 ); Table created
اوراکل این قابلیت را با کمک constraint پیاده سازی می کند و برای جدول فوق، constraint زیر ایجاد می شود:
alter table TB_PERSON add check ("ETTELAAT" IS JSON VALIDATE '{ "type": "object", "properties": { "First_Name": { "type": "string", "minLength": 5, "maxLength": 20 }, "Last_Name": { "type": "string", "minimum": 5, "maximum": 30 }, "Age": { "type": "number" } }, "required": ["First_Name", "Last_Name"] }');
اشاره شد که کلیدهای First_Name و Last_Name الزامی هستند بنابرین در صورت عدم وجود هر کدام از آنها در متن JSON، به خطای ORA-40875: JSON schema validation error برخواهیم خورد:
SQL> insert into TB_Person values (1,'{"First_Name":"Vahid"}'); ORA-40875: JSON schema validation error SQL> insert into TB_Person values (1,'{"First_Name":"Vahid","Last_Name":"Usefzadeh"}'); 1 row inserted
کلید Age در لیست required نیامده است و دستور فوق بدون آن هم اجرا شده است اما متن JSON می تواند شامل کلید Age هم باشد:
SQL> insert into TB_Person values (1,'{"First_Name":"Vahid","Last_Name":"Usefzadeh","Age":33}'); 1 row inserted
ستون Age باید از نوع number باشد و دو ستون دیگر هم باید از نوع string باشند:
SQL> insert into TB_Person values (1,'{"First_Name":"Vahid","Last_Name":"Usefzadeh","Age":"33"}'); ORA-40875: JSON schema validation error SQL> insert into TB_Person values (1,'{"First_Name":544354,"Last_Name":23423}'); ORA-40875: JSON schema validation error
در موقع ثبت دیتا، حداقل و حداکثر طول کاراکتر هر کدام از این کلیدها هم باید لحاظ شوند. ضمنا می توان کلیدهای دیگری هم به این مجموعه اضافه کرد و الزامی ندارد دیتای ورودی حتما شامل سه فیلد باشد:
SQL> insert into TB_Person values (1,'{"First_Name":"Vahid","Last_Name":"Usefzadeh","Age":33,"Address":"Babol-Derazkola","Email":"vahidusefzadeh@gmail.com"}'); 1 row inserted
به روشهای دیگری هم می توان جدول فوق را ایجاد کرد(جدول TB_Person) برای مثال می توان Json Schema را با کمک Domain ایجاد کرد و در زمان ساخت جدول، به ستون مورد نظر تخصیص داد.
بنابرین قبل از ایجاد جدول باید Domainای را ایجاد کرد:
SQL> CREATE DOMAIN DMNPersonJson AS JSON 2 CONSTRAINT jsondata_chk CHECK (DMNPersonJson IS JSON VALIDATE '{ 3 "type": "object", 4 "properties": { 5 "First_Name": { 6 "type": "string", 7 "minLength": 5, 8 "maxLength": 20 9 }, 10 "Last_Name": { 11 "type": "string", 12 "minimum": 5, 13 "maximum": 30 14 }, 15 "Age": { 16 "type": "number" 17 } 18 }, 19 "required": ["First_Name", "Last_Name"] 20 }' 21 ); Done
بعد از ایجاد Domain می توان جدول یا جداول مورد نظر را ایجاد کرد:
SQL> CREATE TABLE TB_Person2 ( id NUMBER PRIMARY KEY, ettelaat domain DMNPersonJson ); Table created
یکی از مزیتهای قابلیت JSON Schema در آن است که می توان مشخصات هر کدام از ستونهای تعریف شده در Schema را در ویوهای دیتادیکشنری مشاهده کرد. برای این کار می توان از ویوی USER_JSON_SCHEMA_COLUMNS استفاده کرد:
SQL> select table_name,column_name,constraint_name from user_json_schema_columns; TABLE_NAME COLUMN_NAME CONSTRAINT_N --------------- --------------- ------------ TB_PERSON ETTELAAT SYS_C008238
همچنین ستون json_schema اطلاعات کاملی را از ساختار JSON Schemaی فوق ارائه می کند:
SQL> select json_serialize(json_schema pretty) from user_json_schema_columns; JSON_SERIALIZE(JSON_SCHEMAPRETTY) -------------------------------------- { "type" : "object", "properties" : { "First_Name" : { "type" : "string", "minLength" : 5, "maxLength" : 20 }, "Last_Name" : { "type" : "string", "minimum" : 5, "maximum" : 30 }, "Age" : { "type" : "number" } }, "required" : [ "First_Name", "Last_Name" ] }