Oracle Database 23c Free - Developer ReleaseでDBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKプロシージャを試してみた

# はじめに
Oracle Database 23cで、テキストベースでVARCHAR2型、CLOB型、BLOB型に保存されているJSONデータをJSONデータ型（JSON）に移行可能かをチェックするプロシージャDBMS_JSON.JSON_TYPE_ CONVERTIBLE_CHECKが追加されました。

今回は、DBMS_JSON.JSON_TYPE_ CONVERTIBLE_CHECKプロシージャの動作を確認してみました。

なお、Oracle Database 23c Free - Developer Releaseのインストールと構成については、こちらの記事をご参照ください。

https://qiita.com/500InternalServerError/items/45b4dd0cfc04fb1bab5e

# 1. チェックする表の準備
JSONデータを保存するVARCHAR2型の列json_textを持つ表json_test_tableを作成します。
```
SQL> CREATE TABLE json_test_table (
  2     id		    NUMBER,
  3  	json_text	VARCHAR2(1000)
  4  );

Table created.

SQL> 
```
作成したjson_test_table表にデータを追加します。
```
SQL> INSERT INTO json_test_table VALUES (1,'aaa');

1 row created.

SQL> INSERT INTO json_test_table VALUES (2, '{"name";"aaa"}');

1 row created.

SQL> INSERT INTO json_test_table VALUES (3, '{"name":"aaa"}');

1 row created.

SQL> INSERT INTO json_test_table VALUES (4, '{"name":"bbb"}');

1 row created.

SQL> COMMIT;

Commit complete.

SQL>
```
json_test_table表の内容を確認します。
```
SQL> SELECT rowid, id, json_text FROM json_test_table;

ROWID			           ID JSON_TEXT
------------------ ---------- ------------------------------
AAAdgNAAPAAAAIzAAA	        1 aaa
AAAdgNAAPAAAAIzAAB	        2 {"name";"aaa"}
AAAdgNAAPAAAAIzAAC	        3 {"name":"aaa"}
AAAdgNAAPAAAAIzAAD	        4 {"name":"bbb"}

SQL>
```
DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKプロシージャを使用して、json_test_table表のjson_text列のデータがJSONデータ型に移行可能かを確認します。

DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKプロシージャを実行する際は、以下のようなパラメータを指定します。

| パラメータ | 値 |
| --- | --- |
|owner|チェック対象となる表のオーナーのユーザ名|
|tablename|チェック対象となる表の名前|
|columnname|チェック対象となる列の名前|
|statustablename|チェックした結果を保存する表の名前（存在しない場合は自動的に作成される）|

```
SQL> EXECUTE DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECK(owner => 'testuser',tableName => 'json_test_table',columnName => 'json_text',statusTableName => 'my_precheck_table');

PL/SQL procedure successfully completed.

SQL>
```
DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKプロシージャの実行により作成された、チェックした結果を保存する表my_precheck_tableの構造を確認してみます。
```
SQL> desc my_precheck_table
 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>
```
my_precheck_table表の内容を確認してみます。
```
SQL> col stamp for a28
SQL> col schema_name for a12
SQL> col table_name for a15
SQL> col column_name for a11
SQL> col error_code for a20
SQL> col status for a35
SQL> SELECT * FROM my_precheck_table;

STAMP			             SCHEMA_NAME  TABLE_NAME	  COLUMN_NAME ERROR_ROW_ID	     ERROR_CODE	        STATUS
---------------------------- ------------ --------------- ----------- ------------------ ------------------ -----------------------------------
26-JUN-23 05.24.38.376238 AM TESTUSER	  JSON_TEST_TABLE JSON_TEXT   AAAdgNAAPAAAAIzAAA JSON SYNTAX ERROR  ERROR FOUND
26-JUN-23 05.24.38.376881 AM TESTUSER	  JSON_TEST_TABLE JSON_TEXT   AAAdgNAAPAAAAIzAAB JSON SYNTAX ERROR  ERROR FOUND
26-JUN-23 05.24.38.377319 AM TESTUSER	  JSON_TEST_TABLE JSON_TEXT					                        Process completed (Errors found: 2)

SQL>
```
２つの行のjson_text列の値でJSON SYNTAX ERRORが発生していて、エラーとなっている行のrowidがAAAdgNAAPAAAAIzAAAとAAAdgNAAPAAAAIzAABであることがわかります。

エラーが発生しているデータを確認してみます。
```
SQL> SELECT rowid, id, json_text FROM json_test_table
  2  WHERE rowid IN (SELECT error_row_id FROM my_precheck_table);

ROWID			           ID JSON_TEXT
------------------ ---------- --------------------
AAAdgNAAPAAAAIzAAA	        1 aaa
AAAdgNAAPAAAAIzAAB	        2 {"name";"aaa"}

SQL> 
```
いずれもJSONとして正しくないデータがjson_text列に格納されていることがわかりました。

DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKプロシージャを使用して、テキストベースで保存されているJSONデータをJSONデータ型（JSON）に移行可能かをチェックすることができました。

# 参考情報
・[Migrating Textual JSON Data to JSON Data Type](https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/migrating-textual-json-data-json-data-type.html#GUID-B6EC4A50-5989-4BBD-ACF3-FD355CC63D2C)