Artarad_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_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>

منبع مستند

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *