3 二面性ビューの作成

(1) SQL/JSON生成ファンクション問合せ、または(2) GraphQL問合せとともにSQLを使用して、JSONリレーショナル二面性ビューを作成します。カーレース・アプリケーションで使用されるJSONドキュメントを提供するために、チーム、ドライバおよびレースの二面性ビューの例が作成されます。

(既存のリレーショナル・データから二面性ビューを簡単に作成する方法を理解するには、「JSONリレーショナル二面性の表中心ユースケース」を参照してください。)

ここで作成されるビューは、ビューdriver_dvrace_dvおよびteam_dvの基になる関連表driverraceおよびteam内のデータと、ビューdriver_dvおよびrace_dvの基になるマッピング表driver_race_mapに基づいています。

二面性ビューでは、JSONドキュメントをサポートしています。各ドキュメントには上位レベルのJSONオブジェクトがあります。二面性ビューは、JSONデータ型の単一列を持つ表の場合と同様に操作できます。

二面性ビューとそれに対応する上位レベルのJSONオブジェクトは、ネストされたSQL副問合せを使用してビュー定義に定義されているJSONオブジェクトおよび配列の階層を提供します。副問合せから収集されたデータは、その副問合せのWHERE句内の対応する複数の識別列の間の関係によって、親表から収集されたデータと結合されます。これらの列には、主キー制約および外部キー制約を含めることができますが、含める必要はありません。

識別列とは、主キー列、アイデンティティ列、一意制約がある列または一意索引がある列です。

SQL/JSON生成ファンクションを直接使用して読取り専用の二面性SQLビューを作成できます(Oracle Database JSON開発者ガイドJSON生成に基づいた読取り専用ビューを参照)。

二面性ビューは、制限された構造を持つJSON生成ビューであり、アプリケーションがビューを更新できるように明示的に設計されているため、基礎となる表を自動的に更新できます。すべての二面性ビューは、読取り専用であるビューも含め、これを許可するのと同じ制限を共有します。

一般に、二面性ビューの基になる表にある列は、そのビューでサポートされているドキュメント内のフィールドにマップされます。つまり、列値はフィールド値として使用されます。

二面性ビューとそのサポート対象ドキュメントは通常は更新できるため(その基になる表にあるデータを更新する)、各表に1つ以上の識別列が必要です。それらすべての列の値によって、対応するフィールド値の生成に使用される、表の行が一意に識別されます。二面性ビュー定義内の指定された1つの表の出現すべてで、同じ識別列のセットが使用されている必要があります。

ノート:

SQL/JSON生成ファンクションに対するCLOBおよびBLOBデータ型の入力の場合は、空のインスタンスがSQLのNULLと区別されます。空のJSON文字列("")が生成されます。ただし、データ型VARCHAR2NVARCHAR2およびRAWの入力の場合、Oracle SQLでは空の値(長さがゼロ)をNULLとして扱うため、そのような値がJSON文字列に生成されると想定しないでください

二面性ビューを基礎とする表のデータの列は、SQL/JSON生成ファンクションの入力として使用され、ビューでサポートされるJSONドキュメントを生成します。したがって、列の値が空の場合は、列のデータ型に応じて、空の文字列またはSQL NULL値になります。

二面性ビューには、基礎となる表データから生成されるJSONデータ型のpayload列が1つのみ(DATA)あります。したがって、二面性ビューの各行には、ビュー定義の上位レベルのオブジェクトである単一のJSONオブジェクトが含まれています。このオブジェクトはビューによってサポートされているJSONドキュメントとして機能します。

ペイロード・ドキュメント・コンテンツ(つまり、アプリケーション・コンテンツそれ自体)に加えて、ドキュメントの上位オブジェクトには常に、自動的に生成および管理されるドキュメント処理フィールド_metadataがあります。その値は、次のフィールドを持つオブジェクトです:

  • etag - 特定のバージョンのドキュメントの一意の識別子。16進文字の文字列です。

    この識別子は、ドキュメント・コンテンツ(ペイロード)、つまり、フィールド_metadataを除くすべてのドキュメント・フィールドのハッシュ値として構築されます。(より正確には、基礎となる列に暗黙的または明示的にCHECK注釈が付けられている、つまりこれらの列がETAG値に関与しているすべてのフィールド。)

    このETAG値により、アプリケーションでは、ドキュメントの特定のバージョンのコンテンツが別のバージョンのコンテンツと同じかどうかを判断できます。これは、オプティミスティックな同時実行性の実装などに使用されます。「二面性ビューでのオプティミスティックな同時実行性制御の使用」を参照してください。

  • asof — JSONドキュメントの最新のシステム変更番号(SCN)をJSON番号として指定します。これにより、ドキュメントが生成された時点で最後の論理ポイントが記録されます。

    SCNを使用して、特定のJSONドキュメントがデータベースから取得された正確な時点で他のデータベース・オブジェクト(二面性ビュー、表)を問い合せることができます。これにより、データベースの読取りにおける一貫性が確保されます。「JSONドキュメントのシステム変更番号(SCN)の使用」を参照してください

ペイロード列DATAの他に、二面性ビューには、SQLからアクセスできる2つの非表示列も含まれています:

  • ETAG — この16バイトのRAW列には、列DATAの現在の行のETAG値が保持されます。つまり、ドキュメント・メタデータ・フィールドetagに使用されるデータが保持されます。

  • RESID — この可変長のRAW列には、列DATAの現在の行の内容であるドキュメントを一意に識別するオブジェクト識別子が保持されます。この列の値は、ルート表の識別列の連結バイナリ・エンコーディングです。

SQL DDL文CREATE JSON RELATIONAL DUALITY VIEWを使用して二面性ビューを作成します。この構文では、GraphQL言語のサブセットをオプションで使用できます。

便宜上、二面性ビューを作成するたびに、指定したビュー名に対してシノニムが自動的に作成されます。指定した名前が引用符で囲まれていない場合、シノニムは同じ名前ですが引用符で囲まれます。指定した名前が引用符で囲まれている場合、シノニムは同じ名前ですが引用符で囲まれません。引用符で囲まれた名前に、引用符で囲まれていない名前で許可されていない文字が1つ以上含まれている場合、シノニムは作成されません。シノニムを作成すると、二面性ビューの名前は、引用符で囲まれているかどうかに関係なく、実質的に常に大文字と小文字が区別されるようになります。『Oracle Database SQL言語リファレンス』「CREATE SYNONYM」を参照してください。

_________________________________________________________

関連項目: