D.1 移行前チェックの実行

PL/SQLプロシージャDBMS_JSON.json_type_convertible_checkを使用して、テキストJSONデータの特定の列をJSONデータ型に変換できるかどうかを確認します。

たとえば、これは、データベース・スキーマtable_ownerが所有する表j_purchaseorderのテキストJSON列dataが変換可能かどうかをチェックします。変換可能性チェックのステータスは、表my_precheck_tableに書き込まれます。

EXECUTE DBMS_JSON.json_type_convertible_check(
                   owner => 'table_owner',
                   tableName => 'j_purchaseorder',
                   columnName => 'data',
                   statusTableName => 'my_precheck_table');

チェックの結果は、プロシージャの3番目のパラメータで指定された表(my_precheck_tableなど)に格納されます。この表がまだ存在しない場合は作成されます。デフォルトでは、既存の表は切り捨てられますが、オプションの5番目のパラメータがTRUEの場合、新しい結果の行は既存の表に追加されます。

デフォルトでは、JSON型コンストラクタを(事実上)使用してデータを変換しようとすると、変換可能性がチェックされます。オプションの4番目のパラメータがTRUEの場合、変換可能性はSQL条件is jsonのみを使用してチェックされます。これは、JSONデータが実際にJSON型に変換可能かどうかではなく、整形式であることをチェックするだけです。

このプロシージャは、チェックする列内の各JSON値をチェックします。変換できない各値を、変換できない理由とともにステータス表に記録します。

また、このプロシージャは、10,000行未満の表の場合は10%ずつ、10,000行から99,999行の表の場合は5%ずつ、100,000行以上の表の場合は1%ずつ、ステータス表に進行状況を記録します。進捗状況エントリには、これまでに見つかったエラーの数も表示されます。

表D-1に、結果のステータス表を示します。

表D-1 JSON型の変換可能性チェックのステータス表

列名 データ型 説明

STAMP

TIMESTAMP(6)

このステータス行(ログ・エントリ)が書き込まれた日時。

SCHEMA_NAME

VARCHAR2(130)

TABLE_NAMEを所有するデータベース・スキーマの名前。

TABLE_NAME

VARCHAR2(130)

テキストJSON列COLUMN_NAMEが含まれるデータベース表。

COLUMN_NAME

VARCHAR2(130)

JSON型データに移行するテキストJSON列の名前。

ERROR_ROW_ID

ROWID

変換可能性エラーが検出された行のアドレス。

ERROR_CODE

VARCHAR2(250)

ERROR_ROW_IDのエラーの名称/説明。例: JSON SYNTAX ERROR

STATUS

VARCHAR2(100)

  • ログ・エントリがエラーが見つかったためである場合は、ERROR FOUNDです。列 ERROR_CODEおよびERROR_ROW_IDを参照してください。

  • 定期的な進行中のログの場合は、M% completed (Errors found: N)です。Mは完了したチェックの割合であり、Nはこれまでに見つかったエラーの数です。

  • チェックが終了した場合は、Process completed (Errors found: N)です。Nは、見つかったエラーの合計数です。

例D-1 DBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECKによってレポートされた問題のあるJSONデータの検索

この例では、表table_owner.j_purchaseorderの列dataROWID AAAWf+AAEAAAAEMAACについての、ステータス表my_precheck_table内でエラー・コードJSON SYNTAX ERRORでレポートされている無効なデータの選択方法を示しています。


SELECT data FROM table_owner.j_purchaseorder
  WHERE ROWID IN (SELECT pt.ERROR_ROW_ID
	             FROM my_precheck_table pt
	             WHERE pt.schema_name = table_owner
	               AND pt.table_name = j_purchaseorder
	               AND pt.column_name = data);