『Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点

このマニュアルのOracle Databaseの変更点について説明します。

『Oracle Database JSON開発者ガイド』は、Oracle Database 12cリリース2 (12.2.0.1)の新しいマニュアルでした。Oracle Database 12cリリース1 (12.1.0.2)でのJSONデータの使用に関する情報は、Oracle XML DB開発者ガイドで説明しています。

JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点

Oracle Databaseリリース18cバージョン18.1でのJSONサポートと『Oracle Database JSON開発者ガイド』の変更点について説明します。

新機能

このリリースの新機能は次のとおりです。

SQL拡張機能

複数のSQLの拡張機能がデータベース内のJSONデータの格納および問合せ用に提供されています。

JSONデータを戻すSQL式が指定可能

キーワードAS JSONとともにSQLファンクションtreatをSQL式に適用して、式がJSONデータを戻すように指定できます。これは、結果がJSONデータであることを判定できない場合に便利です。テキストが強制的にJSONデータとして解釈される必要がある場合にも役立ちます。たとえば、これを使用して、文字列としてではなく、空のJSONオブジェクトとして{}VARCHAR2値を解釈するように指示できます。

JSON_VALUE、JSON_QUERYおよびJSON_TABLEのLOB結果

SQL/JSONファンクションjson_valueは、CLOBインスタンスを戻すことができます。

SQL/JSONファンクションjson_queryは、CLOBまたはBLOBインスタンスを戻すことができます。BLOBの結果はAL32UTF8キャラクタ・セットです。

前述のように、json_table列のデータ型は、列がFORMAT JSONとして指定されているかどうかによって異なります。指定されている場合はjson_query戻り型がサポートされ、それ以外の場合はjson_value戻り型がサポートされています。

以前のサポート内容は、次のとおりです。:

  • json_valueでは、VARCHAR2NUMBERDATETIMESTAMPTIMESTAMP WITH TIME ZONEおよびSDO_GEOMETRYのみが

    戻り型としてサポートされていました。
  • json_queryでは戻り型としてVARCHAR2のみがサポートされていました。

SQL/JSON生成関数の拡張機能

  • オプションのキーワードSTRICTが追加されました。宣言されている入力、またはJSONデータであることが想定された入力がある場合、整形式のJSONデータかどうかがチェックされて確認されます。これらのいずれかが整形式でない場合、エラーが発生します。

    (キーワードFORMAT JSONを使用するか、キーワードAS JSONともにSQLファンクションtreatを使用して、入力がJSONであることを宣言できます。is json制約を持つ表の列からの入力であるか、入力が別のJSON生成関数の出力である場合、入力はJSONであると想定されます。)

  • SQL/JSON生成関数(json_objectjson_arrayjson_objectaggjson_arrayagg)は、CLOBまたはBLOBインスタンスを戻すことができます。BLOBの結果はAL32UTF8キャラクタ・セットです。

  • 生成関数への入力式は、次のSQLデータ型(NUMBERVARCHAR2DATETIMESTAMPに加えて)のいずれかにすることができます。

    • BINARY_DOUBLE

    • BINARY_FLOAT

    • CLOB

    • BLOB

    • NVARCHAR2

    • RAW

    • TIMESTAMPWITHTIMEZONE

    • TIMESTAMPWITHLOCALTIMEZONE

    • INTERVALYEARTOMONTH

    • INTERVALDAYTOSECOND

    生成した結果がJSONでどのように表示されるかは、入力のデータ型によって異なります。

SQL/JSONパス式の項目メソッド

  • 次の新規項目メソッドが追加されました: numberOnly()stringOnly()boolean() booleanOnly()size(),およびtype()です。

    名前に"only"が含まれるデータ型の変換メソッドは、"only"が含まれない名前の対応するメソッドと同じです。前者は、特定の型であるJSON値(numberなど)のみを関連のSQLデータ型(NUMBERなど)に変換する点が異なります。名前に"only"が含まれないメソッドは、任意のJSON値を指定したSQLデータ型に変換できます。

  • すべての項目メソッドが、SQL/JSONファンクションjson_valuejson_queryおよびjson_table(列)のパス式で使用できるようになりました。Oracle Database 12cリリース2 (12.2.0.1)では、項目メソッドはSQL/JSON条件json_existsのパス式でのみ使用できました。

  • 項目メソッドstring()は、(VARCHAR2に加えて) CLOBまたはBLOBを戻すことができるようになりました。デフォルトは、VARCHAR2(4000)です。

JSONデータ・ガイドの拡張機能

  • Oracle SQL集計関数json_dataguideは、オプションのフォーマット引数を受け入れます。

    • キーワードFORMATを引数DBMS_JSON.FORMAT_HIERARCHICALとともに指定すると、階層データ・ガイドを返すことができます。

    • キーワードPRETTYを引数DBMS_JSON.PRETTYとともに指定すると、返されたデータ・ガイドの整形出力(読みやすくするためのインデント)を指定できます。

  • 新しいデータ・ディクショナリ・ビューを使用できます。これにより、データ・ガイド対応の検索索引(USER_JSON_DATAGUIDE_FIELDSALL_JSON_DATAGUIDE_FIELDSDBA_JSON_DATAGUIDE_FIELDS)で、個々のJSONオブジェクト・フィールドに記録されたデータ・ガイド情報が表示されます。(これらは、USER_JSON_DATAGUIDESALL_JSON_DATAGUIDESDBA_JSON_DATAGUIDESビューに加えて、データ・ガイド対応の検索索引でJSON列を含む表を示します。)

  • スカラー値の配列が含まれるJSON文書の場合、データ・ガイドはスカラー型とARRAY型を記録します。[*]を配列用に記録されたパスに追加することにより、スカラー値用に記録されたパスは、フラット・データ・ガイドに示されます。

JSON列の存在を記録するデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューのUSER_JSON_COLUMNSALL_JSON_COLUMNSおよびDBA_JSON_COLUMNSは、JSONデータの列を含むビューおよび表を示します。

関連項目:

ALL_JSON_COLUMNSおよび関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください

SQL/JSONファンクションのJSON_TABLE構文

json_tableの構文は、次のようにいくつかの一般的なユースケース用に簡略化することにより、拡張されました。

  • パス式のかわりに単純なドット表記法構文を使用できるようになりました。

  • 列は、JSONオブジェクト・フィールドから投影される場合、および列がフィールドと同じ名前である場合、そのオブジェクトにパス式を指定する必要はありません。パスには列名から推測されます。

JSON_TABLEのマテリアライズド・ビューのON STATEMENTのサポート

json_table問合せを使用してマテリアライズド・ビューを作成するときに、キーワードON STATEMENTを使用できるようになりました。ON COMMITのかわりにON STATEMENTを使用することは、ビューが元表に対してDML文ごとに自動的に同期されることを意味します。

新しいSQLファンクションTO_UTC_TIMESTAMP_TZ

SQLファンクションto_UTC_timestamp_tzは、入力としてISO 8601の日付フォーマット文字列を受け取り、SQLデータ型TIMESTAMP WITH TIMEZONEのインスタンスを戻します。入力はUTC時間(協定世界時、以前はグリニッジ標準時)に正規化されます。SQLファンクションto_timestamp_tzとは異なり、新しいファンクションでは入力文字列がISO 8601日付形式を使用して、タイムゾーンをUTC 0にデフォルト設定すると想定しています。

このファンクションの一般的な使用方法として、SQLファンクションsys_extract_UTCにその出力を提供し、UTC時間を取得してこれをSQLバインド変数としてSQL/JSON条件json_existsに渡し、タイムスタンプ範囲の比較を実行します。

関連項目:

ISO 8601 (ISO日付形式の詳細)

新しいOracle SQL条件JSON_EQUAL

2つのJSON値が等しい場合は、Oracle SQL条件json_equalはこれらを比較してtrueを戻し、それ以外の場合はfalseを戻します。この比較では、無意味な空白および無意味なオブジェクト・メンバーの順序は無視されます。たとえば、JSONオブジェクトに同じメンバーがある場合、その順序に関係なく、これらのオブジェクトは等しくなります。ただし、2つの比較されたオブジェクトのいずれかに1つ以上のフィールドの重複がある場合、json_equalによって戻される値は特定されません。

シャーディングのサポート

JSONデータのシャーディングのサポートが拡張されました。

サポートされている内容は次のとおりです。

  • ユーザー管理かシステム管理かに関係なく、シャーディングされた表のJSON検索索引。

  • SQLとPL/SQLからCLOBまたはBLOBとして戻されるJSONデータ用のクロスシャード(およびシャード内)問合せ。これには、SQL/JSONファンクションjson_tableを使用して、CLOBおよびBLOB列へのJSONデータの投影が含まれています。

  • SQL/JSONファンクションおよび条件を使用する、クロスシャード問合せにおける個別のシャードの評価。これは、次のように使用されます。

    • SELECT句の関数json_valueおよび集計関数json_dataguide

    • FROM句の関数json_table

    • WHERE句の関数json_value、および条件json_existsjson_textcontains

  • チャンク移行中の元表および索引の記憶域表パーティションの自動再配置。

関連項目:

Oracle Shardingガイド

LOB記憶域のパフォーマンスの改善

LOB記憶域を使用するJSONデータに対するパフォーマンスが改善されました。これは特に、LOBとして格納されているJSON文書全体の読取りおよび書込みを行う一般的なユースケースに影響します。

JSON検索索引の長いフィールド名のサポート

JSON検索索引に対してサポートされている最大JSONフィールド名の長さが255バイトになりました(以前は64バイトでした)。

注意:

名前が64バイトを超えるオブジェクト・フィールドが含まれるJSONデータを索引付けする場合、Oracle Database 18cより前に作成された任意のJSON検索索引およびOracle Text索引を再構築する必要があります。詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。

非推奨となった機能

