3 二面性ビューの作成
(1) SQL/JSON生成ファンクション問合せ、または(2) GraphQL問合せとともにSQLを使用して、JSONリレーショナル二面性ビューを作成します。カーレース・アプリケーションで使用されるJSONドキュメントを提供するために、チーム、ドライバおよびレースの二面性ビューの例が作成されます。
(既存のリレーショナル・データから二面性ビューを簡単に作成する方法を理解するには、「JSONリレーショナル二面性の表中心ユースケース」を参照してください。)
ここで作成されるビューは、ビューdriver_dv
、race_dv
およびteam_dv
の基になる関連表driver
、race
および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文字列(""
)が生成されます。ただし、データ型VARCHAR2
、NVARCHAR2
および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」を参照してください。
_________________________________________________________
- SQLを使用したカーレース二面性ビューの作成
カーレース・アプリケーション用のチーム、ドライバおよびレースの二面性ビューを、SQLを使用して作成します。 - GraphQLを使用したカーレース二面性ビューの作成
カーレース・アプリケーション用のチーム、ドライバおよびレースの二面性ビューを、GraphQLを使用して作成します。 - 二面性ビューの表のWHERE句
JSONリレーショナル二面性ビューを作成する際、WHERE
句で単純なテストを使用して、基礎となる表を結合するだけでなく、JSONデータの生成に使用される表の行を選択することもできます。これにより、二面性ビューでサポートされているJSONドキュメントに含めるデータをきめ細かく制御できるようになります。
関連トピック
関連項目:
-
『Oracle Database SQL言語リファレンス』のCREATE JSON RELATIONAL DUALITY VIEWに関する項
-
SQL/JSONファンクション
json_object
、json_array
およびjson_arrayagg
および構文JSON {
…}
およびJSON [
…]
の詳細は、『Oracle Database JSON開発者ガイド』のSQLを使用したJSONデータの生成に関する項を参照してください -
『Oracle Database JSON開発者ガイド』のJSONデータ型のコンストラクタに関する項を参照してください
-
『Oracle Database概要』の「システム変更番号(SCN)」