24.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であり、これは追加された仮想列が非表示でないことを意味します。) 
_________________________________________________________
関連項目:
- 
                           
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フィールドの仮想列の追加
階層データ・ガイドまたはスキーマ・データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。 - データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。 - データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columnsを使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。 
関連トピック
親トピック: JSONデータ・ガイド
24.8.1 階層データ・ガイドまたはスキーマ・データ・ガイドに基づくJSONフィールドの仮想列の追加
階層データ・ガイドまたはスキーマ・データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。
データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。
階層データ・ガイドまたはスキーマ・データ・ガイドを取得するには、引数DBMS_JSON.FORMAT_HIERARCHICALまたはDBMS_JSON.FORMAT_SCHEMAをそれぞれ指定してOracle SQLファンクションjson_dataguideを使用します。
                     
取得したデータ・ガイドを編集することで、特定のスカラー・フィールド(配列下にないもの)のみを含め、フィールドの名前を変更し、フィールドの型の長さを変更できます。結果のデータ・ガイドに、新しい仮想列として投影されるこれらのフィールドが指定されます。配列下にないスカラー・フィールドでないデータ・ガイド内のすべてのフィールドは無視されます(投影されません)。
ノート:
スキーマ・データ・ガイドを使用して、特定のフィールドの仮想列を追加するとき、そのフィールドの値が文書セット内で異なるスカラー型である場合は、それらのスカラー型ごとに列が追加されます。最初の列以外のこのような複数列の名前には、フィールド名に_Nが付加されます(N = 1、2、...)。
                        
たとえば、ある文書でフィールドaは数値であり、別の文書では文字列値である場合、1つはNUMBER型、もう1つはVARCHAR2型の2つの仮想列が作成されます。一方の列の名前はAで、他方の列の名前はA_1です。
                        
PL/SQLプロシージャDBMS_JSON.add_virtual_columnsを使用して、投影されたフィールドを含むJSON列を格納する表に仮想列を追加します。まずプロシージャは、以前のadd_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vc(実質的に、このプロシージャの実行内容はプロシージャDBMS_JSON.drop_virtual_columnsと同じ)によって同じJSON列内のフィールドから投影された既存の仮想列を削除します。
                     
例24-9に、これを示します。これは、表j_purchaseorderのJSON列dataにあるデータから、配列下にないスカラー・フィールドを投影します。投影されたフィールドは、データ・ガイド内で示されるフィールドです。
                     
例24-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の詳細) - 
                              
PL/SQL定数
DBMS_JSON.FORMAT_HIERARCHICALおよびDBMS_JSON.FORMAT_SCHEMAの詳細は、『Oracle Database SQL言語リファレンス』を参照してください 
例24-9 JSON_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加
この例では、ファンクションjson_dataguideとJSON列dataを使用して取得した階層データ・ガイドを使用します。
                     
追加された仮想列は、すべて表j_purchaseorder内の列です。ID、DATE_LOADED、PODOCUMENTは例外です。 
                     
- 
                           
                           
パラメータ
resolveNameConflictsはTRUEで、名前の競合が解決されるようにします。(オプション。わかりやすくするため。これはどちらにしてもデフォルト値です。) - 
                           
                           
パラメータ
colNamePrefixは'DATA$'であり、これを列名のデフォルト接頭辞として使用します。 - 
                           
                           
パラメータ
mixedCaseColumnsはTRUEで、列名の大/小文字を区別します。つまり、大文字と小文字を区別します。 
DECLARE
  dg CLOB;
BEGIN
  SELECT json_dataguide(data, DBMS_JSON.FORMAT_HIERARCHICAL) INTO dg
    FROM j_purchaseorder;
  DBMS_JSON.add_virtual_columns('J_PURCHASEORDER',
                                'DATA',
                                dg,
                                resolveNameConflicts=>TRUE,
                                colNamePrefix=>'DATA$',
                                mixedCaseColumns=>TRUE);
END;
/
DESCRIBE j_purchaseorder;
 Name                             Null?    Type
 -------------------------------- -------- ---------------------------
 ID                               NOT NULL RAW(16)
 DATE_LOADED                               TIMESTAMP(6) WITH TIME ZONE
 DATA                                      CLOB
 DATA$User                                 VARCHAR2(8)
 DATA$PONumber                             NUMBER
 DATA$Reference                            VARCHAR2(16)
 DATA$Requestor                            VARCHAR2(16)
 DATA$CostCenter                           VARCHAR2(4)
 DATA$AllowPartialShipment                 VARCHAR2(4)
 DATA$name                                 VARCHAR2(16)
 DATA$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)