次の機能は今回のリリースで非推奨となり、今後のリリースではサポートされない可能性があります。

  • 数値(0または1)としてブール型のJSON値を戻すSQL/JSONファンクション。VARCHAR2またはBOOLEANとして(PL/SQLのみ)値を戻しますが、NUMBERとして戻されません。SQL数値が必要な場合は、SQL DECODEまたはCASE WHENを使用してVARCHAR2値から0または1を取得できます。

JSON開発者ガイドのOracle Database12cリリース2 (12.2.0.1)における変更点

Oracle Database 12cリリース2 (12.2.0.1)での、JSONサポートとOracle Database JSON開発者ガイドの変更点について説明します。

新機能

このリリースの新機能は次のとおりです。

JSONデータの格納および管理
JSONデータのパーティション化

JSON仮想列をパーティション化キーとして使用して、表をパーティション化できるようになりました。

パーティション化された表のJSON検索索引

パーティション化された(レンジ・パーティション化、リスト・パーティション化、ハッシュ・パーティション化またはインターバル・パーティション化を使用)元表に、JSON検索索引を作成できるようになりました。

JSONデータの問合せ
パス式の機能拡張

JSONパス式に、データの照合によって満たす必要があるフィルタ式と、データを変換できる変換メソッドを含められるようになりました。

単純なドット表記法構文による配列アクセスのサポート

単純なドット表記法構文を使用して、配列とその要素にアクセスできるようになりました。

データ・ガイド

一連のJSON文書の構造的情報を取得するJSONデータ・ガイドを作成できるようになりました。JSONデータ・ガイドは派生スキーマとして動作し、それが表すJSONデータと一緒に維持されます。また、文書で使用されているスカラー値に関する統計情報の記録も行います。

PL/SQLに追加されたSQL/JSONファンクションおよび条件

json_valuejson_queryjson_objectおよびjson_arrayのSQL/JSONファンクションと、json_existsのSQL/JSON条件が、PL/SQL言語に組込み関数として追加されました(json_existsはPL/SQLのブール型関数)。

追加のデータ型に対するJSON_VALUEおよびJSON_TABLEのサポート

SDO_GEOMETRYDATETIMESTAMPおよびTIMESTAMP WITH TIME ZONEのSQLデータ型を、json_valueおよびjson_tableのSQL/JSONファンクションで使用できるようになりました。

これらのいずれかを、SQL/JSONファンクションjson_valueの戻りデータ型として、また、SQL/JSONファンクションjson_tableの列データ型として指定できます。

SDO_GEOMETRYは、Oracle Spatial and Graphデータに対して使用します。特に、これらの関数をGeoJSONデータと一緒に使用できることを意味します。GeoJSONデータは、JSONの地理データをエンコードするための形式です。

パフォーマンス
検索の機能拡張

JSON検索索引の作成に、よりシンプルな構文を使用できるようになりました。組込みの日時データ型としてキャストできる数値およびJSON文字列に、範囲検索を使用できるようになりました。

JSON_TABLEにリライトされたSQL/JSON問合せファンクションおよび条件

多くの場合に、オプティマイザが、json_existsjson_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、より少ないjson_tableの呼出しにリライトするようになりました。これにより、json_tableの呼出しごとにデータが1度だけ解析されるため、通常、パフォーマンスが向上します。

インメモリー列ストアのJSON列

問合せのパフォーマンスを向上させるために、JSON列をインメモリー列ストアに格納できるようになりました。

JSONデータに対するマテリアライズド・ビュー

VARCHAR2またはNUMBER列として投影されたJSONデータに対して、マテリアライズド・ビューを作成できるようになりました。

SQL/JSONファンクションjson_tableは、特定のJSONデータをVARCHAR2またはNUMBER列として投影します。通常、このような列に対してマテリアライズド・ビューを作成することで、問合せのパフォーマンスを向上させることができます。ビューは読取り専用である必要があり、ビューの作成時にFOR UPDATE句は許可されません。ビューの完全リフレッシュと増分リフレッシュの両方がサポートされます。多くの場合、ビュー列に対して索引を作成することで、問合せのパフォーマンスをさらに向上させることができます。

その他
JSONデータ生成のためのSQL/JSONファンクション

SQL/JSONファンクションjson_objectjson_arrayjson_objectaggおよびjson_arrayaggを使用して、JSONデータをプログラム的に構成できるようになりました。

関連項目:

JSONデータの生成

JSONデータ用のPL/SQL API

PL/SQL APIを使用して、(1)データ・ガイド操作、(2)インメモリー、階層型、プログラム的表現によってバッキングされたJSONオブジェクト型に対するgetおよびset操作を提供できるようになりました。

シャーディングされた表のJSON列

シャーディングされた表にJSON列を作成し、そのJSONデータを問い合せることができるようになりました。

JSONデータを格納できるのは、シャーディングされた表内の型VARCHAR2 (32,767バイトまで)、CLOBまたはBLOBの列です。VARCHAR2として格納されていないかぎり、複数のシャード間にわたってJSONデータを問い合せることはできません。