18 JSONデータ・ガイド

JSONデータ・ガイドを使用すると、Oracle Databaseに格納されたJSON文書の構造と内容に関する情報を検出できます。

この情報には、次のような用途があります。

  • JSON文書セットについて記述するJSONスキーマ文書を生成します。

  • 文書内のデータに対してSQL操作を実行するために使用できるビューを作成します。

  • 文書内の追加または変更されたフィールドに対応する仮想列を自動的に追加または更新します。

トピック:

18.1 JSONデータ・ガイドの概要

データ・ガイドは、一連のJSON文書に含まれる構造および型情報の概要を示します。これらの文書内で使用されているフィールドに関するメタデータを記録します。

たとえば、例2-1に示されたJSONオブジェクトの場合、その文書にShippingInstructionsオブジェクトがあり、これがnameAddressPhoneの各フィールドを持ち、それぞれの型が文字列、オブジェクト、配列であることが、その他の事項と一緒にデータ・ガイドに指定されます。同様に、オブジェクトAddressの構造も配列Phone内の要素の型として記録されます。

JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的に保存でき、この情報は新しいJSONコンテンツの追加時に自動的に更新されます。これは、JSON検索索引の作成時のデフォルトの場合です。データ・ガイド情報は、索引インフラストラクチャの一部です。

データ・ガイドは次の用途に使用できます。

  • データ・マイニング、ビジネス・インテリジェンス、その他のJSON文書の分析が関係するアプリケーションを開発するための基盤として。

  • 検索を含む、要求されたJSON情報に関するユーザー支援を提供するための基盤として。

  • 新しいJSON文書を文書セットに追加する前に、確認または操作する(特定のフィールドの検証、型チェック、除外など)目的。

このような目的のために、次の操作を実行できます。

  • フィールド長や最低特定の頻度で出現するフィールドなど、文書セットに関する情報について直接データ・ガイドに問い合せます。

  • データ・ガイドに従って、関係する特定のJSONフィールドの重要性に基づいて、フィールドを投影するビューを作成するか、仮想列を追加します。

注意:

  • ビューよりも仮想列に利点があるのは、仮想列の索引を構築し、オプティマイザ用に仮想列に関する統計を取得できることです。

  • 仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

永続的なデータ・ガイド情報を持つ列を記録するデータ・ディクショナリ・ビュー

次の静的データ・ディクショナリ・ビューが定義されます。それらを問い合せ、データ・ガイド対応JSON検索索引を持つJSON列がある表を参照できます。そのような表が含まれるかどうかによって、ビューは異なります。データ・ガイド対応の索引を持つJSON列がない表は、ビューに表示されません。

  • USER_JSON_DATAGUIDES — 現在のユーザーが所有する表

  • ALL_JSON_DATAGUIDES — 現在のユーザーがアクセス可能な表

  • DBA_JSON_DATAGUIDES — すべての表

各ビューに、列TABLE_NAME (表名)、COLUMN_NAME (JSON列名)、DATAGUIDE (データ・ガイド)があります。ビューALL_JSON_DATAGUIDEおよびDBA_JSON_DATAGUIDESにも列OWNERがあり、この値は表の所有者です。

JSON列にデータ・ガイド対応JSON検索索引がある場合、列DATAGUIDEの値はJSON列のデータ・ガイドであり、CLOBインスタンスとしてフラット形式です。データ・ガイド対応の索引がない場合は、ビュー内にその列の行はありません。

関連項目:

18.2 永続的なデータ・ガイド情報: JSON検索索引の一部

JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的に保存でき、この情報は新しいJSONコンテンツの追加時に自動的に更新されます。これは、JSON検索索引の作成時のデフォルトの場合です。データ・ガイド情報は、索引インフラストラクチャの一部です。

CREATE SEARCH INDEXをキーワードFOR JSONと一緒に使用して、検索索引、データ・ガイド、またはこの両方を同時に作成できます。デフォルトの動作では、両方が作成されます。

JSON検索索引の検索のサポートを有効にせずに、JSON検索索引の一部として永続的データ・ガイド情報を作成するには、SEARCH_ON NONEPARAMETERS句内でCREATE SEARCH INDEXに対して指定します。ただし、DATAGUIDEの値はON (デフォルト値)のままにします。例18-1に、これを示します。

ALTER INDEX ... REBUILDを使用して、既存のJSON検索索引のデータ・ガイドのサポートを有効または無効にできます。例18-2にこれを示します。ここでは、例24-17でデフォルトで追加されたデータ・ガイド・サポートを無効にします。

注意:

データ・ガイド対応JSON検索索引を作成する、または既存のJSON検索索引をデータ・ガイド対応にするには、データベース権限CTXAPPが必要です。

注意:

データ・ガイド対応JSON検索索引は、is jsonチェック制約がある列にのみ構築できます。さらに、索引内のデータ・ガイド情報を更新するには、このチェック制約を有効にする必要があります。

このチェック制約が何かの理由で無効になった場合、次のようにして索引内のデータ・ガイド情報を再構築してチェック制約を再有効化し、自動データ・ガイド・サポート更新を再開する必要があります。

ALTER INDEX index_name REBUILD ('dataguide off');
ALTER INDEX index_name REBUILD ('dataguide on');
ALTER TABLE table_name ENABLE CONSTRAINT is_json_check_constraint_name;

具体的には、SQL*Loader (sqlldr)を使用するとis jsonチェック制約は無効になります。

永続的なデータ・ガイド情報は検索索引インフラストラクチャの一部であるため、常にライブです。そのコンテンツは、索引が同期されるときに毎回自動更新されます。索引付けされたデータの変更は、検索索引に反映されます。索引が同期された後にのみ、データ・ガイド情報が含まれます。

さらに、検索索引内のデータ・ガイド情報の更新では、常に情報が追加されます。情報が削除されることはありません。これは、索引が文書セット内のデータを正確に反映しないことがよくあるもう1つの理由です。適用先の文書内での削除は、データ・ガイド情報には反映されません。そのような情報が現在のデータを正確に反映する必要がある場合は、JSON検索索引を削除し、新しく作成します。

検索索引内の永続的データ・ガイド情報には、文書セット内での各JSONフィールドの使用頻度などの統計も含めることができます。統計は、文書セットに関する統計を明示的に収集した場合にのみ存在します(JSON検索索引に関して収集するなど)。自動的には更新されません。統計が最新のものであるようにするには、統計を新たに収集します。例18-3は、JSON検索索引po_search_idxによって索引付けされたJSONデータに関する統計を収集します。この索引は、例24-17で作成されます。

注意:

シャーディング環境でローカル・データ・ガイド対応JSON検索索引が作成されると、個別の各シャードに、そのシャード内に保存されているJSON文書のデータ・ガイド情報が含まれます。この理由から、シャード・カタログ・データベースに対してデータ・ガイド関連操作を起動すると、その操作に効力はありません。

パーティション表のデータ・ガイド対応検索索引に関する考慮事項

パーティション表のローカルなデータ・ガイド対応JSON検索索引のデータ・ガイド情報は、パーティション化されません。すべてのパーティションで共有されます。

索引内のデータ・ガイド情報は加算的なものであるため、パーティションの削除、マージ、分割、切捨ては索引には影響しません。

パーティション表をパーティション化されていない表と交換すると、パーティション表の索引のデータ・ガイド情報が更新されます。ただし、パーティション化されていない表のデータ・ガイド対応索引は再構築する必要があります。

ハッシュ表データをシリアライズする場合は永続的なデータ・ガイド情報を使用しない

Javaハッシュ表または連想配列(JavaScriptにあるものなど)をJSONオブジェクトとしてシリアライズする場合、永続的なデータ・ガイド情報の使用を避けます。

GSONやJacksonなどの一般的なライブラリで提供されるデフォルトのハッシュ表シリアライズでは、ハッシュ表のキー・エントリから取得されたオブジェクト・フィールド名と、対応するJavaハッシュ表の値から取得されたフィールド値を持つテキストのJSONドキュメントが生成されます。単一のJavaハッシュ表エントリをシリアライズすると、新しい一意のJSONフィールドと値が生成されます。

永続的なデータ・ガイド情報は、データの形状を反映し、新しいJSON文書が挿入されると自動的に更新されます。各ハッシュ表のキー値のペアによって、JSON検索索引の個別のエントリが作成されます。そのため、このようなシリアライズによって、索引に保持される情報のサイズが大幅に増える可能性があります。サイズが大きいことに加え、多くの索引が更新されるためにパフォーマンスに悪影響がおよび、DMLが遅くなります。

ハッシュ表をシリアライズする、またはかわりに連想配列をオブジェクトのJSON配列としてシリアライズする場合、それぞれにハッシュ表キー・エントリから導出されたフィールドが含まれ、そのような問題は起きません。

ハッシュ表またはJSONオブジェクトとしての連想配列のデフォルトのシリアライズは、開発者によって割り当てられたフィールド名を持つオブジェクトと区別できません。JSONデータ・ガイドは、メタデータのようなフィールド名のどれが開発者が割り当てたものであり、データのようなフィールド名のどれがハッシュ表または連想配列から導出されたものかを識別できません。すべてのフィールド名は、開発者が指定したのと同様に、基本的にメタデータとして扱われます。

次に例を示します。

  • animalNameをハッシュ・キーとして持ち、一連の動物プロパティを値として持つハッシュ表を使用してアプリケーション・オブジェクトを構築する場合、デフォルトのシリアライズは、各ハッシュ表エントリについて個別のフィールド("cat""mouse"、...)を持ち、対応する動物プロパティを持つオブジェクトになるフィールド値を持つ単一のJSONオブジェクトになります。これは、通常ハッシュ・キーから導出されたフィールド("cat""mouse"、...)数が多数になるため、データ・ガイドのサイズとパフォーマンスの面で問題になる可能性があります。

  • かわりに、animal構造体のアプリケーション配列を構築し、それぞれに1つのフィールドanimalName (値"cat"または"mouse"...を持つ)を持たせた場合、シリアライズはオブジェクトのJSON配列となり、それぞれに同じフィールドanimalNameを持ちます。対応するデータ・ガイドにサイズやパフォーマンスの問題はありません。

例18-1 JSONデータ・ガイドの検索用でない永続的サポートの有効化

CREATE SEARCH INDEX po_dg_only_idx ON j_purchaseorder (po_document) FOR JSON
  PARAMETERS ('SEARCH_ON NONE');

例18-2 既存のJSON検索索引のJSONデータ・ガイド・サポートの無効化

ALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE OFF');

例18-3 JSON検索索引を使用したJSONデータに関する統計情報の収集

EXEC DBMS_STATS.gather_index_stats(docuser, po_search_idx, NULL, 99);

関連項目:

18.3 データ・ガイドの形式およびデータ・ガイドの作成方法

データ・ガイドには、フラットと階層の2つの形式があります。どちらもSQLおよびPL/SQLでCLOBデータとして使用できます。データ・ガイドは、JSON検索索引に保存されたデータ・ガイド情報から、またはJSON文書をスキャンすることによって構成できます。

  • フラット・データ・ガイドを使用して、フィールド頻度や型などのデータ・ガイド情報を問い合せられます。

    フラット・データ・ガイドはJSONでオブジェクトの配列として表され、それぞれが文書セット内の特定のパスのJSONデータを示します。発注書の文書のフラット・データ・ガイドで、例2-1の発注データのフラット・データ・ガイドについて説明しています。

  • 階層データ・ガイドを使用して、データ・ガイド情報に基づいて選択する特定のフィールドを使用することでビューを作成する、または仮想列を追加できます。

    階層的データ・ガイドは、ネストされたJSONデータを持つオブジェクトとして、JSONで表されます。これは、JSONスキーマ(バージョン4、json-schema-core)で定義されているものと同じ形式です。発注書の文書の階層データ・ガイドで、例2-1の発注データの階層データ・ガイドについて説明しています。

PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用して、JSON検索索引に格納されているデータ・ガイド情報からデータ・ガイドを取得します。

SQL集計関数json_dataguideを使用して、文書セットをスキャンし、データ・ガイド対応検索索引があるかどうかにかかわらず、データ・ガイドを設定して構築することもできます。データ・ガイドは、ファンクションの起動時の文書セットを正確に反映します。

表18-1 データ・ガイドを取得するためのSQLファンクションおよびPL/SQLファンクション

データ・ガイド対応検索索引を使用するかどうか フラット・データ・ガイド 階層データ・ガイド
はい PL/SQLファンクションget_index_dataguide(形式DBMS_JSON.FORMAT_FLAT) PL/SQLファンクションget_index_dataguide(形式DBMS_JSON.FORMAT_HIERARCHICAL)
いいえ SQLファンクションjson_dataguide 該当なし
データ・ガイド対応JSON検索索引に基づいてデータ・ガイドを取得するメリットの例は次のとおりです。
  • 文書セットに対する加算的な更新は、索引が同期されるたびに永続的なデータ・ガイド情報に自動的に反映されます。

  • このデータ・ガイド情報は永続的であるため、この情報に基づいてデータ・ガイドを取得する(PL/SQLファンクションget_index_dataguideを使用)方法は、文書セットを分析してデータ・ガイドを取得する(SQLファンクションjson_dataguideを使用)方法よりも高速です。

  • 文書セットに関する統計情報を収集している場合、これらは格納された情報に含まれ、それから取得されたデータ・ガイドに含まれます。

  • ビューまたは仮想列の作成時に列名の競合が発生すると、自動的に解決されます。

データ・ガイド対応JSON検索索引を使用せずにデータ・ガイドを取得するメリットには、データ・ガイドの正確性を保証できることや、索引のメンテナンスのオーバーヘッドが不要であることなどがあります。さらに、索引から導出されたのでないデータ・ガイドは、次のような特定のユースケースに適しています。

  • JSONデータが外部表にある場合。外部表に索引を作成することはできません。

  • JSON列に索引を付けることができても、その索引があまり有用にならない場合。列に種類が異なる文書が含まれている場合などがこれに該当します。このようなときは、JSON列に格納された文書の種類を特定するための列を表に追加すると役立つ場合があります。そうすると、SQL集計関数とGROUP BYを持つデータ・ガイドを使用できるようになります。文書セットごとの複数のデータ・ガイドを参照してください。

関連項目:

18.4 JSONデータ・ガイドのフィールド

JSONデータ・ガイドの事前定義済フィールドが記述されます。これらには、JSONスキーマ・フィールド(キーワード)およびOracle固有のフィールドが含まれます。

データ・ガイド内のフィールドの出現箇所は、JSON文書セットのいずれか、または複数の中に存在する1つのフィールドに対応します。

JSONスキーマ・フィールド(キーワード)

JSONスキーマはJSONオブジェクトが格納されたJSON文書であり、それ自体に子オブジェクト(サブスキーマ)を含めることができます。JSONスキーマで定義されているフィールドは、JSONスキーマ・キーワードと呼ばれます。表18-2に、Oracle JSONデータ・ガイド内で使用できるキーワードを示します。キーワードpropertiesitemsoneOfは階層データ・ガイド内でのみ使用されます(JSONスキーマ)。キーワードtypeはフラットデータ・ガイド内と階層データ・ガイド内の両方で使用されます。

表18-2 JSONスキーマ・フィールド(キーワード)

フィールド(キーワード) 値の説明
properties

1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用されるJSONオブジェクトのプロパティを表します。

items

1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用される配列の要素(項目)を表します。

oneOf

1つの配列であり、これに属する個々の項目は、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内のJSONフィールドの1つまたは複数の出現箇所を表します。

type

1つの文字列であり、フラットまたは階層データ・ガイドによって表されるJSONデータのいくつかの型の名前を表します。

可能な値は、"number""string""boolean""null""object""array"です。

Oracle固有のJSONデータ・ガイド・フィールド

JSONスキーマ・キーワードに加えて、JSONデータ・ガイドはOracleデータ・ガイド固有のフィールドを格納できます。すべてのフィールド名に、接頭辞o:が付きます。これについては表18-3で説明します。

表18-3 Oracle固有のデータ・ガイド・フィールド

フィールド 値の説明
o:path

JSON文書からJSONフィールドへのパスを示します。フラット・データ・ガイドでのみ使用されます。値は単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップが付くことはありません。SQL/JSONパス式の構文を参照してください。

o:length

JSONフィールド値の最大長をバイト単位で示します。値は常に2の累乗です。たとえば、すべての実際のフィールド値の最大長が5である場合、o:lengthの値は8です(5以上の2の最小のべき乗数)。

o:preferred_column_name

所定のデータ・ガイドに固有の識別子であり、大文字と小文字が区別されます。ビュー列またはデータ・ガイドを使用して作成された仮想列に使用する名前として選択します。

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:frequency

所定のフィールドを含むJSON文書の割合を示します。同じ配列の下に発生したフィールドの重複は無視されます。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:num_nulls

対象のスカラー・フィールドの値がJSON nullである文書数を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:high_value

すべての文書中での対象のスカラー・フィールドの最高値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:low_value

すべての文書中での対象のスカラー・フィールドの最低値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:last_analyzed

統計情報が最後に文書セットに関して収集された日時を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

これが存在する場合、フィールドo:preferred_column_nameのデフォルト値は、対応するJSONフィールド名と同じであり、JSON列名に$が付加された接頭辞が付き、ASCII以外の文字は削除されます。この結果のフィールド名が、同じデータ・ガイド内にすでにある場合、新しい順序番号が末尾に付加された固有の名前が付けられます。

列がエスケープされた小文字(たとえば'PO_Column'po_columnのかわりに使用されているなど)を使用して定義されているのでないかぎり、列名は大文字です。たとえば、フィールドUserがJSON列po_document内のデータにある場合、このデフォルト値はPO_DOCUMENT$Userです。

PL/SQLプロシージャDBMS_JSON.rename_columnを使用して、所定のフィールドおよび型に対するo:preferred_column_nameの値を設定できます。

フィールドo:preferred_column_nameは、JSON列を格納する表内の新しい仮想列の名前を付けるために使用されます。または、表内のその他の列も格納する新しいビュー内の列の名前を付けるために使用されます。どちらの場合も、o:preferred_column_nameによって指定される名前は、表内の他の列との間で固有である必要があります。さらに、この名前は、文書セット内のすべての型のすべてのJSONフィールド間で固有である必要があります。DBMS_JSON.get_index_dataguideによって、これらの方法でデフォルト値が固有であることが保証されます。

DBMS_JSON.rename_columnを使用して指定する名前によって競合が発生する場合、指定した名前は無視され、そのかわりにシステムが生成した名前が使用されます。

18.5 フィールド列の優先名の指定

JSONフィールドは、データベース・ビュー内の列として、またはJSON列を含む同じ表に追加される仮想列として、データから投影されるようにできます。このような列に優先名を指定できます。

同じ文書セットから取得されたデータ・ガイドが、この投影を定義するために使用されます。投影された各列の名前は、投影されるJSONデータ・フィールド用にデータ・ガイド・フィールドo:preferred_column_nameから取得されます。優先名を指定すると、このデータ・ガイド・フィールドの値が変更されます。

JSONデータにデータ・ガイド対応の検索索引がある場合、所定のフィールドから投影された列に優先名を指定するためにプロシージャDBMS_JSON.rename_columnを使用できます。例18-4に、これを示します。表18-4に示すように、様々なフィールドから投影された列に優先名を指定します。(フィールドは、プロシージャDBMS_JSON.create_viewDBMS_JSON.create_view_on_pathまたはDBMS_JSON.add_virtual_columnsを使用するときに列として投影されます。)

表18-4 いくつかのJSONフィールド列の優先名

フィールド JSON型 優先列名
PONumber number PONumber
Phone (オブジェクトでなく文字列としての電話で番号) string Phone
type (電話の型) string PhoneType
number (電話番号) string PhoneNumber
ItemNumber (明細項目番号) number ItemNumber
Description (部品の説明) string PartDescription

