24.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に関する項を参照してください)。

_________________________________________________________

関連項目:

24.7.1 階層データ・ガイドまたはスキーマ・データ・ガイドに基づくJSONデータのビューの作成

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

階層データ・ガイドまたはスキーマ・データ・ガイドを取得するには、引数DBMS_JSON.FORMAT_HIERARCHICALまたはDBMS_JSON.FORMAT_SCHEMAをそれぞれ指定してSQLファンクションjson_dataguideを使用します。

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

ノート:

スキーマ・データ・ガイドを使用して、特定のフィールドの列を含むビューを作成するとき、そのフィールドの値が文書セット内で異なるスカラー型である場合は、それらのスカラー型ごとに列が使用されます。最初の列以外のこのような複数列の名前には、フィールド名に_Nが付加されます(N = 1、2、...)。

たとえば、ある文書でフィールドaは数値であり、別の文書では文字列値である場合、ビューでは、1つはNUMBER型、もう1つはVARCHAR2型の2つの列が使用されます。一方の列の名前はAで、他方の列の名前はA_1です。

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

例24-5に、引数DBMS_JSON.FORMAT_HIERARCHICALを指定したOracle SQLファンクションjson_dataguideで取得したデータ・ガイドを使用してこれを示します。

json_dataguideで取得したデータ・ガイドを使用してビューを作成する場合は、文書のGeoJSONデータがサポートされます。この場合、GeoJSONデータに対応するビュー列は、SQLデータ型SDO_GEOMETRYになります。そのため、ファンクションjson_dataguideの3つ目の引数として、定数DBMS_JSON.GEOJSONまたはDBMS_JSON.GEOJSON+DBMS_JSON.PRETTYを渡します。

ノート:

ファンクションjson_dataguideは、GeoJSONオブジェクト内でフィールドcoordinatesまたはフィールドgeometriesがフィールドtypeよりにある場合、GeoJSONデータを検出できません

たとえば、このGeoJSONデータは、次のように検出されます:

{"type"        : "Point",
 "coordinates" : [ 23.807, 7.121 ]}

このGeoJSONデータは、そのように検出されません(任意のJSONデータとして処理されます)。

{"coordinates" : [ 23.807, 7.121 ]
 "type"        : "Point"}

関連項目:

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

この例では、表j_purchaseorderdataに対する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の値を一意にします。パラメータRESOLVENAMECONFLICTSfalseである場合は、列の名前が一意でないと、DBMS_JSON.create_viewによってエラーが発生します。

この例では示していませんが、パラメータcolNamePrefixを指定したDBMS_JSON.create_viewを使用して列名の接頭辞を指定できます。たとえば、データ・ガイド対応JSON検索索引にある情報から取得したデータ・ガイドを使用する場合と同じ効果を得るには、パラメータcolNamePrefix'DATA$' (つまり、JSON列名DATAの後に$が続く)として指定します。例24-8を参照してください。

DECLARE
  dg CLOB;
  BEGIN
    SELECT json_dataguide(data,
                          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',
                          'DATA',
                          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)

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

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

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

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

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

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

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

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

ノート:

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

関連項目:

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

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

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

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

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

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

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

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


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

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

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

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

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


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