انتقال 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_CHECK
Argument Name Type In/Out Default?
—————————— ———————– —— ——–
OWNER VARCHAR2 IN
TABLENAME VARCHAR2 IN
COLUMNNAME VARCHAR2 IN
STATUSTABLENAME VARCHAR2 IN
FASTCHECK BOOLEAN IN DEFAULT
APPENDSTATUS 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 را اجرا می کنیم، در ستون مورد علاقه و نام جدول وضعیت عبور می کنیم. این جدول ایجاد خواهد شد.
begin
dbms_json.json_type_convertible_check(
owner => ‘testuser1’,
tablename => ‘json_data’,
columnname => ‘data’,
statustablename => ‘json_data_precheck’
);
end;
/
می بینیم که جدول JSON_DATA_PRECHECK ایجاد شده است.
desc json_data_precheck
Name Null? Type
—————————————– ——– —————————-
STAMP TIMESTAMP(6)
SCHEMA_NAME VARCHAR2(130)
TABLE_NAME VARCHAR2(130)
COLUMN_NAME VARCHAR2(130)
ERROR_ROW_ID ROWID
ERROR_CODE VARCHAR2(250)
STATUS VARCHAR2(100)
SQL>
محتویات جدول JSON_DATA_PRECHECK را بررسی می کنیم و می بینیم که تبدیل امکان پذیر است زیرا هیچ خطایی پیدا نشد.
set linesize 200
column stamp format A30
column schema_name format A12
column table_name format A12
column column_name format A12
column error_row_id format A20
column error_code format A20
column status format A40
select * from json_data_precheck;
STAMP SCHEMA_NAME TABLE_NAME COLUMN_NAME ERROR_ROW_ID ERROR_CODE STATUS
—————————— ———— ———— ———— ——————– ——————– —————————————-
۱۳-APR-23 10.04.15.632861 AM 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;
begin
dbms_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
—————————— ———— ———— ———— ——————– ——————– —————————————-
۱۳-APR-23 10.07.40.764675 AM TESTUSER1 JSON_DATA DATA AAAU2UAAPAAAAG3AAD JSON SYNTAX ERROR ERROR FOUND
۱۳-APR-23 10.07.40.776563 AM TESTUSER1 JSON_DATA DATA Process completed (Errors found: 1)
SQL>
ما می توانیم آن داده ها را بررسی کنیم و تصمیم بگیریم که در مورد آن چه کاری انجام دهیم.
select * from json_data where rowid = ‘AAAU2UAAPAAAAG3AAD’;
ID DATA
———- ——————————————————————————–
۴ banana
SQL>
بیایید ردیف را “اصلاح” کنیم.
update json_data
set data = ‘{“product”:”banana”, “quantity”:1}’
where id = 4;
commit;
ما دوباره چک قبل از مهاجرت را اجرا می کنیم و می بینیم که تبدیل دوباره امکان پذیر است.
Drop table if exists json_data_precheck purge;
begin
dbms_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
—————————— ———— ———— ———— ——————– ——————– —————————————-
۱۳-APR-23 10.12.02.719336 AM TESTUSER1 JSON_DATA DATA Process completed (Errors found: 0)
SQL>
داده ها را به یک ستون JSON منتقل کنید:
اکنون میتوانیم به جلو حرکت کرده و دادهها را با استفاده از یکی از روشهای معتبر تبدیل کنیم.
— Add a JSON column,
alter table json_data add (
data2 json
);
— Populate the new column.
update json_data
set 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_data
Name Null? Type
—————————————– ——– —————————-
ID NOT NULL NUMBER
DATA JSON
SQL>
column data format a40
select * from json_data;
ID DATA
———- —————————————-
۱
۲ {}
۳ {“product”:”banana”,”quantity”:10}
۴ {“product”:”banana”,”quantity”:1}
SQL>
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگوها شرکت کنید؟در گفتگو ها شرکت کنید.