関連項目:

例18-4 いくつかのJSONフィールド用の優先列名の指定

BEGIN
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.PONumber',
    DBMS_JSON.TYPE_NUMBER, 'PONumber');
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.ShippingInstructions.Phone',
    DBMS_JSON.TYPE_STRING, 'Phone');
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.ShippingInstructions.Phone.type',
    DBMS_JSON.TYPE_STRING, 'PhoneType');
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.ShippingInstructions.Phone.number',
    DBMS_JSON.TYPE_STRING, 'PhoneNumber');
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.LineItems.ItemNumber',
    DBMS_JSON.TYPE_NUMBER, 'ItemNumber');
  DBMS_JSON.rename_column(
    'J_PURCHASEORDER', 'PO_DOCUMENT', '$.LineItems.Part.Description',
    DBMS_JSON.TYPE_STRING, 'PartDescription');
END;
/

18.6 データ・ガイド情報に基づくJSONデータのビューの作成

データ・ガイド情報に基づいて、JSON文書セットに存在する特定のスカラー・フィールドを投影した列を持つデータベース・ビューを作成できます。階層データ・ガイドを編集するか、SQL/JSONパス式を指定することによって、投影するフィールドを選択でき、フィールド出現の最小頻度を選択できます。

(同じJSON文書セットに基づいて、異なるフィールドを投影する複数のビューを作成できます。文書セットごとの複数のデータ・ガイドを参照してください。)

SQL/JSONファンクションjson_table — SQL/JSONファンクション(JSON_TABLEを使用したJSONデータに対するビューの作成を参照)を使用してJSONフィールドを投影することで、ビューを作成できます。もう1つの方法は、PL/SQLプロシージャDBMS_JSON.create_viewまたはDBMS_JSON.create_view_on_pathを使用して、使用可能なデータ・ガイド情報に基づいて選択したフィールドを投影し、ビューを作成することです。

この情報は、投影するフィールドのみが含まれた階層データ・ガイド、またはデータ・ガイド対応JSON検索索引のいずれかに基づくことができ、SQL/JSONパス式と最小フィールド頻度をあわせて使用できます。

前者の場合、プロシージャcreate_viewを使用します。(階層)データ・ガイドを編集し、目的のフィールドを指定できます。この場合、データ・ガイド対応検索索引は必要ありません

後者の場合、プロシージャcreate_view_on_pathを使用します。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。SQL/JSONパス式を指定し、必要に応じて出現の最小頻度を指定します。投影される文書セット内のフィールドには、次の両方が含まれます。

  • 配列下にないすべてのスカラー・フィールド。

  • 指定したSQL/JSONパス式が対象とするデータ内のすべてのレベルのすべてのスカラー・フィールド。

ビューを作成する方法に関係なく、列として投影されるJSONフィールドに加えて、表内のJSON以外の列もビューの列になります。

プロシージャcreate_view_on_pathを使用する場合、指定するPATH引数は、単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップは付かないものである必要があります。SQL/JSONパス式の構文を参照してください。

どのように作成されても、所定のビュー定義の基礎となるデータ・ガイドは静的であり、必ずしも文書セット内の最新のデータを正確に反映しているわけではありません。ビューに投影されるフィールドは、ビューの作成時に決定されます。

具体的には、create_view_on_path (データ・ガイド対応検索索引が必要)を使用する場合、対象となるフィールドは、所定のパス式で指定されたフィールドと、所定の頻度以上のフィールドです(ビュー作成時の索引データに基づく)。

トピック:

18.6.1 階層データ・ガイドに基づくJSONデータのビューの作成

階層的なデータ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。

PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用することで、階層データ・ガイドを取得できます。そのためには、JSONデータの列にデータ・ガイド対応JSON検索索引を定義する必要があります。

取得したデータ・ガイドを編集することで、特定のフィールドのみを含め、任意の型の長さを変更し、フィールドの名前を変更できます。結果のデータ・ガイドに、ビューの列として投影されるJSONデータのフィールドが指定されます。

PL/SQLプロシージャDBMS_JSON.create_viewを使用してビューを作成します。

例18-5に、これを示します。

例18-5 GET_INDEX_DATAGUIDEを使用して取得するデータ・ガイドを使用したビューの作成

