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に関する項を参照してください)。
_________________________________________________________
関連項目:
-
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データのビューの作成
階層データ・ガイドまたはスキーマ・データ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。 - 階層データ・ガイドに基づくJSONデータのビューの作成
データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。
親トピック: JSONデータ・ガイド
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"}
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.create_view
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細) -
Oracle Database SQL言語リファレンス(SQLファンクション
json_dataguide
の詳細) -
PL/SQL定数
DBMS_JSON.FORMAT_HIERARCHICAL
およびDBMS_JSON.FORMAT_SCHEMA
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
例24-5 JSON_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成
この例では、表j_purchaseorder
のdata
に対する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
を'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)
関連トピック
親トピック: データ・ガイド情報に基づくJSONデータのビューの作成
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
引数がゼロ以外の場合、文書セットに関する統計情報を収集していても、最後に統計情報を収集した後に追加されたすべての文書の統計情報は、索引には含まれません。これは、統計の収集後に追加されたすべてのフィールドは無視される(投影されない)ことを意味します。
関連項目:
-
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.create_view_on_path
に関する詳細) -
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.rename_column
に関する詳細)
例24-6 すべてのスカラー・フィールドを投影するビューの作成
指定されたパスが$
であるため、すべてのスカラー・フィールドがビュー内に表れます。
(名前がitalic
でdescribe
コマンド出力内に記述された列は、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 パス式で対象とされたスカラー・フィールドを投影するビューの作成
フィールドItemnumber
、PhoneType
、PhoneNumber
はビュー内には表れません。投影されるフィールドは、配列下にないスカラー・フィールドに加えて、$.LineItems.Part
で対象とされるデータ内のすべてのレベルにあるスカラー・フィールドのみです(つまり、パスが$.LineItems.Part
で始まるパスにあるスカラー・フィールド)。(名前がitalic
でdescribe
コマンド出力内に記述された列は、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
はビュー内にありません。フィールドPhone
、PhoneType
、PhoneNumber
の場合も同様です。
(名前がitalic
でdescribe
コマンド出力内に記述された列は、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
関連トピック
親トピック: データ・ガイド情報に基づくJSONデータのビューの作成