انتقال  Text-Based JSON به JSON Data Type: بررسی پیش از مهاجرت در پایگاه داده Oracle 23c

انتقال Text-Based JSON به JSON Data Type: بررسی پیش از مهاجرت در پایگاه داده Oracle 23cدر Oracle 23c ، رویه JSON_TYPE_CONVERTIBLE_CHECK به بسته DBMS_JSON اضافه شده است تا بررسی‌های پیش از مهاجرت بر روی ستون‌های JSON مبتنی بر متن انجام شود.مستند نصب و راه اندازی Oracle 23cمسئله:قبل از Oracle 21c ، تمام داده‌های JSON به صورت متن در پایگاه داده ذخیره می‌شدند، معمولاً در ستون‌هایی با انواع داده‌هایی مانند BLOB، CLOB یا VARCHAR2. با معرفی نوع داده JSON در Oracle 21c ، افراد ممکن است بخواهند ستون های JSON مبتنی بر متن خود را برای استفاده به نوع داده JSON تبدیل کنند. روش های مختلفی برای انجام این کار وجود دارد که از جمله آنها می توان به موارد زیر اشاره کرد.· ایجاد جدول ... به عنوان انتخاب (CTAS)· Data Pump· تعریف مجدد جدول آنلاین· ستون جدید را اضافه کنید و یک به روز رسانی DML انجام دهیددر همه موارد ما نمی دانیم که داده های موجود در ستون برای چنین تبدیلی مناسب هستند تا زمانی که آن را امتحان کنیم.راهکار : DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKدر Oracle 23c رویه JSON_TYPE_CONVERTIBLE_CHECK به بسته DBMS_JSON اضافه شده است.ROCEDURE JSON_TYPE_CONVERTIBLE_CHECKArgument Name Type In/Out Default?------------------------------ ----------------------- ------ --------OWNER VARCHAR2 INTABLENAME VARCHAR2 INCOLUMNNAME VARCHAR2 INSTATUSTABLENAME VARCHAR2 INFASTCHECK BOOLEAN IN DEFAULTAPPENDSTATUS BOOLEAN IN DEFAULTاین رویه به ما اجازه می‌دهد تا محتویات ستون JSON مبتنی بر متن را بررسی کنیم تا مطمئن شویم برای تبدیل به ستون نوع داده JSON مناسب است.ما جدول تست را با یک ستون CLOB برای نگهداری داده های JSON ایجاد می کنیم.drop table if exists json_data_precheck purge;drop table if exists json_data purge;create table json_data (id number generated always as identity,data clob);ما آن را با سه ردیف پر می کنیم که برای تبدیل به ستون نوع داده JSONمناسب هستند.insert into json_data (data)values (null);insert into json_data (data)values ('{}');insert into json_data (data)values ('{"product":"banana", "quantity":10}');commit;ما رویه JSON_TYPE_CONVERTIBLE_CHECK را اجرا می کنیم، در ستون مورد علاقه و نام جدول وضعیت عبور می کنیم. این جدول ایجاد خواهد شد.begindbms_json.json_type_convertible_check(owner => 'testuser1',tablename => 'json_data',columnname => 'data',statustablename => 'json_data_precheck');end;/می بینیم که جدول JSON_DATA_PRECHECK ایجاد شده است.desc json_data_precheckName Null? Type----------------------------------------- -------- ----------------------------STAMP TIMESTAMP(6)SCHEMA_NAME VARCHAR2(130)TABLE_NAME VARCHAR2(130)COLUMN_NAME VARCHAR2(130)ERROR_ROW_ID ROWIDERROR_CODE VARCHAR2(250)STATUS VARCHAR2(100)SQL>محتویات جدول JSON_DATA_PRECHECK را بررسی می کنیم و می بینیم که تبدیل امکان پذیر است زیرا هیچ خطایی پیدا نشد.set linesize 200column stamp format A30column schema_name format A12column table_name format A12column column_name format A12column error_row_id format A20column error_code format A20column status format A40select * from json_data_precheck;STAMP SCHEMA_NAME TABLE_NAME COLUMN_NAME ERROR_ROW_ID ERROR_CODE STATUS------------------------------ ------------ ------------ ------------ -------------------- -------------------- ----------------------------------------13-APR-23 10.04.15.632861AM TESTUSER1 JSON_DATA DATA Process completed (Errors found: 0)SQL>یک ردیف در جدول آزمایشی وارد می کنیم که JSON معتبر نیست.insert into json_data (data)values ('banana');commit;ما دوباره چک قبل از مهاجرت را اجرا می کنیم.drop table if exists json_data_precheck purge;begindbms_json.json_type_convertible_check(owner => 'testuser1',tablename => 'json_data',columnname => 'data',statustablename => 'json_data_precheck');end;/محتویات جدول JSON_DATA_PRECHECK را بررسی می کنیم و می بینیم که تبدیل امکان پذیر نیست زیرا خطاهایی داریم. توجه داشته باشید که یک ورودی برای هر ردیف ناموفق گنجانده شده است.select * from json_data_precheck;STAMP SCHEMA_NAME TABLE_NAME COLUMN_NAME ERROR_ROW_ID ERROR_CODE STATUS------------------------------ ------------ ------------ ------------ -------------------- -------------------- ----------------------------------------13-APR-23 10.07.40.764675AM TESTUSER1 JSON_DATA DATA AAAU2UAAPAAAAG3AAD JSON SYNTAX ERROR ERROR FOUND13-APR-23 10.07.40.776563AM TESTUSER1 JSON_DATA DATA Process completed (Errors found: 1)SQL>ما می توانیم آن داده ها را بررسی کنیم و تصمیم بگیریم که در مورد آن چه کاری انجام دهیم.select * from json_data where rowid = 'AAAU2UAAPAAAAG3AAD';ID DATA---------- --------------------------------------------------------------------------------4bananaSQL>بیایید ردیف را "اصلاح" کنیم.update json_dataset data = '{"product":"banana", "quantity":1}'where id = 4;commit;ما دوباره چک قبل از مهاجرت را اجرا می کنیم و می بینیم که تبدیل دوباره امکان پذیر است.Drop table if exists json_data_precheck purge;begindbms_json.json_type_convertible_check(owner => 'testuser1',tablename => 'json_data',columnname => 'data',statustablename => 'json_data_precheck');end;/select * from json_data_precheck;STAMP SCHEMA_NAME TABLE_NAME COLUMN_NAME ERROR_ROW_ID ERROR_CODE STATUS------------------------------ ------------ ------------ ------------ -------------------- -------------------- ----------------------------------------13-APR-23 10.12.02.719336AM TESTUSER1 JSON_DATA DATA Process completed (Errors found: 0)SQL>داده ها را به یک ستون JSON منتقل کنید:اکنون می‌توانیم به جلو حرکت کرده و داده‌ها را با استفاده از یکی از روش‌های معتبر تبدیل کنیم.-- Add a JSON column,alter table json_data add (data2json);-- Populate the new column.update json_dataset data2= JSON(data);-- Drop the old column. You may prefer to mark it as unused.alter table json_data drop column data;-- Rename the new column to match the original name.alter table json_data rename column data2 to data;می‌توانیم ببینیم که نوع داده ستون اکنون JSON است و حاوی داده‌های تبدیل شده است.desc json_dataName Null? Type----------------------------------------- -------- ----------------------------ID NOT NULL NUMBERDATA JSONSQL>column data format a40select * from json_data;ID DATA---------- ----------------------------------------12{}3{"product":"banana","quantity":10}4{"product":"banana","quantity":1}SQL>برای دریافت مشاوره، آموزش و خدمات نگهداری پایگاه داده اوراکل با ما در تماس باشید.منبع مستند