23 JSONデータ・ガイド
JSONデータ・ガイドを使用すると、Oracle Databaseに格納されたJSON文書の構造と内容に関する情報を検出できます。
この情報には、次のような用途があります。
-
JSON文書セットについて記述するJSONスキーマ文書を生成します。
-
文書内のデータに対してSQL操作を実行するために使用できるビューを作成します。
-
文書内の追加または変更されたフィールドに対応する仮想列を自動的に追加または更新します。
関連項目:
JSON Schema- JSONデータ・ガイドの概要
データ・ガイドは、一連のJSON文書に含まれる構造および型情報の概要を示します。これらの文書内で使用されているフィールドに関するメタデータを記録します。 - JSON検索索引の一部としての永続的データ・ガイド情報
JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的な保存が可能です。この情報は、新しいJSONコンテンツが追加されると自動的に更新されます。このオプションの動作は、JSON検索索引の作成時に指定します。 - データ・ガイドの形式およびデータ・ガイドの作成方法
データ・ガイドには、フラットと階層の2つの形式があります。どちらもSQLおよびPL/SQLでCLOB
データとして使用できます。データ・ガイドは、JSON検索索引に保存されたデータ・ガイド情報から、またはJSON文書をスキャンすることによって構成できます。 - JSONデータ・ガイドのフィールド
JSONデータ・ガイドの事前定義済フィールドが記述されます。これらには、JSONスキーマ・フィールド(キーワード)およびOracle固有のフィールドが含まれます。 - 永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー
静的データ・ディクショナリ・ビューを問い合せて、データ・ガイド対応JSON検索索引があるJSON列を含む表を確認し、データ・ガイド対応JSON検索索引に記録されているJSONオブジェクトのフィールド情報を抽出できます。 - フィールド列の優先名の指定
JSONフィールドは、データベース・ビュー内の非JSON列として、またはJSON列を含む同じ表に追加される非JSON仮想列として、データから投影されるようにできます。このような列に優先名を指定できます。 - データ・ガイド情報に基づくJSONデータのビューの作成
データ・ガイド情報に基づいて、JSON文書セットから特定のスカラー・フィールドを投影した列を持つデータベース・ビューを作成できます。階層データ・ガイドを編集するか、SQL/JSONパス式を指定することにより、投影するフィールドを選択でき、場合によってはフィールド出現の最小頻度を選択できます。 - データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除
JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールドです。 - データ・ガイド対応検索索引の変更トリガー
JSONデータが変更されると、データ・ガイド対応のJSON検索索引の一部の情報は自動的に更新されます。これが発生するたびに起動がトリガーされるプロシージャを指定できます。自分のPL/SQLプロシージャをこれに定義でき、事前定義済変更トリガー・プロシージャであるadd_vc
を使用することもできます。 - 文書セットごとの複数のデータ・ガイド
データ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。 - データ・ガイドの問合せ
データ・ガイドは、一連のJSON文書に関する情報です。Oracle SQLファンクションjson_dataguide
またはPL/SQLファンクションDBMS_JSON.get_index_dataguide
のいずれかを使用することで、取得するフラット・データ・ガイドからの情報を問合せられます。後者の場合、データ・ガイド対応JSON検索索引が、JSONデータ上で定義されている必要があります。 - 発注書の文書のフラット・データ・ガイド
サンプル・フラット・データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。 - 発注書の文書の階層データ・ガイド
サンプル階層データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。
親トピック: JSONデータの問合せ
23.1 JSONデータ・ガイドの概要
データ・ガイドは、一連のJSON文書に含まれる構造および型情報の概要を示します。これらの文書内で使用されているフィールドに関するメタデータを記録します。
たとえば、例1-1に示されたJSONオブジェクトの場合、その文書にShippingInstructions
オブジェクトがあり、これがname
、Address
、Phone
の各フィールドを持ち、それぞれの型が文字列、オブジェクト、配列であることが、その他の事項と一緒にデータ・ガイドに指定されます。同様に、オブジェクトAddress
の構造も配列Phone
内の要素の型として記録されます。
JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的な保存が可能です。この情報は、新しいJSONコンテンツが追加されると自動的に更新されます。このオプションのデータガイド・サポートは、JSON検索索引の作成時に指定します。
データ・ガイドは次の用途に使用できます。
-
データ・マイニング、ビジネス・インテリジェンス、その他のJSON文書の分析が関係するアプリケーションを開発するための基盤として。
-
検索を含む、要求されたJSON情報に関するユーザー支援を提供するための基盤として。
-
新しいJSON文書を文書セットに追加する前に、確認または操作する(特定のフィールドの検証、型チェック、除外など)目的。
このような目的のために、次の操作を実行できます。
-
フィールド長や最低特定の頻度で出現するフィールドなど、文書セットに関する情報について直接データ・ガイドに問い合せます。
-
データ・ガイドに従って、関係する特定のJSONフィールドの重要性に基づいて、フィールドを投影するビューを作成するか、仮想列を追加します。
ノート:
通常、データ・ガイドは、既存の一連のJSON文書について構造を知る手掛かりとなります。JSONデータを検証する場合は、データ・ガイドではなくJSONスキーマを使用します。
ノート:
-
ビューよりも仮想列に利点があるのは、仮想列の索引を構築し、オプティマイザ用に仮想列に関する統計を取得できることです。
-
表ごとの仮想列の数は、初期化パラメータ
MAX_COLUMNS
の値によって制限されます。デフォルトでは、その値は最大1000列を意味するSTANDARD
です。『Oracle Databaseリファレンス』のMAX_COLUMNSに関する項を参照してください。
次のデータ・ガイド機能が適用されます。
ノート:
-
パスの長さ: 4000バイト。4000バイトよりも長いパスは、データ・ガイドで無視されます。
-
親ノードの下の子の数: 5000。子が5000を超えるノードは、データ・ガイドで無視されます。
-
フィールド値の長さ: 32767バイト32767バイトよりも長い値がJSONフィールドに含まれる場合、データ・ガイドはその長さを32767として報告します。
-
長さがゼロ(空)のオブジェクト・フィールド名(
""
)を含むデータのデータ・ガイドの動作は定義されていません。
関連項目
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細)
親トピック: JSONデータ・ガイド
23.2 JSON検索索引の一部としての永続的データ・ガイド情報
JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的な保存が可能です。この情報は、新しいJSONコンテンツが追加されると自動的に更新されます。このオプションの動作は、JSON検索索引の作成時に指定します。
CREATE SEARCH INDEX
をキーワードFOR JSON
と一緒に使用して、検索索引、データ・ガイド、またはこの両方を同時に作成できます。デフォルトの動作では、データ・ガイドのサポートなしで検索索引が作成されます。
JSON検索索引の一部としての永続的データ・ガイド情報を作成する場合は、CREATE SEARCH INDEX
のPARAMETERS
句でDATAGUIDE
をON
として指定します。データ・ガイドのサポートは、SEARCH_ON NONE
の追加指定によって、検索のサポートを有効にすることなく有効化できます。例23-1に、これを示します。
ALTER INDEX
... REBUILD
を使用して、既存のJSON検索索引のデータ・ガイドのサポートを有効または無効にできます。例23-2に、これを示します。この例では、例29-24の検索索引に対するデータ・ガイドのサポートを有効にします。
ノート:
データ・ガイド対応JSON検索索引を作成する、または既存のJSON検索索引をデータ・ガイド対応にするには、データベース権限CTXAPP
およびOracle Databaseリリース12c (12.2.0.1)以降が必要です。
ノート:
データ・ガイドに対応したJSON検索索引は、JSONデータが含まれていることがわかっている列(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検索索引に関して収集するなど)。自動的には更新されません。統計が最新のものであるようにするには、統計を新たに収集します。例23-3は、JSON検索索引po_search_idx
によって索引付けされたJSONデータに関する統計を収集します。この索引は、例29-24で作成されます。
ノート:
シャーディング環境でローカル・データ・ガイド対応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
を持ちます。対応するデータ・ガイドにサイズやパフォーマンスの問題はありません。
例23-1 JSONデータ・ガイドの検索用でない永続的サポートの有効化
CREATE SEARCH INDEX po_dg_only_idx
ON j_purchaseorder (po_document) FOR JSON
PARAMETERS ('DATAGUIDE ON SEARCH_ON NONE');
例23-2 既存のJSON検索索引のJSONデータ・ガイド・サポートの有効化
ALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE ON');
例23-3 JSON検索索引を使用したJSONデータに関する統計情報の収集
EXEC DBMS_STATS.gather_index_stats(docuser, po_search_idx, NULL, 100);
関連項目:
-
CREATE SEARCH INDEX
のPARAMETERS
句の詳細は、Oracle Textリファレンスを参照してください。 -
ALTER INDEX
...REBUILD
のPARAMETERS
句の詳細は、Oracle Textリファレンスを参照してください。 -
Faster XML / Jackson (Jackson JSONプロセッサの詳細)
-
google / gson (GSON Javaライブラリの詳細)
親トピック: JSONデータ・ガイド
23.3 データ・ガイドの形式およびデータ・ガイドの作成方法
データ・ガイドには、フラットと階層の2つの形式があります。どちらもSQLおよびPL/SQLでCLOB
データとして使用できます。データ・ガイドは、JSON検索索引に保存されたデータ・ガイド情報から、またはJSON文書をスキャンすることによって構成できます。
-
フラット・データ・ガイドを使用して、フィールド頻度や型などのデータ・ガイド情報を問い合せられます。
フラット・データ・ガイドはJSONでオブジェクトの配列として表され、それぞれが文書セット内の特定のパスのJSONデータを示します。発注書の文書のフラット・データ・ガイドで、例1-1の発注データのフラット・データ・ガイドについて説明しています。
-
階層データ・ガイドを使用して、データ・ガイド情報に基づいて選択する特定のフィールドを使用することでビューを作成する、または仮想列を追加できます。
階層的データ・ガイドは、ネストされたJSONデータを持つオブジェクトとして、JSONで表されます。これは、JSONスキーマで定義されているものと同じ形式です。発注書の文書の階層データ・ガイドで、例1-1の発注データの階層データ・ガイドについて説明しています。
PL/SQLファンクションDBMS_JSON.get_index_dataguide
を使用して、JSON検索索引に格納されているデータ・ガイド情報からデータ・ガイドを取得します。
SQL集計関数json_dataguide
を使用して、文書セットをスキャンし、データ・ガイド対応検索索引があるかどうかにかかわらず、データ・ガイドを設定して構築することもできます。データ・ガイドは、ファンクションの起動時の文書セットを正確に反映します。
データ・ガイドには、文書セットで各JSONフィールドが使用される頻度などの統計フィールドを含めることができます。
-
SQLファンクション
json_dataguide
を使用する場合、統計フィールドが存在するのは、3つ目の引数にDBMS_JSON.gather_stats
を指定した場合のみです。これらは、ファンクション・コール時に動的(最新)に計算されます。 -
PL/SQLファンクション
DBMS_JSON.get_index_dataguide
を使用する場合、統計フィールドはJSON検索索引で収集した場合にのみ存在します。自動的には更新されません。最新の情報にするには新たに収集します。
表23-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 (フォーマット引数を指定しないか、フォーマット引数としてDBMS_JSON.FORMAT_FLAT を指定)
|
SQLファンクションjson_dataguide (フォーマット引数としてDBMS_JSON.FORMAT_HIERARCHICAL を指定)
|
-
文書セットに対する加算的な更新は、索引が同期されるたびに永続的なデータ・ガイド情報に自動的に反映されます。
-
このデータ・ガイド情報は永続的であるため、この情報に基づいてデータ・ガイドを取得する(PL/SQLファンクション
get_index_dataguide
を使用)方法は、通常、文書セットを分析してデータ・ガイドを取得する(SQLファンクションjson_dataguide
を使用)方法よりも高速です。
データ・ガイド対応JSON検索索引を使用せずにデータ・ガイドを取得するメリットには、データ・ガイドの正確性を保証できることや、索引のメンテナンスのオーバーヘッドが不要であることなどがあります。さらに、索引から導出されたのでないデータ・ガイドは、次のような特定のユースケースに適しています。
-
JSONデータが外部表にある場合。外部表に索引を作成することはできません。
-
JSON列に索引を付けることができても、その索引があまり有用にならない場合。列に種類が異なる文書が含まれている場合などがこれに該当します。このようなときは、JSON列に格納された文書の種類を特定するための列を表に追加すると役立つ場合があります。そうすると、SQL集計関数と
GROUP BY
を持つデータ・ガイドを使用できるようになります。文書セットごとの複数のデータ・ガイドを参照してください。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(PL/SQL定数
DBMS_JSON.FORMAT_FLAT
およびDBMS_JSON.FORMAT_HIERARCHICAL
の詳細)
親トピック: JSONデータ・ガイド
23.4 JSONデータ・ガイドのフィールド
JSONデータ・ガイドの事前定義済フィールドが記述されます。これらには、JSONスキーマ・フィールド(キーワード)およびOracle固有のフィールドが含まれます。
データ・ガイド内のフィールドの出現箇所は、JSON文書セットのいずれか、または複数の中に存在する1つのフィールドに対応します。
JSONスキーマ・データ・ガイドのフィールド(キーワード)
JSONスキーマはJSONオブジェクトが格納されたJSON文書であり、それ自体に子オブジェクト(サブスキーマ)を含めることができます。JSONスキーマで定義されているフィールドは、JSONスキーマ・キーワードと呼ばれます。表23-2に、Oracle JSONデータ・ガイドで使用できるキーワードを示します。キーワードproperties
、items
、oneOf
は階層データ・ガイド内でのみ使用されます(JSONスキーマ)。キーワードtype
はフラットデータ・ガイド内と階層データ・ガイド内の両方で使用されます。
表23-2 JSONスキーマ・データ・ガイドのフィールド(キーワード)
フィールド(キーワード) | 値の説明 |
---|---|
properties |
1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用されるJSONオブジェクトのプロパティを表します。 |
items |
1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用される配列の要素(項目)を表します。 |
oneOf |
1つの配列であり、これに属する個々の項目は、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内のJSONフィールドの1つまたは複数の出現箇所を表します。 |
type |
1つの文字列であり、フラットまたは階層データ・ガイドによって表されるJSONデータのいくつかの型の名前を表します。 使用可能な値は、 オプション |
Oracle固有のデータ・ガイド・フィールド
JSONスキーマ・キーワードに加えて、JSONデータ・ガイドはOracleデータ・ガイド固有のフィールドを格納できます。すべてのフィールド名に、接頭辞o:
が付きます。これについては、表23-3で説明します。
表23-3 Oracle固有のデータ・ガイドのフィールド
フィールド | 値の説明 |
---|---|
o:path |
JSON文書からJSONフィールドへのパスを示します。フラット・データ・ガイドでのみ使用されます。値は単純なSQL/JSONパス式(フィルタ式なし)であり、緩和(暗黙的配列ラッピングまたはラッピングなし)およびワイルドカード配列ステップが付くことがあります。これには配列索引または範囲指定含む配列ステップはありません。また、関数ステップもありません。SQL/JSONパス式の構文を参照してください。 |
o:length |
JSONフィールド値の最大長をバイト単位で示します。値は常に2の累乗です。たとえば、すべての実際のフィールド値の最大長が5である場合、 |
o:preferred_column_name |
所定のデータ・ガイドに固有の識別子であり、大文字と小文字が区別されます。ビュー列またはデータ・ガイドを使用して作成された仮想列に使用する名前として選択します。 形式パラメータ |
o:frequency |
所定のフィールドを含むJSON文書の割合を示します。同じ配列の下に発生したフィールドの重複は無視されます。(統計情報が文書セットに関して収集された場合にのみ、使用できます。) データ・ガイドがSQLファンクション データ・ガイドがPL/SQLファンクション |
o:num_nulls |
対象のスカラー・フィールドの値がJSON データ・ガイドがSQLファンクション データ・ガイドがPL/SQLファンクション |
o:high_value |
検査されたすべての文書中での対象のスカラー・フィールドの最高値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。) データ・ガイドがSQLファンクション データ・ガイドがPL/SQLファンクション |
o:low_value |
検査されたすべての文書中での対象のスカラー・フィールドの最低値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。) データ・ガイドがSQLファンクション データ・ガイドがPL/SQLファンクション |
o:last_analyzed |
統計情報が最後に文書セットに関して収集された日時を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。) データ・ガイドがSQLファンクション データ・ガイドがPL/SQLファンクション |
o:sample_size |
データ・ガイドが他の方法で取得された場合、このフィールドは存在しません。 |
要素がスカラーのみのJSON配列が含まれている文書のデータ・ガイド情報は、(1)配列と(2)すべての配列要素をまとめた両方のパスと型を記録します。要素の場合:
-
o:path
値は配列のo:path
値で、その後に、すべての配列要素を示すワイルドカード([*]
)を含む配列が続きます。 -
スカラー型がすべての文書のすべての要素に対して同じでない場合、
type
値は型string
です。配列のすべてのスカラー要素にすべての文書で配列に同じ型が含まれる場合、その型は記録されます。
たとえば、すべての文書で、オブジェクト・フィールドserial_numbers
の配列値のすべての要素がJSONの数値である場合、配列要素のtype
はnumber
です。それ以外の場合は、string
です。
フィールドo:preferred_column_name
(存在する場合)のデフォルト値は、データ・ガイドがSQLファンクションjson_dataguide
(形式DBMS_JSON.FORMAT_HIERARCHICAL
を指定)を使用して取得されたか、PL/SQLファンクションDBMS_JSON.get_index_dataguide
を使用して取得されたかによって異なります。
-
get_index_dataguide
— 対応するJSONフィールド名と同じです。JSON列名が先頭に付き、その後に$
が続きます。非ASCII文字は削除されます。この結果のフィールド名が、同じデータ・ガイド内にすでにある場合、新しい順序番号が末尾に付加された固有の名前が付けられます。JSON列名部分は、その列がエスケープされた小文字(たとえば
'PO_Column'
がpo_column
のかわりに使用されているなど)を使用して定義されていないかぎり大文字です。たとえば、フィールド
User
がJSON列po_document
内のデータにある場合、このデフォルト値はPO_DOCUMENT$User
です。 -
json_dataguide
(階層形式) — 対応するJSONフィールド名と同じです。ただし、データ・ガイドに基づいてビューまたは仮想列を作成する場合は、
DBMS_JSON
プロシージャcreate_view
、get_view_sql
およびadd_virtual_columns
に次のパラメータを指定することで、列のネーミングを制御できます。-
colNamePrefix =>
prefix
—o:preferred_column_name
で指定された列名に接頭辞prefix
を付けます。 -
mixedCaseColumns => FALSE
— 列名の大文字と小文字を区別しません。(デフォルトでは大文字と小文字が区別されます。) -
resolveNameConflicts => TRUE
(デフォルト) — 名前の競合を解決します: 結果となるフィールド名が同じデータ・ガイドにすでに存在する場合は、それが一意になるように、新しい順序番号を使用して接尾辞を付けます(get_index_dataguide
で提供されるのと同じ動作)。
-
PL/SQLプロシージャDBMS_JSON.rename_column
を使用して、所定のフィールドおよび型に対するo:preferred_column_name
の値を設定できます。データ・ガイド情報がJSON検索索引の一部として永続化されていない場合、このプロシージャの効力はありません。
フィールドo:preferred_column_name
は、JSON列を格納する表内の新しい仮想列の名前を付けるために使用されます。または、表内のその他の列も格納する新しいビュー内の列の名前を付けるために使用されます。どちらの場合も、フィールドo:preferred_column_name
によって指定される名前は、表内の他の列との間で固有である必要があります。さらに、この名前は、文書セット内のすべての型のすべてのJSONフィールド間で固有である必要があります。DBMS_JSON.get_index_dataguide
を使用する場合、これらの方法でデフォルトの名前が固有であることが保証されます。
DBMS_JSON.rename_column
を使用して指定する名前によって競合が発生する場合、指定した名前は無視され、そのかわりにシステムが生成した名前が使用されます。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
GeoJSONデータとOracle Spatial and Graphを連携して使用する方法の詳細は、Oracle Spatial開発者ガイドを参照してください
-
Oracle Spatial and Graphと
SDO_GEOMETRY
オブジェクト型の詳細は、Oracle Spatial開発者ガイドを参照してください -
GeoJSONの詳細は、GeoJSON.orgを参照してください
-
JSONスキーマの詳細は、JSON Schemaを参照してください
親トピック: JSONデータ・ガイド
23.5 永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー
静的データ・ディクショナリ・ビューを問い合せて、データ・ガイド対応JSON検索索引があるJSON列を含む表を確認し、データ・ガイド対応JSON検索索引に記録されているJSONオブジェクトのフィールド情報を抽出できます。
データ・ガイド対応の索引を持つJSON列がない表は、ビューに表示されません。
次のビューを使用すると、データ・ガイド対応JSON検索索引を持つ列を見つけることができます。ビューには、列TABLE_NAME
(表名)、COLUMN_NAME
(JSON列名)、DATAGUIDE
(データ・ガイド)があります。
-
USER_JSON_DATAGUIDES
— 現在のユーザーが所有する表 -
ALL_JSON_DATAGUIDES
— 現在のユーザーがアクセス可能な表 -
DBA_JSON_DATAGUIDES
— すべての表
JSON列にデータ・ガイド対応JSON検索索引がある場合、列DATAGUIDE
の値はJSON列のデータ・ガイドであり、CLOB
インスタンスとしてフラット形式です。データ・ガイド対応の索引がない場合は、ビュー内にその列の行はありません。
TABLE_NAME
、COLUMN_NAME
、PATH
、TYPE
およびLENGTH
が含まれています。列PATH
、TYPE
およびLENGTH
は、データ・ガイド・フィールドo:path
、o:type
およびo:length
の値にそれぞれ対応しています。
-
USER_JSON_DATAGUIDE_FIELDS
— 現在のユーザーが所有する表 -
ALL_JSON_DATAGUIDE_FIELDS
— 現在のユーザーがアクセス可能な表 -
DBA_JSON_DATAGUIDE_FIELDS
— すべての表
両方のタイプのビューの場合、ビューの名前には接頭辞ALL_
またはDBA_
が付き、ビューには列OWNER
(値は表の所有者)が含まれています。
関連項目:
-
ALL_JSON_DATAGUIDES
および関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください -
ALL_JSON_DATAGUIDE_FIELDS
および関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください
親トピック: JSONデータ・ガイド
23.6 フィールド列の優先名の指定
JSONフィールドは、データベース・ビュー内の非JSON列として、またはJSON列を含む同じ表に追加される非JSON仮想列として、データから投影されるようにできます。このような列に優先名を指定できます。
(文書フィールドは、プロシージャDBMS_JSON.create_view
、DBMS_JSON.create_view_on_path
またはDBMS_JSON.add_virtual_columns
を使用するときに列として投影されます。)
JSON文書セットから取得したデータ・ガイドは、この投影の定義に使用されます。投影された各列の名前は、投影されるJSONデータ・フィールド用にデータ・ガイド・フィールドo:preferred_column_name
から取得されます。
JSONデータにデータ・ガイド対応検索索引がある場合は、プロシージャDBMS_JSON.rename_column
を使用して、特定の文書フィールドおよびタイプに対してo:preferred_column_name
の値を設定できます。例23-4に、これを示します。表23-4に示すように、様々なフィールドから投影された列に優先名を指定します。
階層データ・ガイドには、フィールドo:preferred_column_name
が移入されます。プロシージャDBMS_JSON.create_view
またはDBMS_JSON.add_virtual_columns
を使用する場合は、投影される列のネーミングをさらに制御するパラメータを渡すことができます。
-
colNamePrefix =>
prefix
—o:preferred_column_name
で指定された名前に接頭辞prefix
を付けます。 -
mixedCaseColumns => FALSE
— 列名の大文字と小文字を区別しません。(デフォルトでは大文字と小文字が区別されます。) -
resolveNameConflicts => TRUE
(デフォルト) — 名前の競合を解決します。
表23-4 いくつかのJSONフィールド列の優先名
フィールド | JSON型 | 優先列名 |
---|---|---|
PONumber |
number |
PONumber |
Phone (オブジェクトでなく文字列としての電話で番号)
|
string |
Phone |
type (電話の型)
|
string |
PhoneType |
number (電話番号)
|
string |
PhoneNumber |
ItemNumber (明細項目番号)
|
number |
ItemNumber |
Description (部品の説明)
|
string |
PartDescription |
関連項目:
-
JSONデータ・ガイドのフィールド(フィールド
o:preferred_column_name
のデフォルト値の詳細およびDBMS_JSON.rename_column
を使用するときに発生する可能性がある名前の競合) -
JSON列を使用した表の作成(ここで参照されるJSONデータの詳細)
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.create_view
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.create_view_on_path
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.add_virtual_columns
に関する詳細)
例23-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;
/
親トピック: JSONデータ・ガイド
23.7 データ・ガイド情報に基づく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
,を使用して、使用可能なデータ・ガイド情報に基づいて選択したフィールドを投影し、ビューを作成することです。
データ・ガイド情報は、次のいずれかから取得できます。
-
投影するフィールドおよび場合によってはSQL/JSONパス式を含む階層データ・ガイド。
-
データ・ガイド対応のJSON検索索引とSQL/JSONパス式、および場合によっては最小フィールド頻度。
前者の場合、プロシージャcreate_view
を使用します。(階層)データ・ガイドを編集して、含めるフィールドを指定できます。この場合、データ・ガイド対応検索索引は必要ありません。
後者の場合、プロシージャcreate_view_on_path
を使用します。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。
いずれの場合も、SQL/JSONパス式を指定して、ビュー用に展開するフィールドを指定できます。これは、プロシージャcreate_view_on_path
に必要です。プロシージャcreate_view
のパスを指定するには、オプション・パラメータPATH
を使用します。パス$
を指定すると、JSONドキュメント・ルートから始まるビューが作成されます。
プロシージャcreate_view_on_path
には、オプションのパラメータFREQUENCY
を使用して、最小出現頻度を指定することもできます。結果のビューには、指定した頻度より頻度が大きいパスに沿ったJSONフィールドのみが含まれます。
パスを指定すると、その下のすべての子孫フィールドが展開されます。結果のサブツリーのスカラー値ごとにビュー列が作成されます。投影される文書セット内のフィールドには、次の両方が含まれます。
-
パス式が対象とするデータ内の任意のレベルのすべてのスカラー・フィールド。
-
配列にない文書内の任意の場所にあるすべてのスカラー・フィールド。
指定するパス引数は単純なSQL/JSONパス式(フィルタ式なし)であり、緩和(暗黙的配列ラップまたはアンラップ)が付く場合がありますが、配列ステップやファンクション・ステップが付くことはありません。SQL/JSONパス式の構文を参照してください。
プロシージャcreate_view
またはcreate_view_on_path
を使用するかどうかに関係なく、列として投影されるJSONフィールドに加えて、表の非JSON列もすべてビューの列になります。
所定のビュー定義の基礎となるデータ・ガイドは静的であり、必ずしも文書セット内の現在のデータが正確に反映されるとはかぎりません。ビューに投影されるフィールドは、ビューの作成時に決定されます。
具体的には、create_view_on_path
(データ・ガイド対応検索索引が必要)を使用する場合、対象となるフィールドは、所定のパス式で指定されたフィールドと、所定の頻度(デフォルトは0)以上のフィールドです(ビュー作成時の索引データに基づく)。
ビューを作成せず、かわりにビューを作成するSQL DDLコードを返すPL/SQLファンクションDBMS_JSON.get_view_sql
もあります。たとえば、DDLを編集して別のビューを作成できます。必要に応じて、ビュー作成DDLで使用されるSQL SELECT
文のみを取得することもできます。この場合、ビューに許容された最大数を超え列が必要になると、SELECT
文に複数のjson_table
式の結合が含まれることになります。(表内に許容される最大列数(デフォルト: 1000)は、初期化パラメータMAX_COLUMNS
で定義されます。『Oracle Databaseリファレンス』のMAX_COLUMNSに関する項を参照してください)。
- 階層データ・ガイドに基づくJSONデータのビューの作成
階層的なデータ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。 - 階層データ・ガイドに基づくJSONデータのビューの作成
データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(プロシージャ
DBMS_JSON.create_view
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(プロシージャ
DBMS_JSON.create_view_on_path
に関する詳細) -
『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』(ファンクション
DBMS_JSON.get_view_sql
について)
親トピック: JSONデータ・ガイド
23.7.1 階層データ・ガイドに基づくJSONデータのビューの作成
階層的なデータ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。
引数DBMS_JSON.FORMAT_HIERARCHICAL
を指定したSQLファンクションjson_dataguide
を使用して、階層データ・ガイドを取得できます。
取得したデータ・ガイドを編集することで、特定のフィールドのみを含め、任意の型の長さを変更し、フィールドの名前を変更できます。結果のデータ・ガイドに、ビューの列として投影されるJSONデータのフィールドが指定されます。
PL/SQLプロシージャDBMS_JSON.create_view
を使用してビューを作成します。
例23-5に、この引数DBMS_JSON.FORMAT_HIERARCHICAL
を指定したjson_dataguide
で取得したデータ・ガイドの使用を示します。
json_dataguide
で取得したデータ・ガイドを使用してビューを作成する場合は、ドキュメントのGeoJSONデータがサポートされます。この場合、GeoJSONデータに対応するビュー列は、SQLデータ型SDO_GEOMETRY
になります。そのため、json_dataguide
の3つ目の引数として、定数DBMS_JSON.GEOJSON
またはDBMS_JSON.GEOJSON+DBMS_JSON.PRETTY
を渡します。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.create_view
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(PL/SQL定数
DBMS_JSON.FORMAT_HIERARCHICAL
の詳細)
例23-5 JSON_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成
この例では、po_document
(表j_purchaseorder
内)のSQLファンクションjson_dataguide
を呼び出して取得した階層データ・ガイド内に存在するすべてのフィールドを投影するビューを作成します。json_dataguide
に渡される第2引数と第3引数は、それぞれ、データ・ガイドが階層型であることと、フォーマット出力されることを指定するために使用されます。
ビュー列名は、DBMS_JSON.create_view
に渡すデータ・ガイドのフィールドo:preferred_column_name
の値から取得されます。したがって、デフォルトではビューの列の名前は投影されたフィールドと同じです。
列にはビュー内で一意の名前を付ける必要があるため、フィールド名自体が一意であることを確認する必要があります。オプションのパラメータRESOLVENAMECONFLICTS
を指定すると、デフォルト(値true
)でこれが実行されます。ただし、それをfalse
として指定した場合は、名前が一意であることは保証されません。この場合(false
)は、代替方法として、json_dataguide
によって返されるデータ・ガイドを編集してo:preferred_column_name
の値を一意にします。パラメータRESOLVENAMECONFLICTS
がfalse
である場合は、列の名前が一意でないと、DBMS_JSON.create_view
によってエラーが発生します。
この例では示していませんが、パラメータcolNamePrefix
を指定したDBMS_JSON.create_view
を使用して列名の接頭辞を指定できます。たとえば、データ・ガイド対応JSON検索索引の情報から取得したデータ・ガイドを使用する場合と同じ効果を得るには、パラメータcolNamePrefix
を'PO_DOCUMENT$'
(JSON列名PO_DOCUMENT
の後に$
が続く)として指定します。例23-8を参照してください。
DECLARE
dg CLOB;
BEGIN
SELECT json_dataguide(po_document,
FORMAT DBMS_JSON.FORMAT_HIERARCHICAL,
DBMS_JSON.PRETTY)
INTO dg
FROM j_purchaseorder
WHERE extract(YEAR FROM date_loaded) = 2014;
DBMS_JSON.create_view('MYVIEW',
'J_PURCHASEORDER',
'PO_DOCUMENT',
dg);
END;
/
DESCRIBE myview
Name Null? Type
-------------------- -------- ---------------------------
DATE_LOADED TIMESTAMP(6) WITH TIME ZONE
ID NOT NULL RAW(16)
User VARCHAR2(8)
PONumber NUMBER
UPCCode NUMBER
UnitPrice NUMBER
Description VARCHAR2(32)
Quantity NUMBER
ItemNumber NUMBER
Reference VARCHAR2(16)
Requestor VARCHAR2(16)
CostCenter VARCHAR2(4)
AllowPartialShipment VARCHAR2(4)
name VARCHAR2(16)
Phone VARCHAR2(16)
type VARCHAR2(8)
number VARCHAR2(16)
city VARCHAR2(32)
state VARCHAR2(2)
street VARCHAR2(32)
country VARCHAR2(32)
zipCode NUMBER
Special Instructions VARCHAR2(8)
関連項目
親トピック: データ・ガイド情報に基づくJSONデータのビューの作成
23.7.2 パス式に基づくJSONデータのビューの作成
データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。
たとえば、パス式が$
の場合、すべてのスカラー・フィールドが投影されます。これは、文書のルート(最上部)が対象であるためです。例23-6に、これを示します。パスが$.LineItems.Part
の場合、$.LineItems.Part
の対象データ内にあるすべてのレベルのスカラー・フィールドのみが投影されます(配列下以外のすべての場所のスカラー・フィールドに加えて)。例23-7に、これを示します。
JSON文書セットに関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内に存在するフィールドへの各パスの出現頻度を記録します。ビューを作成するときは、所定の最小出現頻度(割合として)のスカラー・フィールドのみが、ビュー列として投影されることを指定できます。これには、パラメータFREQUENCY
の値として、プロシージャDBMS_JSON.create_view_on_path
にゼロ以外の値を指定します。
たとえば、パスを$
として指定し、最小頻度を50
として指定する場合、文書の半分(50%)以上に出現するすべてのスカラー・フィールド($
は文書全体を対象とするため、すべてのパス)が投影されます。例23-8に、これを示します。
引数PATH
の値は単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップが付くことはありません。SQL/JSONパス式の構文を参照してください。
-
JSON文書セットの統計情報を収集したことがありません。(頻度情報は、データ・ガイド対応JSON検索索引に含まれません。)
-
FREQUENCY
引数(DBMS_JSON.create_view_on_path
内)はゼロ(0)です。
ノート:
FREQUENCY
引数がゼロ以外の場合、文書セットに関する統計情報を収集していても、最後に統計情報を収集した後に追加されたすべての文書の統計情報は、索引には含まれません。これは、統計の収集後に追加されたすべてのフィールドは無視される(投影されない)ことを意味します。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.create_view_on_path
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
例23-6 すべてのスカラー・フィールドを投影するビューの作成
指定されたパスが$
であるため、すべてのスカラー・フィールドがビュー内に表れます。
(名前がイタリック
でdescribe
コマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_column
を使用して名前が変更された列です。下線付きの行は、例23-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)
例23-7 パス式で対象とされたスカラー・フィールドを投影するビューの作成
フィールドItemnumber
、PhoneType
、PhoneNumber
はビュー内には表れません。投影されるフィールドは、配列下にないスカラー・フィールドに加えて、$.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)
例23-8 所定の頻度のスカラー・フィールドを投影するビューの作成
文書のすべて(100%)に出現するすべてのスカラー・フィールドがビュー内に表れます。フィールドAllowPartialShipment
は文書のすべてには出現しないため、列PO_DOCUMENT$AllowPartialShipment
はビュー内にありません。フィールドPhone
、PhoneType
、PhoneNumber
の場合も同様です。
(名前がイタリック
で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
関連項目
親トピック: データ・ガイド情報に基づくJSONデータのビューの作成
23.8 データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除
JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールドです。
パフォーマンスを向上する目的で、仮想列を使用して次のすべてを実現できます。
-
列に索引を構築します。
-
オプティマイザ用に列の統計を収集します。
-
インメモリー列ストア(IM列ストア)に列をロードします。
ノート:
表ごとの仮想列の数は、初期化パラメータMAX_COLUMNS
の値によって制限されます。デフォルトでは、その値は最大1000列を意味するSTANDARD
です。『Oracle Databaseリファレンス』のMAX_COLUMNSに関する項を参照してください。
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/SQLTRUE
の値を引数HIDDEN
に指定し、追加されたすべての仮想列が非表示になるようにします。(HIDDEN
のデフォルト値はFALSE
であり、これは追加された仮想列が非表示でないことを意味します。)
- 階層データ・ガイドに基づくJSONフィールドの仮想列の追加
階層データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。 - データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。 - データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columns
を使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。
関連項目
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.create_view_on_path
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
親トピック: JSONデータ・ガイド
23.8.1 階層データ・ガイドに基づくJSONフィールドの仮想列の追加
階層データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。
Oracle SQLファンクションjson_dataguide
を使用して、階層データ・ガイドを取得できます。
取得したデータ・ガイドを編集することで、特定のスカラー・フィールド(配列下にないもの)のみを含め、フィールドの名前を変更し、フィールドの型の長さを変更できます。結果のデータ・ガイドに、新しい仮想列として投影されるこれらのフィールドが指定されます。配列下にないスカラー・フィールドでないデータ・ガイド内のすべてのフィールドは無視されます(投影されません)。
PL/SQLプロシージャDBMS_JSON.add_virtual_columns
を使用して、投影されたフィールドを含むJSON列を格納する表に仮想列を追加します。まずプロシージャは、以前のadd_virtual_columns
の起動またはデータ・ガイド変更トリガー・プロシージャadd_vc
(実質的に、このプロシージャの実行内容はプロシージャDBMS_JSON.drop_virtual_columns
と同じ)によって同じJSON列内のフィールドから投影された既存の仮想列を削除します。
例23-9に、これを示します。これは、JSON列po_document
内の表j_purchaseorder
のデータから配列下にないスカラー・フィールドを投影します。投影されたフィールドは、階層データ・ガイド内で示されるフィールドです。
例23-10に、仮想列として2つのフィールドの投影を指定するデータ・ガイド引数を渡す方法を示します。データ・ガイド・フィールドo:hidden
は、これらの列の1つを非表示にするために使用されます。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(PL/SQL定数
DBMS_JSON.FORMAT_HIERARCHICAL
の詳細)
例23-9 JSON_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加
この例では、ファンクションjson_dataguide
とJSON列po_document
を使用して取得した階層データ・ガイドを使用します。
追加された仮想列は、すべて表j_purchaseorder
内の列です。ID
、DATE_LOADED
、PODOCUMENT
は例外です。
-
パラメータ
resolveNameConflicts
はTRUE
で、名前の競合が解決されるようにします。(オプション。わかりやすくするため。これはどちらにしてもデフォルト値です。) -
パラメータ
colNamePrefix
は'PO_DOCUMENT$'
で、これを列名のデフォルト接頭辞として使用します。 -
パラメータ
mixedCaseColumns
はTRUE
で、列名の大/小文字を区別します。つまり、大文字と小文字を区別します。
DECLARE
dg CLOB;
BEGIN
SELECT json_dataguide(po_document, DBMS_JSON.FORMAT_HIERARCHICAL) INTO dg
FROM j_purchaseorder;
DBMS_JSON.add_virtual_columns('J_PURCHASEORDER',
'PO_DOCUMENT',
dg,
resolveNameConflicts=>TRUE,
colNamePrefix=>'PO_DOCUMENT$',
mixedCaseColumns=>TRUE);
END;
/
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)
PO_DOCUMENT$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)
PO_DOCUMENT$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)
例23-10 仮想列の追加(非表示および表示)
この例では、PO_Number
とPO_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.
関連項目
23.8.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。
プロシージャDBMS_JSON.add_virtual_columns
を使用して、仮想列を追加します。
例23-11に、これを示します。配列下にないすべてのスカラー・フィールドは、表j_purchaseorder
に仮想列として投影されます。
フィールドを投影するJSON列内の文書に関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内の各フィールドの出現頻度を記録します。
仮想列を追加するときは、所定の最小発生頻度のフィールドのみが投影されることを指定できます。
これには、パラメータFREQUENCY
の値として、プロシージャadd_virtual_columns
にゼロ以外の値を指定します。ゼロはデフォルト値であるため、引数FREQUENCY
を含めないと、すべてのスカラー・フィールド(配列下にないもの)が投影されます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。
例23-12は、文書のすべて(100%)に出現するすべてのスカラー(配列下にないもの)を仮想列として投影します。
追加されたすべての仮想列を非表示にする場合、TRUE
値を引数HIDDEN
に指定します。(パラメータHIDDEN
のデフォルト値はFALSE
であり、これは追加された仮想列が非表示でないことを意味します。)
例23-13は、文書のすべて(100%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
例23-11 配列下にないすべてのスカラー・フィールドの仮想列としての投影
追加された仮想列は、すべて表j_purchaseorder
内の列です。ID
、DATE_LOADED
、PODOCUMENT
は例外です。これは、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)
例23-12 最小頻度のスカラー・フィールドの仮想列としての投影
文書のすべて(100%)に出現するすべてのスカラー・フィールドが、仮想列として投影されます。この結果は例23-11と同じですが、フィールドAllowPartialShipment
とPhone
が投影されない点が異なります。これは、それらが文書の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)
例23-13 最小頻度のスカラー・フィールドの非表示の仮想列としての投影
この結果は例23-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
23.8.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columns
を使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。
DBMS_JSON.drop_virtual_columns
は、add_virtual_columns
の起動またはデータ・ガイド変更トリガー・プロシージャadd_vc
によって所定のJSON列内のフィールドから投影されたすべての仮想列を削除します。例23-14は、表j_purchaseorder
の列po_document
から投影されたフィールドについて、この例を示します。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細)
例23-14 JSONフィールドから投影された仮想列の削除
EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT');
23.9 データ・ガイド対応検索索引の変更トリガー
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 CHANGE
をPARAMETERS
句内で使用することによって、トリガーを使用することを指定します。索引ごとに、1つの変更トリガーのみが許可されます。トリガーを指定する索引を変更することで、そのための以前の任意トリガーは自動的に置換されます。
例23-15は、既存のJSON検索索引po_search_idx
を変更して、プロシージャadd_vc
を使用するようにします。
例23-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)
- ユーザー定義のデータ・ガイド変更トリガー
所定のデータ・ガイド対応JSON検索索引が更新されるたびに、自動的に起動がトリガーされるプロシージャを定義できます。プロシージャの実行中に発生したエラーは無視されます。
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columns
に関する詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細)
親トピック: JSONデータ・ガイド
23.9.1 ユーザー定義のデータ・ガイド変更トリガー
所定のデータ・ガイド対応JSON検索索引が更新されるたびに、自動的に起動がトリガーされるプロシージャを定義できます。プロシージャの実行中に発生したエラーは無視されます。
例23-16に、これを示します。
JSON検索索引のPARAMETERS
句内でキーワードDATAGUIDE ON CHANGE
とともに指定されたユーザー定義のプロシージャは、表23-5に明記されたパラメータを受け入れる必要があります。
表23-5 ユーザー定義のデータ・ガイド変更トリガー・プロシージャのパラメータ
名前 | 型 | 説明 |
---|---|---|
table_name |
VARCHAR2 |
列column_name を格納する表の名前です。
|
column_name |
VARCHAR2 |
データ・ガイド対応JSON検索索引を持つJSON列の名前です。 |
path |
VARCHAR2 |
列column_name のデータ内の特定のフィールドを対象とするSQL/JSONパス式です。このパスは、プロシージャの起動をトリガーする索引の変更の影響を受けます。たとえば、索引の変更は、このパスの追加、または値の型や型の長さの値の変更に関係があります。
|
new_type |
NUMBER |
指定されたパスの新しい型です。 |
new_type_length |
NUMBER |
指定されたパスの新しい型の長さです。 |
例23-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.
関連項目:
-
Oracle Database SQL言語リファレンス(PL/SQL定数
TYPE_NULL
、TYPE_BOOLEAN
、TYPE_NUMBER
、TYPE_STRING
、TYPE_OBJECT
、TYPE_ARRAY
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columns
に関する詳細)
親トピック: データ・ガイド対応検索索引の変更トリガー
23.10 文書セットごとの複数のデータ・ガイド
データ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。
異なる種類のJSON文書用のデータ・ガイド
JSON文書は、規定のスキーマに従う必要はなく、通常は従うことはありません。これは、所定のアプリケーションで同様に使用される文書の場合も当てはまります。これらは構造的に(形状)異なる可能性があり、フィールド型が異なる可能性があります。
JSONデータ・ガイドは、所定の文書セットの構造的情報と型情報を要約します。一般に、所定のセット内の文書の構造的情報と型情報が類似するほど、結果のデータ・ガイドの有用性は高まります。
データ・ガイドは、JSONデータの所定の列に対して作成されます。列に異なる種類の文書(たとえば発注書と健康記録)が含まれる場合、その列に単一のデータ・ガイドを用意しても、用途が限られると考えられます。
この懸念に対処する1つの方法は、異なるJSON列に異なる種類のJSON文書を配置することです。ただし、その他の事項を考慮した結果、同じ列内に異なる種類の文書を混在させることを選ぶ場合があります。
さらに、同じ列に格納すると決定した同じ一般的な種類の文書が、それにもかかわらず系統的な方法が比較的異なる場合があります。これには、形状や型情報が発展する文書の場合が含まれます。たとえば、税情報の文書の構造が年々変更される可能性があります。
データ・ガイドの作成時に、要約する情報を決定できます。そのため、同じJSON列に異なるデータ・ガイドを作成し、文書セットの異なるサブセットを表現できます。
これに関するもう1つの対処法は、JSONでない個別の列を同じ表内に設け、JSON列内の文書のラベルまたは分類に使用することです。
例に使用されている発注書の文書の場合、構造が年々大幅に変更される可能性があると考えると、形状が類似したサブセットにグループ化するために列date_loaded
を表j_purchaseorder
内で使用できます。例23-17では2015の発注書の文書を追加し、例23-18では2016の発注書の文書を追加します。(例4-3で追加された2014年の文書と比較します。)
複数のデータ・ガイドを作成するためのSQL集計関数の使用
Oracle SQLファンクションjson_dataguide
は、実際は集計関数です。集計関数は、単一行ではなく行のグループに基づいて1つの結果行を戻します。通常SELECT
リストの中でGROUP BY
句を持つ問合せに使用され、問い合せられた表またはビューの行をグループに分割します。集計関数は行の各グループに適用され、各グループの単一の結果行を返します。たとえば、集計関数avg
は、値グループの平均値を返します。
ファンクションjson_dataguide
はJSONデータを集計し、データの要約または仕様を作成します。これはJSON文書の形式で返されます。言い換えると、適用先のJSON文書の各グループについて、データ・ガイドが返されます。
GROUP BY
を省略すると、このファンクションは対象のJSON列内のすべてのJSONデータを要約した単一のデータ・ガイドを返します。
例23-19では、JSON列po_document
の文書を問い合せて、それらをグループ化し、列date_loaded
の各年に1つずつ合計3つのデータ・ガイドを生成します。
例23-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} ]}');
例23-18 2016発注書の文書の追加
2016形式は、PO_ID
をPO_Number
のかわりに、PO_Ref
をPO_Reference
のかわりに、PO_Items
をPO_LineItems
のかわりに、Part_No
をPart_Number
のかわりに、Item_Quantity
をQuantity
のかわりに使用します。
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} ]}');
例23-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
の詳細)
親トピック: JSONデータ・ガイド
23.11 データ・ガイドの問合せ
データ・ガイドは、一連のJSON文書に関する情報です。Oracle SQLファンクションjson_dataguide
またはPL/SQLファンクションDBMS_JSON.get_index_dataguide
のいずれかを使用することで、取得するフラット・データ・ガイドからの情報を問合せられます。後者の場合、データ・ガイド対応JSON検索索引が、JSONデータ上で定義されている必要があります。
関連項目:
-
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(SQL/JSONファンクション
json_table
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database SQL言語リファレンス(PL/SQL定数
DBMS_JSON.FORMAT_FLAT
の詳細)
例23-20 JSON_DATAGUIDEを使用して取得したデータ・ガイドの問合せ
この例は、SQL/JSONファンクションjson_dataguide
を使用して、フラット・データ・ガイドを取得します。次に、SQL/JSONファンクションjson_table
によってフィールドo:path
、type
、o:length
から即時に投影された関係する列を問い合せます。投影された列を、作成されたパス列jpath
を基準として辞書順に返します。
DBMS_JSON.GATHER_STATS
がjson_dataguide
の3番目の引数に含まれている場合、返されるデータ・ガイドには統計フィールドも含まれます。
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
例23-21 最小頻度が80%のパスに対する索引データを使用したデータ・ガイドの問合せ
この例では、PL/SQLファンクションDBMS_JSON.get_index_dataguide
を形式の値DBMS_JSON.FORMAT_FLAT
と一緒に使用して、データ・ガイド対応JSON検索索引に格納されているデータ・ガイド情報からフラット・データ・ガイドを取得します。次に、フィールドo:path
、type
、o:length
、o: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
関連項目
親トピック: JSONデータ・ガイド
23.12 発注書の文書のフラット・データ・ガイド
サンプル・フラット・データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。
フラット・データ・ガイド内で使用されるJSONスキーマ・キーワードはtype
のみです。その他のフィールドは、すべてOracleデータ・ガイド・フィールドであり、接頭辞o:
が付いています。
例23-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"
)。
例23-22 発注書のフラット・データ・ガイド
パスは太字
で示されます。JSONスキーマ・キーワードはイタリック体
で示されます。DBMS_JSON.rename_column
を使用した結果の優先列名もイタリック体
で示されます。使用されている形式は、SQL/JSONファンクションjson_dataguide
(フォーマット引数DBMS_JSON.FORMAT_FLAT
およびDBMS_JSON.PRETTY
を指定)を使用して作成された場合と類似しています。
フィールドo:frequency
、o:low_value
、o:high_value
、o:num_nulls
、o:last_analyzed
があることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。
このデータの統計情報の収集例は、例23-3を参照してください。
統計を収集するには、データ・ガイドがJSON検索索引に基づいているか、3番目の引数にDBMS_JSON.GATHER_STATS
を指定してファンクションjson_dataguide
を使用して作成されている必要があります。
[
{
"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"
}
]
関連項目:
-
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.get_index_dataguide
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
親トピック: JSONデータ・ガイド
23.13 発注書の文書の階層データ・ガイド
サンプル階層データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。
例23-23では、表j_purchaseorder
内の発注書の文書の階層データ・ガイドを示します。データ・ガイドは、プロシージャDBMS_JSON.get_index_dataguide
を使用して作成されました。
例23-23 発注書の階層データ・ガイド
フィールド名は太字
で示されます。JSONスキーマ・キーワードはイタリック体
で示されます。DBMS_JSON.rename_column
を使用した結果の優先列名もイタリック体
で示されます。使用される書式は、書式設定引数DBMS_JSON.FORMAT_HIERARCHICAL
およびDBMS_JSON.PRETTY
とともにSQL/JSONファンクションjson_dataguide
を使用して生成されたものに似ています。
この例に、統計フィールドo:frequency
、o:low_value
、o:high_value
、o:num_nulls
、o:last_analyzed
があることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。このデータの統計情報の収集例は、例23-3を参照してください。
SQLファンクションjson_dataguide
によって作成された階層データ・ガイドは、この例と似ていますが、次の点に違いがあります。
-
フィールド
o:preferred_column_name
の値は、JSON文書のフィールド名と同じです。つまり、先頭にPO_DOCUMENT$
は付加されません。 -
統計フィールドは、3番目の引数に
DBMS_JSON.GATHER_STATS
を指定してjson_dataguide
が呼び出された場合にのみ存在します。この場合、フィールドo:last_analyzed
に続くフィールドo:sample_size
も存在します。(JSONデータの問合せ列に2つの文書がある場合、o:sample_size
の値は2
になります。)
{
"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"
}
}
}
関連項目:
-
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
親トピック: JSONデータ・ガイド
脚注の凡例
脚注1: ファンクションjson_dataguideにオプションの2番目の引数としてDBMS_JSON.FORMAT_HIERARCHICAL
が渡された場合、結果は3つの階層データ・ガイドとなります。