この例では、データ・ガイド対応JSON検索索引列po_document(表j_purchaseorder内)から取得した階層データ・ガイド内に存在するすべてのフィールドを投影するビューを作成します。(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.create_view(
       'VIEW1',
       'J_PURCHASEORDER',
       'PO_DOCUMENT',
       DBMS_JSON.get_index_dataguide('J_PURCHASEORDER',
                                     'PO_DOCUMENT',
                                     DBMS_JSON.FORMAT_HIERARCHICAL));

DESCRIBE view1
 Name                             Null?    Type
 -------------------------------- -------- ---------------------------
 DATE_LOADED                               TIMESTAMP(6) WITH TIME ZONE
 ID                               NOT NULL RAW(16)
 PO_DOCUMENT$User                          VARCHAR2(8)
 PONumber                                  NUMBER
 PO_DOCUMENT$Reference                     VARCHAR2(16)
 PO_DOCUMENT$Requestor                     VARCHAR2(16)
 PO_DOCUMENT$CostCenter                    VARCHAR2(4)
 PO_DOCUMENT$AllowPartialShipment          VARCHAR2(4)
 PO_DOCUMENT$name                          VARCHAR2(16)
 Phone                                     VARCHAR2(16)
 PO_DOCUMENT$city                          VARCHAR2(32)
 PO_DOCUMENT$state                         VARCHAR2(2)
 PO_DOCUMENT$street                        VARCHAR2(32)
 PO_DOCUMENT$country                       VARCHAR2(32)
 PO_DOCUMENT$zipCode                       NUMBER
 PO_DOCUMENT$SpecialInstructions           VARCHAR2(8)
 PO_DOCUMENT$UPCCode                       NUMBER
 PO_DOCUMENT$UnitPrice                     NUMBER
 PartDescription                           VARCHAR2(32)
 PO_DOCUMENT$Quantity                      NUMBER
 ItemNumber                                NUMBER
 PhoneType                                 VARCHAR2(8)
 PhoneNumber                               VARCHAR2(16)

18.6.2 パス式に基づくJSONデータのビューの作成

データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。

たとえば、パス式が$の場合、すべてのスカラー・フィールドが投影されます。これは、文書のルート(最上部)が対象であるためです。例18-6に、これを示します。パスが$.LineItems.Partの場合、$.LineItems.Partの対象データ内にあるすべてのレベルのスカラー・フィールドのみが投影されます(配列下以外のすべての場所のスカラー・フィールドに加えて)。例18-7に、これを示します。

JSON文書セットに関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内に存在するフィールドへの各パスの出現頻度を記録します。ビューを作成するときは、所定の最小出現頻度(割合として)のスカラー・フィールドのみが、ビュー列として投影されることを指定できます。これには、パラメータFREQUENCYの値として、プロシージャDBMS_JSON.create_view_on_pathにゼロ以外の値を指定します。

たとえば、パスを$として指定し、最小頻度を50として指定する場合、文書の半分(50%)以上に出現するすべてのスカラー・フィールド($は文書全体を対象とするため、すべてのパス)が投影されます。例18-8に、これを示します。

引数PATHの値は単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップが付くことはありません。SQL/JSONパス式の構文を参照してください。

頻度フィルタが発生しないのは、次のどちらの場合も該当します。対象フィールドは、文書内の出現頻度にかかわらず投影されます。
  • JSON文書セットの統計情報を収集したことがありません。(頻度情報は、データ・ガイド対応JSON検索索引に含まれません。)

  • FREQUENCY引数(DBMS_JSON.create_view_on_path内)はゼロ(0)です。

注意:

FREQUENCY引数がゼロ以外の場合、文書セットに関する統計情報を収集していても、最後に統計情報を収集した後に追加されたすべての文書の統計情報は、索引には含まれません。これは、統計の収集後に追加されたすべてのフィールドは無視される(投影されない)ことを意味します。

例18-6 すべてのスカラー・フィールドを投影するビューの作成

指定されたパスが$であるため、すべてのスカラー・フィールドがビュー内に表れます。

(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。下線の行は、例18-8にはありません。)

EXEC DBMS_JSON.create_view_on_path('VIEW2',
                                   'J_PURCHASEORDER',
                                   'PO_DOCUMENT',
                                   '$');

DESCRIBE view2;
 Name                              Null?    Type
 --------------------------------  -------- ------------------
 ID                                NOT NULL RAW(16)
 DATE_LOADED                       TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT$User                  VARCHAR2(8)
 PONumber                          NUMBER
 PO_DOCUMENT$Reference             VARCHAR2(16)
 PO_DOCUMENT$Requestor             VARCHAR2(16)
 PO_DOCUMENT$CostCenter            VARCHAR2(4)
 PO_DOCUMENT$AllowPartialShipment  VARCHAR2(4)
 PO_DOCUMENT$name                  VARCHAR2(16)
 Phone                             VARCHAR2(16)
 PO_DOCUMENT$city                  VARCHAR2(32)
 PO_DOCUMENT$state                 VARCHAR2(2)
 PO_DOCUMENT$street                VARCHAR2(32)
 PO_DOCUMENT$country               VARCHAR2(32)
 PO_DOCUMENT$zipCode               NUMBER
 PO_DOCUMENT$SpecialInstructions   VARCHAR2(8)
 PO_DOCUMENT$UPCCode               NUMBER
 PO_DOCUMENT$UnitPrice             NUMBER
 PartDescription                   VARCHAR2(32)
 PO_DOCUMENT$Quantity              NUMBER
 ItemNumber                        NUMBER
 PhoneType                         VARCHAR2(8)
 PhoneNumber                       VARCHAR2(16)

例18-7 パス式で対象とされたスカラー・フィールドを投影するビューの作成

フィールドItemnumberPhoneTypePhoneNumberはビュー内には表れません。投影されるフィールドは、配列下にないスカラー・フィールドに加えて、$.LineItems.Partで対象とされるデータ内のすべてのレベルにあるスカラー・フィールドのみです(つまり、パスが$.LineItems.Partで始まるパスにあるスカラー・フィールド)。(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

SQL> EXEC DBMS_JSON.create_view_on_path('VIEW4',
                                        'J_PURCHASEORDER',
                                        'PO_DOCUMENT',
                                        '$.LineItems.Part');


SQL> DESCRIBE view4;
 Name                             Null?    Type
 -------------------------------- -------- ------------------
 ID                               NOT NULL RAW(16)
 DATE_LOADED                      TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT$User                 VARCHAR2(8)
 PONumber                         NUMBER
 PO_DOCUMENT$Reference            VARCHAR2(16)
 PO_DOCUMENT$Requestor            VARCHAR2(16)
 PO_DOCUMENT$CostCenter           VARCHAR2(4)
 PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)
 PO_DOCUMENT$name                 VARCHAR2(16)
 Phone                            VARCHAR2(16)
 PO_DOCUMENT$city                 VARCHAR2(32)
 PO_DOCUMENT$state                VARCHAR2(2)
 PO_DOCUMENT$street               VARCHAR2(32)
 PO_DOCUMENT$country              VARCHAR2(32)
 PO_DOCUMENT$zipCode              NUMBER
 PO_DOCUMENT$SpecialInstructions  VARCHAR2(8)
 PO_DOCUMENT$UPCCode              NUMBER
 PO_DOCUMENT$UnitPrice            NUMBER
 PartDescription                  VARCHAR2(32)

例18-8 所定の頻度のスカラー・フィールドを投影するビューの作成

文書のすべて(100%)に出現するすべてのスカラー・フィールドがビュー内に表れます。フィールドAllowPartialShipmentは文書のすべてには出現しないため、列PO_DOCUMENT$AllowPartialShipmentはビュー内にありません。フィールドPhonePhoneTypePhoneNumberの場合も同様です。

(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

SQL> EXEC DBMS_JSON.create_view_on_path('VIEW3',
                                        'J_PURCHASEORDER',
                                        'PO_DOCUMENT',
                                        '$',
                                        100);


SQL> DESCRIBE view3;
 Name                             Null?    Type
 -------------------------------- -------- ------------------
 ID                               NOT NULL RAW(16)
 DATE_LOADED                      TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT$User                 VARCHAR2(8)
 PONumber                         NUMBER
 PO_DOCUMENT$Reference            VARCHAR2(16)
 PO_DOCUMENT$Requestor            VARCHAR2(16)
 PO_DOCUMENT$CostCenter           VARCHAR2(4)
 PO_DOCUMENT$name                 VARCHAR2(16)
 PO_DOCUMENT$city                 VARCHAR2(32)
 PO_DOCUMENT$state                VARCHAR2(2)
 PO_DOCUMENT$street               VARCHAR2(32)
 PO_DOCUMENT$country              VARCHAR2(32)
 PO_DOCUMENT$zipCode              NUMBER
 PO_DOCUMENT$SpecialInstructions  VARCHAR2(8)
 PO_DOCUMENT$UPCCode              NUMBER
 PO_DOCUMENT$UnitPrice            NUMBER
 PartDescription                  VARCHAR2(32)
 PO_DOCUMENT$Quantity             NUMBER
 ItemNumber                       NUMBER

18.7 データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールドです。

パフォーマンスを向上する目的で、仮想列を使用して次のすべてを実現できます。

  • 列に索引を構築します。

  • オプティマイザ用に列の統計を収集します。

  • インメモリー列ストア(IM列ストア)に列をロードします。

注意:

仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

PL/SQLプロシージャDBMS_JSON.add_virtual_columnsを使用して、JSON列用にデータ・ガイド情報に基づく仮想列を追加します。仮想列を追加する前に、add_virtual_columnsプロシージャはまず、前に起動されたadd_virtual_columnsまたはデータ・ガイド変更トリガー・プロシージャadd_vcによって、同じJSON列のフィールドから作成された既存の仮想列をすべて削除します(実質上、DBMS_JSON.drop_virtual_columnsプロシージャの動作を実行していることになります)。

プロシージャadd_virtual_columnsに提供するデータ・ガイド情報には、これ以外に次の2つのソースがあります。

  • 引数として渡す階層データ・ガイドからの情報があります。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。

    この場合、データ・ガイドが投影するスカラー・フィールド(配列下にないもの)を指定するように編集してから、データ・ガイドを渡すことができます。この場合、データ・ガイド対応検索索引は必要ありません

  • データ・ガイド対応JSON検索索引からの情報があります。

    この場合、投影されるスカラー・フィールドの最小出現頻度を引数FREQUENCYの値としてプロシージャadd_virtual_columnsに指定できます。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。

また、追加した仮想列を非表示にすることも指定できます。SQL describeコマンドでは、非表示にした列は列挙されません。

  • 階層データ・ガイドをadd_virtual_columnsに渡す場合、特定のスカラー・フィールド(配列下にないもの)の投影を非表示の仮想列として指定できます。これは、データ・ガイドの列の説明に"o:hidden": trueを追加することで行います。

  • データ・ガイド対応JSON検索索引をadd_virtual_columnsと一緒に使用する場合、PL/SQL TRUEの値を引数HIDDENに指定し、追加されたすべての仮想列が非表示になるようにします。(HIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示でないことを意味します。)

トピック:

18.7.1 階層データ・ガイドに基づくJSONフィールドの仮想列の追加

階層データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。

PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用することで、階層データ・ガイドを取得できます。データ・ガイド対応JSON検索索引は、JSONデータの列に定義されている必要があります。

取得したデータ・ガイドを編集することで、特定のスカラー・フィールド(配列下にないもの)のみを含め、フィールドの名前を変更し、フィールドの型の長さを変更できます。結果のデータ・ガイドに、新しい仮想列として投影されるこれらのフィールドが指定されます。配列下にないスカラー・フィールドでないデータ・ガイド内のすべてのフィールドは無視されます(投影されません)。

PL/SQLプロシージャDBMS_JSON.add_virtual_columnsを使用して、投影されたフィールドを含むJSON列を格納する表に仮想列を追加します。まずプロシージャは、以前のadd_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vc(実質的に、このプロシージャの実行内容はプロシージャDBMS_JSON.drop_virtual_columnsと同じ)によって同じJSON列内のフィールドから投影された既存の仮想列を削除します。

例18-9に、これを示します。これは、JSON列po_document内の表j_purchaseorderのデータから配列下にないスカラー・フィールドを投影します。投影されたフィールドは、階層データ・ガイド内で示されるフィールドです。

例18-10に、仮想列としての2つのフィールドの投影を指定するデータ・ガイド引数を渡す方法を示しています。データ・ガイド・フィールドo:hiddenは、これらの列の1つを非表示にするために使用されます。

例18-9 GET_INDEX_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加

この例では、階層データ・ガイドはJSON列po_documentのデータ・ガイド対応JSON検索索引から取得されます。

追加された仮想列は、すべて表j_purchaseorder内の列です。IDDATE_LOADEDPODOCUMENTは例外です。

(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns(
       'J_PURCHASEORDER',
       'PO_DOCUMENT',
       DBMS_JSON.get_index_dataguide('J_PURCHASEORDER',
                                     'PO_DOCUMENT',
                                     DBMS_JSON.FORMAT_HIERARCHICAL));

DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT                                        CLOB
 PO_DOCUMENT$User                                   VARCHAR2(8)
 PONumber                                           NUMBER
 PO_DOCUMENT$Reference                              VARCHAR2(16)
 PO_DOCUMENT$Requestor                              VARCHAR2(16)
 PO_DOCUMENT$CostCenter                             VARCHAR2(4)
 PO_DOCUMENT$AllowPartialShipment                   VARCHAR2(4)
 PO_DOCUMENT$name                                   VARCHAR2(16)
 Phone                                              VARCHAR2(16)
 PO_DOCUMENT$city                                   VARCHAR2(32)
 PO_DOCUMENT$state                                  VARCHAR2(2)
 PO_DOCUMENT$street                                 VARCHAR2(32)
 PO_DOCUMENT$country                                VARCHAR2(32)
 PO_DOCUMENT$zipCode                                NUMBER
 PO_DOCUMENT$SpecialInstructions                    VARCHAR2(8)

例18-10 仮想列の非表示および表示での追加

この例では、PO_NumberPO_Referenceの2つのフィールドのみが仮想列として投影されます。データ・ガイドは、リテラル文字列としてローカルで定義されます。データ・ガイド・フィールドo:hiddenは、ここでPO_Referenceの仮想列を非表示にするために使用されます。(PO_Numberの場合、o:hidden: falseエントリは必要ありません。これは、falseがデフォルト値であるためです。)

DECLARE
  dg CLOB;
BEGIN
  dg := '{"type" : "object",
          "properties" :
            {"PO_Number"    : {"type" : "number",
                               "o:length" : 4,
                               "o:preferred_column_name" : "PO_Number",
                               "o:hidden" : false},
             "PO_Reference" : {"type" : "string",
                               "o:length" : 16,
                               "o:preferred_column_name" : "PO_Reference",
                               "o:hidden" : true}}}';
  DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT', dg);
END;
/

DESCRIBE j_purchaseorder;
 Name        Null?    Type
 ----------- -------- ---------------------------
 ID          NOT NULL RAW(16)
 DATE_LOADED          TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT          CLOB
 PO_Number            NUMBER

SELECT column_name FROM user_tab_columns
  WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;
COLUMN_NAME
-----------
DATE_LOADED
ID
PO_DOCUMENT
PO_Number
PO_Reference

5 rows selected.

18.7.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加

JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。

プロシージャDBMS_JSON.add_virtual_columnsを使用して、仮想列を追加します。

例18-11に、これを示します。配列下にないすべてのスカラー・フィールドは、表j_purchaseorderに仮想列として投影されます。

フィールドを投影するJSON列内の文書に関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内の各フィールドの出現頻度を記録します。

仮想列を追加するときは、所定の最小発生頻度のフィールドのみが投影されることを指定できます。

これには、パラメータFREQUENCYの値として、プロシージャadd_virtual_columnsにゼロ以外の値を指定します。ゼロはデフォルト値であるため、引数FREQUENCYを含めないと、すべてのスカラー・フィールド(配列下にないもの)が投影されます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。

例18-12は、文書のすべて(100%)に出現するすべてのスカラー(配列下にないもの)を仮想列として投影します。

追加されたすべての仮想列を非表示にする場合、TRUE値を引数HIDDENに指定します。(パラメータHIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示でないことを意味します。)

例18-13は、文書のすべて(100%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。

例18-11 配列下にないすべてのスカラー・フィールドの仮想列としての投影

追加された仮想列は、すべて表j_purchaseorder内の列です。IDDATE_LOADEDPODOCUMENTは例外です。これは、FREQUENCY引数がadd_virtual_columnsに渡されないため、すべてのスカラー・フィールド(配列下にないもの)が投影されます。

(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT');

DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT                                        CLOB
 PO_DOCUMENT$User                                   VARCHAR2(8)
 PONumber                                           NUMBER
 PO_DOCUMENT$Reference                              VARCHAR2(16)
 PO_DOCUMENT$Requestor                              VARCHAR2(16)
 PO_DOCUMENT$CostCenter                             VARCHAR2(4)
 PO_DOCUMENT$AllowPartialShipment                   VARCHAR2(4)
 PO_DOCUMENT$name                                   VARCHAR2(16)
 Phone                                              VARCHAR2(16)
 PO_DOCUMENT$city                                   VARCHAR2(32)
 PO_DOCUMENT$state                                  VARCHAR2(2)
 PO_DOCUMENT$street                                 VARCHAR2(32)
 PO_DOCUMENT$country                                VARCHAR2(32)
 PO_DOCUMENT$zipCode                                NUMBER
 PO_DOCUMENT$SpecialInstructions                    VARCHAR2(8)

例18-12 最小頻度のスカラー・フィールドの仮想列としての投影

文書のすべて(100%)に出現するすべてのスカラー・フィールドが、仮想列として投影されます。この結果は例18-11と同じですが、フィールドAllowPartialShipmentPhoneが投影されない点が異なります。これは、これらが文書の100%には出現しないためです。

(名前がイタリックdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT', 100);

DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT                                        CLOB
 PO_DOCUMENT$User                                   VARCHAR2(8)
 PONumber                                           NUMBER
 PO_DOCUMENT$Reference                              VARCHAR2(16)
 PO_DOCUMENT$Requestor                              VARCHAR2(16)
 PO_DOCUMENT$CostCenter                             VARCHAR2(4)
 PO_DOCUMENT$name                                   VARCHAR2(16)
 PO_DOCUMENT$city                                   VARCHAR2(32)
 PO_DOCUMENT$state                                  VARCHAR2(2)
 PO_DOCUMENT$street                                 VARCHAR2(32)
 PO_DOCUMENT$country                                VARCHAR2(32)
 PO_DOCUMENT$zipCode                                NUMBER
 PO_DOCUMENT$SpecialInstructions                    VARCHAR2(8)

例18-13 最小頻度のスカラー・フィールドの非表示の仮想列としての投影

この結果は例18-12と同じですが、追加されたすべての仮想列が非表示であることが異なります。(ビューUSER_TAB_COLUMNSの問合せは、仮想列が実際に追加されたことを示します。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT', 100, TRUE);

DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT                                        CLOB

SELECT column_name FROM user_tab_columns WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;

COLUMN_NAME
-----------
DATE_LOADED
ID
PONumber
PO_DOCUMENT
PO_DOCUMENT$CostCenter
PO_DOCUMENT$Reference
PO_DOCUMENT$Requestor
PO_DOCUMENT$SpecialInstructions
PO_DOCUMENT$User
PO_DOCUMENT$city
PO_DOCUMENT$country
PO_DOCUMENT$name
PO_DOCUMENT$state
PO_DOCUMENT$street
PO_DOCUMENT$zipCode

18.7.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除

プロシージャDBMS_JSON.drop_virtual_columnsを使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。

プロシージャDBMS_JSON.drop_virtual_columnsは、add_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vcによって所定のJSON列内のフィールドから投影されたすべての仮想列を削除します。例18-14は、列po_documentの表j_purchaseorderから投影されたフィールドについてのこの状態を示します。

例18-14 JSONフィールドから投影された仮想列の削除

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT');

18.8 データ・ガイド対応検索索引の変更トリガー

JSONデータが変更されると、データ・ガイド対応のJSON検索索引の一部の情報は自動的に更新されます。これが発生するたびに起動がトリガーされるプロシージャを指定できます。自分のPL/SQLプロシージャをこれに定義でき、事前定義済変更トリガー・プロシージャであるadd_vcを使用することもできます。

データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、構造、型、および場合によってJSON文書セットに関する統計情報を記録します。収集時にのみ更新される統計情報を除いて、文書セット内の関連する変更内容は、索引内に格納されるデータ・ガイド情報に自動的に反映されます。

このような索引の更新によって起動が自動的にトリガーされるPL/SQLプロシージャを定義できます。起動は索引の更新時に発生します。プロシージャの実行中に発生したエラーは無視されます。

事前定義済変更トリガー・プロシージャadd_vcを使用して、文書セットからのJSONフィールドを投影する仮想列を自動的に追加する、または必要に応じてこのような既存の列を変更できます。add_vcによって追加された仮想列は、データ・ガイド対応検索索引を持つJSON列用にプロシージャDBMS_JSON.add_virtual_columnsの起動によって追加された列と同じ命名規則に従います。

この場合、プロシージャの実行中に発生したエラーは無視されます

DBMS_JSON.add_virtual_columnsとは異なり、add_vcは、最初に同じJSON列内のフィールドから投影された既存の仮想列を削除することはありませんadd_vcまたはadd_virtual_columnsによって同じJSON列内のフィールドから投影された仮想列を削除するには、プロシージャDBMS_JSON.drop_virtual_columnsを使用します。

データ・ガイドの変更のために、JSON検索索引の作成時または変更時に、キーワードDATAGUIDE ON CHANGEPARAMETERS句内で使用することによって、トリガーを使用することを指定します。索引ごとに、1つの変更トリガーのみが許可されます。トリガーを指定する索引を変更することで、そのための以前の任意トリガーは自動的に置換されます。

例18-15は、既存のJSON検索索引po_search_idxをプロシージャadd_vcを使用するための索引から変更します。

例18-15 変更トリガーADD_VCによる仮想列の自動的な追加

この例では、事前定義済変更トリガーadd_vcをJSON検索索引po_search_idxに追加します。

まず、JSON列po_document内のフィールドから、プロシージャDBMS_JSON.add_virtual_columnsまたは事前定義済add_vc変更トリガーによって同じJSON検索索引用に投影された既存の仮想列を削除します。

次に、検索索引を変更し、変更トリガーadd_vc (すでに存在する場合、これに効力はありません)を追加します。

最後に、データ・ガイドに変更を発生させる新しい文書を挿入します。2つの仮想列が、配列下にない2つのスカラー・フィールド用に表に追加されます。

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT');

ALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE ON CHANGE add_vc');

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-JUN-2015'),
    '{"PO_Number"     : 4230,
      "PO_Reference"  : "JDEER-20140421",
      "PO_LineItems"  : [{"Part_Number"  : 230912362345,
                          "Quantity"     : 3.0}]}');

DESCRIBE j_purchaseorder;
 Name                      Null?    Type
 ------------------------- -------- ----------------------------
 ID                        NOT NULL RAW(16)
 DATE_LOADED                        TIMESTAMP(6) WITH TIME ZONE
 PO_DOCUMENT                        CLOB
 PO_DOCUMENT$PO_Number              NUMBER
 PO_DOCUMENT$PO_Reference           VARCHAR2(16)

トピック:

18.8.1 ユーザー定義のデータ・ガイド変更トリガー

所定のデータ・ガイド対応JSON検索索引が更新されるたびに、自動的に起動がトリガーされるプロシージャを定義できます。プロシージャの実行中に発生したエラーは無視されます。

例18-16に、これを示します。

キーワードDATAGUIDE ON CHANGEを使用してJSON検索索引PARAMETERS句内に指定されたユーザー定義のプロシージャは、表18-5で指定されたパラメータを受け入れる必要があります。

表18-5 ユーザー定義のデータ・ガイド変更トリガー・プロシージャのパラメータ

名前 説明
table_name VARCHAR2 column_nameを格納する表の名前です。
column_name VARCHAR2 データ・ガイド対応JSON検索索引を持つJSON列の名前です。
path VARCHAR2 column_nameのデータ内の特定のフィールドを対象とするSQL/JSONパス式です。このパスは、プロシージャの起動をトリガーする索引の変更の影響を受けます。たとえば、索引の変更は、このパスの追加、または値の型や型の長さの値の変更に関係があります。
new_type NUMBER 指定されたパスの新しい型です。
new_type_length NUMBER 指定されたパスの新しい型の長さです。

例18-16 ユーザー定義の変更トリガーを使用したデータ・ガイド更新のトレース

この例は、まずJSON列po_document内のフィールドから投影された既存の仮想列を削除します。

次に、PL/SQLプロシージャmy_dataguide_traceを定義します。これは、表名とJSON列を追加された仮想列のパス、型、長さの各フィールドと一緒に出力します。次に、JSON検索索引po_search_idxを変更し、このプロシージャが、索引内のデータ・ガイド情報への更新に対する変更トリガーとして起動されることを指定します。

次に、データ・ガイドに変更を発生させる新しい文書を挿入します。これにより、トレース情報の出力がトリガーされます。

プロシージャに対するTYPE引数は、JSON型のDBMS_JSON定数のうちの1つの数値である必要があることに注意してください。このプロシージャは、引数をテストし、数値のかわりにユーザーにわかりやすい文字列を出力します。

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT');

CREATE OR REPLACE PROCEDURE my_dataguide_trace(tableName VARCHAR2,
                                               jcolName  VARCHAR2,
                                               path      VARCHAR2,
                                               type      NUMBER,
                                               tlength   NUMBER)
  IS
    typename VARCHAR2(10);
  BEGIN
    IF    (type = DBMS_JSON.TYPE_NULL)    THEN typename := 'null';
    ELSIF (type = DBMS_JSON.TYPE_BOOLEAN) THEN typename := 'boolean';
    ELSIF (type = DBMS_JSON.TYPE_NUMBER)  THEN typename := 'number';
    ELSIF (type = DBMS_JSON.TYPE_STRING)  THEN typename := 'string';
    ELSIF (type = DBMS_JSON.TYPE_OBJECT)  THEN typename := 'object';
    ELSIF (type = DBMS_JSON.TYPE_ARRAY)   THEN typename := 'array';
    ELSE                                       typename := 'unknown';
    END IF;
    DBMS_OUTPUT.put_line('Updating ' || tableName || '(' || jcolName || '):
  Path = ' || path || ', Type = ' || type || ', Type Name = ' || typename
         || ', Type Length = ' || tlength);
  END;
/

ALTER INDEX po_search_idx REBUILD
  PARAMETERS ('DATAGUIDE ON CHANGE my_dataguide_trace');

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-MAR-2016'),
    '{"PO_ID"     : 4230,
      "PO_Ref"  : "JDEER-20140421",
      "PO_Items"  : [{"Part_No"       : 98981327234,
                      "Item_Quantity" : 13}]}');

COMMIT;
Updating J_PURCHASEORDER(PO_DOCUMENT):
  Path = $.PO_ID, Type = 3, Type Name = number, Type Length = 4
Updating J_PURCHASEORDER(PO_DOCUMENT):
  Path = $.PO_Ref, Type = 4, Type Name = string, Type Length = 16
Updating J_PURCHASEORDER(PO_DOCUMENT):
  Path = $.PO_Items, Type = 6, Type Name = array, Type Length = 64
Updating J_PURCHASEORDER(PO_DOCUMENT):
  Path = $.PO_Items.Part_No, Type = 3, Type Name = number, Type Length = 16
Updating J_PURCHASEORDER(PO_DOCUMENT):
  Path = $.PO_Items.Item_Quantity, Type = 3, Type Name = number, Type Length = 2

Commit complete.

関連項目:

18.9 文書セットごとの複数のデータ・ガイド

データ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。

異なる種類のJSON文書用のデータ・ガイド

JSON文書は、規定のスキーマに従う必要はなく、通常は従うことはありません。これは、所定のアプリケーションで同様に使用される文書の場合も当てはまります。これらは構造的に(形状)異なる可能性があり、フィールド型が異なる可能性があります。

JSONデータ・ガイドは、所定の文書セットの構造的情報と型情報を要約します。一般に、所定のセット内の文書の構造的情報と型情報が類似するほど、結果のデータ・ガイドの有用性は高まります。

データ・ガイドは、JSONデータの所定の列に対して作成されます。列に異なる種類の文書(たとえば発注書と健康記録)が含まれる場合、その列に単一のデータ・ガイドを用意しても、用途が限られると考えられます。

この懸念に対処する1つの方法は、異なるJSON列に異なる種類のJSON文書を配置することです。ただし、その他の事項を考慮した結果、同じ列内に異なる種類の文書を混在させることを選ぶ場合があります。

さらに、同じ列に格納すると決定した同じ一般的な種類の文書が、それにもかかわらず系統的な方法が比較的異なる場合があります。これには、形状や型情報が発展する文書の場合が含まれます。たとえば、税情報の文書の構造が年々変更される可能性があります。

データ・ガイドの作成時に、要約する情報を決定できます。そのため、同じJSON列に異なるデータ・ガイドを作成し、文書セットの異なるサブセットを表現できます。

これに関するもう1つの対処法は、JSONでない個別の列を同じ表内に設け、JSON列内の文書のラベルまたは分類に使用することです。

例に使用されている発注書の文書の場合、構造が年々大幅に変更される可能性があると考えると、形状が類似したサブセットにグループ化するために列date_loadedを表j_purchaseorder内で使用できます。例18-17は2015の発注書の文書を追加し、例18-18は2016の発注書の文書を追加します。(例4-2で追加された2014の文書と比較します。)

複数のデータ・ガイドを作成するためのSQL集計関数の使用

Oracle SQLファンクションjson_dataguideは、実際は集計関数です。集計関数は、単一行ではなく行のグループに基づいて1つの結果行を戻します。通常SELECTリストの中でGROUP BY句を持つ問合せに使用され、問い合せられた表またはビューの行をグループに分割します。集計関数は行の各グループに適用され、各グループの単一の結果行を返します。たとえば、集計関数avgは、値グループの平均値を返します。

ファンクションjson_dataguideはJSONデータを集計し、データの要約または仕様を作成します。これはJSON文書の形式で返されます。言い換えると、適用先のJSON文書の各グループについて、データ・ガイドが返されます。

GROUP BYを省略すると、このファンクションは対象のJSON列内のすべてのJSONデータを要約した単一のデータ・ガイドを返します。

例18-19は、JSON列po_documentのドキュメントを問い合せます。このときにそれらをグループ化し、列date_loadedの各年に1つ、合計3つのデータ・ガイドを生成します。

例18-17 2015発注書の文書の追加

2015発注書形式は、部品番号、参照、明細項目のみ最上位フィールドとして使用し、これらのフィールドは接頭辞PO_を使用します。各明細項目に、部品番号と数量のみが含まれます。

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-JUN-2015'),
    '{"PO_Number"     : 4230,
      "PO_Reference"  : "JDEER-20140421",
      "PO_LineItems"  : [{"Part_Number"  : 230912362345,
                          "Quantity"     : 3.0}]}');

例18-18 2016発注書の文書の追加

2016形式は、PO_IDPO_Numberのかわりに、PO_RefPO_Referenceのかわりに、PO_ItemsPO_LineItemsのかわりに、Part_NoPart_Numberのかわりに、Item_QuantityQuantityのかわりに使用します。

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-MAR-2016'),
    '{"PO_ID"     : 4230,
      "PO_Ref"  : "JDEER-20140421",
      "PO_Items"  : [{"Part_No"       : 98981327234,
                      "Item_Quantity" : 13}]}');

例18-19 集計関数JSON_DATAGUIDEを使用した複数のデータ・ガイドの作成

この例は、SQL集計関数json_dataguideを使用して、年固有の形式につき1つ、合計3つのフラット脚注1・データ・ガイドを取得します。2014のデータ・ガイドが部分的にのみ示されます。このガイドは、統計フィールドがないことを除き、発注書の文書のフラット・データ・ガイドからのデータ・ガイドと同じです。(ファンクションjson_dataguideによって返されるデータ・ガイドには、統計フィールドは含まれません。

SELECT extract(YEAR FROM date_loaded), json_dataguide(po_document) FROM j_purchaseorder
  GROUP BY extract(YEAR FROM date_loaded)
  ORDER BY extract(YEAR FROM date_loaded) DESC;

EXTRACT(YEARFROMDATE_LOADED)
----------------------------
JSON_DATAGUIDE(PO_DOCUMENT)
---------------------------
                        2016
[
  {
    "o:path" : "$.PO_ID",
    "type" : "number",
    "o:length" : 4
  },
  {
    "o:path" : "$.PO_Ref",
    "type" : "string",
    "o:length" : 16
  },
  {
    "o:path" : "$.PO_Items",
    "type" : "array",
    "o:length" : 64
  },
  {
    "o:path" : "$.PO_Items.Part_No",
    "type" : "number",
    "o:length" : 16
  },
  {
    "o:path" : "$.PO_Items.Item_Quantity",
    "type" : "number",
    "o:length" : 2
  }
]

                        2015
[
  {
    "o:path" : "$.PO_Number",
    "type" : "number",
    "o:length" : 4
  },
  {
    "o:path" : "$.PO_LineItems",
    "type" : "array",
    "o:length" : 64
  },
  {
    "o:path" : "$.PO_LineItems.Quantity",
    "type" : "number",
    "o:length" : 4
  },
  {
    "o:path" : "$.PO_LineItems.Part_Number",
    "type" : "number",
    "o:length" : 16
  },
  {
    "o:path" : "$.PO_Reference",
    "type" : "string",
    "o:length" : 16
  }
]

                        2014
[
  {
    "o:path" : "$.User",
    "type" : "string",
    "o:length" : 8
  },
  {
    "o:path" : "$.PONumber",
    "type" : "number",
    "o:length" : 4
  },
...
  {
    "o:path" : "$.\"Special Instructions\"",
    "type" : "string",
    "o:length" : 8
  }
]

3 rows selected.

関連項目:

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

18.10 データ・ガイドの問合せ

データ・ガイドは、一連のJSON文書に関する情報です。Oracle SQLファンクションjson_dataguideまたはPL/SQLファンクションDBMS_JSON.get_index_dataguideのいずれかを使用することで、取得するフラット・データ・ガイドからの情報を問合せられます。後者の場合、データ・ガイド対応JSON検索索引が、JSONデータ上で定義されている必要があります。

関連項目:

例18-20 JSON_DATAGUIDEを使用して取得するデータ・ガイドの問合せ

この例は、SQL/JSONファンクションjson_dataguideを使用して、フラット・データ・ガイドを取得します。次に、SQL/JSONファンクションjson_tableによってフィールドo:pathtypeo:lengthから即時に投影された関係する列を問い合せます。投影された列を、作成されたパス列jpathを基準として辞書順に返します。

WITH dg_t AS (SELECT json_dataguide(po_document) dg_doc FROM j_purchaseorder)
  SELECT jt.*
    FROM dg_t,
         json_table(dg_doc, '$[*]'
           COLUMNS
             jpath   VARCHAR2(40) PATH '$."o:path"',
             type    VARCHAR2(10) PATH '$."type"',
             tlength NUMBER       PATH '$."o:length"') jt
   ORDER BY jt.jpath;

JPATH                                    TYPE          TLENGTH
---------------------------------------- ---------- ----------
$."Special Instructions"                 string              8
$.AllowPartialShipment                   boolean             4
$.CostCenter                             string              4
$.LineItems                              array             512
$.LineItems.ItemNumber                   number              1
$.LineItems.Part                         object            128
$.LineItems.Part.Description             string             32
$.LineItems.Part.UPCCode                 number             16
$.LineItems.Part.UnitPrice               number              8
$.LineItems.Quantity                     number              4
$.PONumber                               number              4
$.PO_LineItems                           array              64
$.Reference                              string             16
$.Requestor                              string             16
$.ShippingInstructions                   object            256
$.ShippingInstructions.Address           object            128
$.ShippingInstructions.Address.city      string             32
$.ShippingInstructions.Address.country   string             32
$.ShippingInstructions.Address.state     string              2
$.ShippingInstructions.Address.street    string             32
$.ShippingInstructions.Address.zipCode   number              8
$.ShippingInstructions.Phone             array             128
$.ShippingInstructions.Phone             string             16
$.ShippingInstructions.Phone.number      string             16
$.ShippingInstructions.Phone.type        string              8
$.ShippingInstructions.name              string             16
$.User                                   string              8

例18-21 最小頻度が80%のパスに対する索引データを使用したデータ・ガイドの問合せ

この例では、PL/SQLファンクションDBMS_JSON.get_index_dataguideを形式の値DBMS_JSON.FORMAT_FLATと一緒に使用して、データ・ガイド対応JSON検索索引に格納されているデータ・ガイド情報からフラット・データ・ガイドを取得します。次に、フィールドo:pathtypeo:lengtho:frequencyからSQL/JSONファンクションjson_tableによって即時に投影された関係する列を問い合せます。

フィールドo:frequencyの値は、文書セット全体で、文書内の各フィールドの発生頻度を記録する統計情報です。文書セットに関して統計情報が収集された場合にのみ、使用できます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。

WITH dg_t AS (SELECT DBMS_JSON.get_index_dataguide('J_PURCHASEORDER',
                                                   'PO_DOCUMENT',
                                                   DBMS_JSON.FORMAT_FLAT) dg_doc
                FROM DUAL)
 SELECT jt.*
   FROM dg_t,
        json_table(dg_doc, '$[*]'
          COLUMNS
            jpath     VARCHAR2(40) PATH '$."o:path"',
            type      VARCHAR2(10) PATH '$."type"',
            tlength   NUMBER       PATH '$."o:length"',
            frequency NUMBER       PATH '$."o:frequency"') jt
   WHERE jt.frequency > 80;

JPATH                                    TYPE          TLENGTH  FREQUENCY
---------------------------------------- ---------- ---------- ----------
$.User                                   string              8        100
$.PONumber                               number              4        100
$.LineItems                              array             512        100
$.LineItems.Part                         object            128        100
$.LineItems.Part.UPCCode                 number             16        100
$.LineItems.Part.UnitPrice               number              8        100
$.LineItems.Part.Description             string             32        100
$.LineItems.Quantity                     number              4        100
$.LineItems.ItemNumber                   number              1        100
$.Reference                              string             16        100
$.Requestor                              string             16        100
$.CostCenter                             string              4        100
$.ShippingInstructions                   object            256        100
$.ShippingInstructions.name              string             16        100
$.ShippingInstructions.Address           object            128        100
$.ShippingInstructions.Address.city      string             32        100
$.ShippingInstructions.Address.state     string              2        100
$.ShippingInstructions.Address.street    string             32        100
$.ShippingInstructions.Address.country   string             32        100
$.ShippingInstructions.Address.zipCode   number              8        100
$."Special Instructions"                 string              8        100

18.11 発注書の文書のフラット・データ・ガイド

サンプル・フラット・データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

フラット・データ・ガイド内で使用されるJSONスキーマ・キーワードはtypeのみです。その他のフィールドは、すべてOracleデータ・ガイド・フィールドであり、接頭辞o:が付いています。

例18-22は、表j_purchaseorder内の発注書の文書のフラット・データ・ガイドを示しています。次の事項に注意してください。

  • o:preferred_column_nameの値は、接頭辞PO_DOCUMENT$を使用します。この接頭辞は、このデータ・ガイドを取得するためにDBMS_JSON.get_index_dataguideを使用したことに基づきます。

  • たとえば、o:lengthのパス$.Userの値は、フィールド値の実際の長さが5であるにもかかわらず8です。これは、o:lengthの値は、常に2の乗数であるためです。

  • o:pathのフィールドSpecial Instructionsの値は、中に含まれる空白文字のため、二重引用符で囲まれます("Special Instructions")。

例18-22 発注書のフラット・データ・ガイド

パスは太字で示されます。JSONスキーマ・キーワードはイタリック体で示されます。DBMS_JSON.rename_columnを使用した結果の優先列名もイタリック体で示されます。

フィールドo:frequencyo:low_valueo:high_valueo:num_nullso:last_analyzedがあることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。このデータの統計情報の収集例は、例18-3を参照してください。

[
  {
    "o:path": "$.User",
    "type": "string",
    "o:length": 8,
    "o:preferred_column_name": "PO_DOCUMENT$User",
    "o:frequency": 100,
    "o:low_value": "ABULL",
    "o:high_value": "SBELL",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.PONumber",
    "type": "number",
    "o:length": 4,
    "o:preferred_column_name": "PONumber",
    "o:frequency": 100,
    "o:low_value": "672",
    "o:high_value": "1600",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems",
    "type": "array",
    "o:length": 512,
    "o:preferred_column_name": "PO_DOCUMENT$LineItems",
    "o:frequency": 100,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.Part",
    "type": "object",
    "o:length": 128,
    "o:preferred_column_name": "PO_DOCUMENT$Part",
    "o:frequency": 100,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.Part.UPCCode",
    "type": "number",
    "o:length": 16,
    "o:preferred_column_name": "PO_DOCUMENT$UPCCode",
    "o:frequency": 100,
    "o:low_value": "13131092899",
    "o:high_value": "717951002396",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.Part.UnitPrice",
    "type": "number",
    "o:length": 8,
    "o:preferred_column_name": "PO_DOCUMENT$UnitPrice",
    "o:frequency": 100,
    "o:low_value": "20",
    "o:high_value": "19.95",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.Part.Description",
    "type": "string",
    "o:length": 32,
    "o:preferred_column_name": "PartDescription",
    "o:frequency": 100,
    "o:low_value": "Nixon",
    "o:high_value": "Eric Clapton: Best Of 1981-1999",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.Quantity",
    "type": "number",
    "o:length": 4,
    "o:preferred_column_name": "PO_DOCUMENT$Quantity",
    "o:frequency": 100,
    "o:low_value": "5",
    "o:high_value": "9.0",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.LineItems.ItemNumber",
    "type": "number",
    "o:length": 1,
    "o:preferred_column_name": "ItemNumber",
    "o:frequency": 100,
    "o:low_value": "1",
    "o:high_value": "3",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.Reference",
    "type": "string",
    "o:length": 16,
    "o:preferred_column_name": "PO_DOCUMENT$Reference",
    "o:frequency": 100,
    "o:low_value": "ABULL-20140421",
    "o:high_value": "SBELL-20141017",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.Requestor",
    "type": "string",
    "o:length": 16,
    "o:preferred_column_name": "PO_DOCUMENT$Requestor",
    "o:frequency": 100,
    "o:low_value": "Sarah Bell",
    "o:high_value": "Alexis Bull",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.CostCenter",
    "type": "string",
    "o:length": 4,
    "o:preferred_column_name": "PO_DOCUMENT$CostCenter",
    "o:frequency": 100,
    "o:low_value": "A50",
    "o:high_value": "A50",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.AllowPartialShipment",
    "type": "boolean",
    "o:length": 4,
    "o:preferred_column_name": "PO_DOCUMENT$AllowPartialShipment",
    "o:frequency": 50,
    "o:low_value": "true",
    "o:high_value": "true",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions",
    "type": "object",
    "o:length": 256,
    "o:preferred_column_name": "PO_DOCUMENT$ShippingInstructions",
    "o:frequency": 100,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.name",
    "type": "string",
    "o:length": 16,
    "o:preferred_column_name": "PO_DOCUMENT$name",
    "o:frequency": 100,
    "o:low_value": "Sarah Bell",
    "o:high_value": "Alexis Bull",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Phone",
    "type": "string",
    "o:length": 16,
    "o:preferred_column_name": "Phone",
    "o:frequency": 50,
    "o:low_value": "983-555-6509",
    "o:high_value": "983-555-6509",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Phone",
    "type": "array",
    "o:length": 128,
    "o:preferred_column_name": "PO_DOCUMENT$Phone_1",
    "o:frequency": 50,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Phone.type",
    "type": "string",
    "o:length": 8,
    "o:preferred_column_name": "PhoneType",
    "o:frequency": 50,
    "o:low_value": "Mobile",
    "o:high_value": "Office",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Phone.number",
    "type": "string",
    "o:length": 16,
    "o:preferred_column_name": "PhoneNumber",
    "o:frequency": 50,
    "o:low_value": "415-555-1234",
    "o:high_value": "909-555-7307",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address",
    "type": "object",
    "o:length": 128,
    "o:preferred_column_name": "PO_DOCUMENT$Address",
    "o:frequency": 100,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address.city",
    "type": "string",
    "o:length": 32,
    "o:preferred_column_name": "PO_DOCUMENT$city",
    "o:frequency": 100,
    "o:low_value": "South San Francisco",
    "o:high_value": "South San Francisco",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address.state",
    "type": "string",
    "o:length": 2,
    "o:preferred_column_name": "PO_DOCUMENT$state",
    "o:frequency": 100,
    "o:low_value": "CA",
    "o:high_value": "CA",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address.street",
    "type": "string",
    "o:length": 32,
    "o:preferred_column_name": "PO_DOCUMENT$street",
    "o:frequency": 100,
    "o:low_value": "200 Sporting Green",
    "o:high_value": "200 Sporting Green",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address.country",
    "type": "string",
    "o:length": 32,
    "o:preferred_column_name": "PO_DOCUMENT$country",
    "o:frequency": 100,
    "o:low_value": "United States of America",
    "o:high_value": "United States of America",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.ShippingInstructions.Address.zipCode",
    "type": "number",
    "o:length": 8,
    "o:preferred_column_name": "PO_DOCUMENT$zipCode",
    "o:frequency": 100,
    "o:low_value": "99236",
    "o:high_value": "99236",
    "o:num_nulls": 0,
    "o:last_analyzed": "2016-03-31T12:17:53"
  },
  {
    "o:path": "$.\"Special Instructions\"",
    "type": "string",
    "o:length": 8,
    "o:preferred_column_name": "PO_DOCUMENT$SpecialInstructions",
    "o:frequency": 100,
    "o:low_value": "Courier",
    "o:high_value": "Courier",
    "o:num_nulls": 1,
    "o:last_analyzed": "2016-03-31T12:17:53"
  }
]

18.12 発注書の文書の階層データ・ガイド

サンプル階層データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

例18-23は、表j_purchaseorder内の発注書の文書の階層データ・ガイドを示しています。

例18-23 発注書の階層データ・ガイド

フィールド名は太字で示されます。JSONスキーマ・キーワードはイタリック体で示されます。DBMS_JSON.rename_columnを使用した結果の優先列名もイタリック体で示されます。使用される書式は、書式設定引数DBMS_JSON.FORMAT_HIERARCHICALおよびDBMS_JSON.PRETTYとともにSQL/JSONファンクションjson_dataguideを使用して生成されたものに似ています。

この例に、フィールドo:frequencyo:low_valueo:high_valueo:num_nullso:last_analyzedがあることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。このデータの統計情報の収集例は、例18-3を参照してください。

{
  "type": "object",
  "properties": {
    "User": {
      "type": "string",
      "o:length": 8,
      "o:preferred_column_name": "PO_DOCUMENT$User",
      "o:frequency": 100,
      "o:low_value": "ABULL",
      "o:high_value": "SBELL",
      "o:num_nulls": 0,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "PONumber": {
      "type": "number",
      "o:length": 4,
      "o:preferred_column_name": "PONumber",
      "o:frequency": 100,
      "o:low_value": "672",
      "o:high_value": "1600",
      "o:num_nulls": 0,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "LineItems": {
      "type": "array",
      "o:length": 512,
      "o:preferred_column_name": "PO_DOCUMENT$LineItems",
      "o:frequency": 100,
      "o:last_analyzed": "2016-03-31T12:17:53",
      "items": {
        "properties": {
          "Part": {
            "type": "object",
            "o:length": 128,
            "o:preferred_column_name": "PO_DOCUMENT$Part",
            "o:frequency": 100,
            "o:last_analyzed": "2016-03-31T12:17:53",
            "properties": {
              "UPCCode": {
                "type": "number",
                "o:length": 16,
                "o:preferred_column_name": "PO_DOCUMENT$UPCCode",
                "o:frequency": 100,
                "o:low_value": "13131092899",
                "o:high_value": "717951002396",
                "o:num_nulls": 0,
                "o:last_analyzed": "2016-03-31T12:17:53"
              },
              "UnitPrice": {
                "type": "number",
                "o:length": 8,
                "o:preferred_column_name": "PO_DOCUMENT$UnitPrice",
                "o:frequency": 100,
                "o:low_value": "20",
                "o:high_value": "19.95",
                "o:num_nulls": 0,
                "o:last_analyzed": "2016-03-31T12:17:53"
              },
              "Description": {
                "type": "string",
                "o:length": 32,
                "o:preferred_column_name": "PartDescription",
                "o:frequency": 100,
                "o:low_value": "Nixon",
                "o:high_value": "Eric Clapton: Best Of 1981-1999",
                "o:num_nulls": 0,
                "o:last_analyzed": "2016-03-31T12:17:53"
              }
            }
          },
          "Quantity": {
            "type": "number",
            "o:length": 4,
            "o:preferred_column_name": "PO_DOCUMENT$Quantity",
            "o:frequency": 100,
            "o:low_value": "5",
            "o:high_value": "9.0",
            "o:num_nulls": 0,
            "o:last_analyzed": "2016-03-31T12:17:53"
          },
          "ItemNumber": {
            "type": "number",
            "o:length": 1,
            "o:preferred_column_name": "ItemNumber",
            "o:frequency": 100,
            "o:low_value": "1",
            "o:high_value": "3",
            "o:num_nulls": 0,
            "o:last_analyzed": "2016-03-31T12:17:53"
          }
        }
      }
    },
    "Reference": {
      "type": "string",
      "o:length": 16,
      "o:preferred_column_name": "PO_DOCUMENT$Reference",
      "o:frequency": 100,
      "o:low_value": "ABULL-20140421",
      "o:high_value": "SBELL-20141017",
      "o:num_nulls": 0,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "Requestor": {
      "type": "string",
      "o:length": 16,
      "o:preferred_column_name": "PO_DOCUMENT$Requestor",
      "o:frequency": 100,
      "o:low_value": "Sarah Bell",
      "o:high_value": "Alexis Bull",
      "o:num_nulls": 0,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "CostCenter": {
      "type": "string",
      "o:length": 4,
      "o:preferred_column_name": "PO_DOCUMENT$CostCenter",
      "o:frequency": 100,
      "o:low_value": "A50",
      "o:high_value": "A50",
      "o:num_nulls": 0,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "AllowPartialShipment": {
      "type": "boolean",
      "o:length": 4,
      "o:preferred_column_name": "PO_DOCUMENT$AllowPartialShipment",
      "o:frequency": 50,
      "o:last_analyzed": "2016-03-31T12:17:53"
    },
    "ShippingInstructions": {
      "type": "object",
      "o:length": 256,
      "o:preferred_column_name": "PO_DOCUMENT$ShippingInstructions",
      "o:frequency": 100,
      "o:last_analyzed": "2016-03-31T12:17:53",
      "properties": {
        "name": {
          "type": "string",
          "o:length": 16,
          "o:preferred_column_name": "PO_DOCUMENT$name",
          "o:frequency": 100,
          "o:low_value": "Sarah Bell",
          "o:high_value": "Alexis Bull",
          "o:num_nulls": 0,
          "o:last_analyzed": "2016-03-31T12:17:53"
        },
        "Phone": {
          "oneOf": [
            {
              "type": "string",
              "o:length": 16,
              "o:preferred_column_name": "Phone",
              "o:frequency": 50,
              "o:low_value": "983-555-6509",
              "o:high_value": "983-555-6509",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            },
            {
              "type": "array",
              "o:length": 128,
              "o:preferred_column_name": "PO_DOCUMENT$Phone_1",
              "o:frequency": 50,
              "o:last_analyzed": "2016-03-31T12:17:53",
              "items": {
                "properties": {
                  "type": {
                    "type": "string",
                    "o:length": 8,
                    "o:preferred_column_name": "PhoneType",
                    "o:frequency": 50,
                    "o:low_value": "Mobile",
                    "o:high_value": "Office",
                    "o:num_nulls": 0,
                    "o:last_analyzed": "2016-03-31T12:17:53"
                  },
                  "number": {
                    "type": "string",
                    "o:length": 16,
                    "o:preferred_column_name": "PhoneNumber",
                    "o:frequency": 50,
                    "o:low_value": "415-555-1234",
                    "o:high_value": "909-555-7307",
                    "o:num_nulls": 0,
                    "o:last_analyzed": "2016-03-31T12:17:53"
                  }
                }
              }
            }
          ]
        },
        "Address": {
          "type": "object",
          "o:length": 128,
          "o:preferred_column_name": "PO_DOCUMENT$Address",
          "o:frequency": 100,
          "o:last_analyzed": "2016-03-31T12:17:53",
          "properties": {
            "city": {
              "type": "string",
              "o:length": 32,
              "o:preferred_column_name": "PO_DOCUMENT$city",
              "o:frequency": 100,
              "o:low_value": "South San Francisco",
              "o:high_value": "South San Francisco",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            },
            "state": {
              "type": "string",
              "o:length": 2,
              "o:preferred_column_name": "PO_DOCUMENT$state",
              "o:frequency": 100,
              "o:low_value": "CA",
              "o:high_value": "CA",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            },
            "street": {
              "type": "string",
              "o:length": 32,
              "o:preferred_column_name": "PO_DOCUMENT$street",
              "o:frequency": 100,
              "o:low_value": "200 Sporting Green",
              "o:high_value": "200 Sporting Green",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            },
            "country": {
              "type": "string",
              "o:length": 32,
              "o:preferred_column_name": "PO_DOCUMENT$country",
              "o:frequency": 100,
              "o:low_value": "United States of America",
              "o:high_value": "United States of America",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            },
            "zipCode": {
              "type": "number",
              "o:length": 8,
              "o:preferred_column_name": "PO_DOCUMENT$zipCode",
              "o:frequency": 100,
              "o:low_value": "99236",
              "o:high_value": "99236",
              "o:num_nulls": 0,
              "o:last_analyzed": "2016-03-31T12:17:53"
            }
          }
        }
      }
    },
    "Special Instructions": {
      "type": "string",
      "o:length": 8,
      "o:preferred_column_name": "PO_DOCUMENT$SpecialInstructions",
      "o:frequency": 100,
      "o:low_value": "Courier",
      "o:high_value": "Courier",
      "o:num_nulls": 1,
      "o:last_analyzed": "2016-03-31T12:17:53"
    }
  }
}

関連項目:



脚注の凡例

脚注1: ファンクションjson_dataguideにオプションの2番目の引数としてDBMS_JSON.FORMAT_HIERARCHICALが渡された場合、結果は3つの階層データ・ガイドとなります。