例24-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', 'DATA', dg);
END;
/
DESCRIBE j_purchaseorder;
 Name        Null?    Type
 ----------- -------- ---------------------------
 ID          NOT NULL RAW(16)
 DATE_LOADED          TIMESTAMP(6) WITH TIME ZONE
 DATA                 CLOB
 PO_Number            NUMBER
SELECT column_name FROM user_tab_columns
  WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;
COLUMN_NAME
-----------
DATE_LOADED
ID
DATA
PO_Number
PO_Reference
5 rows selected.関連トピック
24.8.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加
JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。
プロシージャDBMS_JSON.add_virtual_columnsを使用して、仮想列を追加します。
                     
例24-11に、これを示します。配列下にないすべてのスカラー・フィールドは、表j_purchaseorderに仮想列として投影されます。
                     
フィールドを投影するJSON列内の文書に関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内の各フィールドの出現頻度を記録します。
仮想列を追加するときは、所定の最小発生頻度のフィールドのみが投影されることを指定できます。
これには、パラメータFREQUENCYの値として、プロシージャadd_virtual_columnsにゼロ以外の値を指定します。ゼロはデフォルト値であるため、引数FREQUENCYを含めないと、すべてのスカラー・フィールド(配列下にないもの)が投影されます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。
                     
例24-12は、文書のすべて(100%)に出現するすべてのスカラー(配列下にないもの)を仮想列として投影します。
追加されたすべての仮想列を非表示にする場合、TRUE値を引数HIDDENに指定します。(パラメータHIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示でないことを意味します。)
                     
例24-13は、文書のすべて(100%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。
関連項目:
- 
                              
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columnsに関する詳細) - 
                              
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.rename_columnに関する詳細) 
例24-11 配列下にないすべてのスカラー・フィールドの仮想列としての投影
追加された仮想列は、すべて表j_purchaseorder内の列です。ID、DATE_LOADED、PODOCUMENTは例外です。これは、FREQUENCY引数がadd_virtual_columnsに渡されないため、すべてのスカラー・フィールド(配列下にないもの)が投影されます。
                     
(名前がitalicでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)
                     
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA');
DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 DATA                                               CLOB
 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)
例24-12 最小頻度のスカラー・フィールドの仮想列としての投影
文書のすべて(100%)に出現するすべてのスカラー・フィールドが、仮想列として投影されます。この結果は例24-11と同じですが、フィールドAllowPartialShipmentとPhoneが投影されない点が異なります。これは、それらが文書の100%には出現しないためです。
                     
(名前がitalicでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)
                     
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100);
DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 DATA                                               CLOB
 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)例24-13 最小頻度のスカラー・フィールドの非表示の仮想列としての投影
この結果は例24-12と同じですが、追加されたすべての仮想列が非表示になることが異なります。(ビューUSER_TAB_COLUMNSの問合せは、仮想列が実際に追加されたことを示します。)
                     
EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100, TRUE);
DESCRIBE j_purchaseorder;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL RAW(16)
 DATE_LOADED                                        TIMESTAMP(6) WITH TIME ZONE
 DATA                                               CLOB
SELECT column_name FROM user_tab_columns
  WHERE table_name = 'J_PURCHASEORDER'
  ORDER BY 1;
COLUMN_NAME
-----------
DATE_LOADED
ID
PONumber
DATA
DATA$CostCenter
DATA$Reference
DATA$Requestor
DATA$SpecialInstructions
DATA$User
DATA$city
DATA$country
DATA$name
DATA$state
DATA$street
DATA$zipCode
24.8.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除
プロシージャDBMS_JSON.drop_virtual_columnsを使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。
                  
DBMS_JSON.drop_virtual_columnsは、add_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vcによって所定のJSON列内のフィールドから投影されたすべての仮想列を削除します。例24-14では、表j_purchaseorderの列dataから投影されたフィールドに対するこれを示します。
                  関連項目:
- 
                              
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス (
DBMS_JSON.add_virtual_columnsに関する詳細) - 
                              
Oracle Database PL/SQLパッケージおよびタイプ・リファレンス(
DBMS_JSON.drop_virtual_columnsに関する詳細) 
例24-14 JSONフィールドから投影された仮想列の削除
EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');