8.1 JSON列からドキュメントへの値の埋込み
二面性ビューの基になるJSON
型列にマッピングされたフィールドの値は、そのビューでサポートされているドキュメントにそのまま埋め込まれます。SQL値からの変換はありません。それはすでにJSON値です(デフォルトで、任意のJSON言語型: オブジェクト、配列、文字列、数値、…)。
表person
にリレーショナル列が3つとJSON
型列extras
があり、それらの値がJSONオブジェクトである必要がある場合を考えてみます:脚注1
CREATE TABLE person (
pid NUMBER PRIMARY KEY,
first VARCHAR2(20),
last VARCHAR2(20),
extras JSON (OBJECT));
二面性ビューperson_embed_dv
には、表person
のすべての列が含まれます。GraphQLおよびSQLでのビュー定義を次に示します:脚注2
GraphQL:
CREATE JSON DUALITY VIEW person_embed_dv AS
person @update @insert @delete
{_id : pid,
firstName : first,
lastName : last,
moreInfo : extras};
SQL:
CREATE JSON RELATIONAL DUALITY VIEW person_embed_dv AS
SELECT JSON {'_id' : p.pid,
'firstName' : p.first,
'lastName' : p.last,
'moreInfo' : p.extras}
FROM person p WITH UPDATE INSERT DELETE;
表person
への挿入では、次の例のように、列値としてJSONオブジェクトを指定する必要があります:
INSERT INTO person VALUES (1,
'Jane',
'Doe',
'{"middleName" : "X",
"nickName" : "Anon X"}');
表person
を見ると、列extras
にはフィールドmiddleName
およびnickName
を含むJSONオブジェクトが含まれていることがわかります。
SELECT p.* FROM person p;
PID FIRST LAST EXTRAS
--- ----- ---- ------
1 Jane Doe {"middleName":"X","nickName":"Anon X"}
このビューからの生成結果となるドキュメントを選択すると、そのオブジェクトがそのまま埋め込まれたことがわかり、フィールドmoreInfo
の値は次のようになります:
SELECT pdv.data FROM person_embed_dv pdv
WHERE pdv.data."_id" = 1;
{"_id":1,"firstName":"Jane","lastName":"Doe",
"moreInfo":{"middleName":"X","nickName":"Anon X"}}
同様に、ドキュメントをビューに挿入するときは、フィールドmoreInfo
の値はオブジェクトである必要があります。これはそのフィールドがビュー定義でJSON (OBJECT)
型の列person.extras
にマップされているためです。
JSONオブジェクトの埋込みは、1つの可能性にすぎません。JSONデータのスキーマの本来の柔軟性は、列person.extras
のデータ型がJSON(OBJECT)
ではなく単にJSON
であった場合にフィールドmoreInfo
の値はどのJSON値になる可能性もある(必ずしもオブジェクトではない)ことを意味しています。
柔軟性の度合いを高めるために他のJSON
型仕様を使用することもできます(JSON(SCALAR)
、JSON(ARRAY)
、JSON(SCALAR, ARRAY)
など)。たとえば、JSON
型修飾子(OBJECT, ARRAY)
には非スカラー値(オブジェクトまたは配列)が必要であり、修飾子(OBJECT, SCALAR DATE)
ではオブジェクトまたはJSON日付のみが許可されます。『Oracle Database JSON開発者ガイド』のJSON列を使用した表の作成を参照してください。
また、JSONスキーマを使用すると、可能なかぎり幅広い柔軟性を得ることができます。『Oracle Database JSON開発者ガイド』の「JSONスキーマを使用したJSONデータの検証」を参照してください。二面性ビューの基になるJSON
型列にJSONスキーマを適用することで、データの論理構造、つまりそのビューでサポートされているドキュメントの構造を変更します。一部のスキーマ柔軟性は削除しますが、格納構造(表)は変更しません。
親トピック: 二面性ビューでのJSON列によるスキーマ柔軟性
脚注一覧
脚注1: これは、「JSONフレックス列からドキュメントへのフィールドのマージ」での定義とは異なります。つまり、列extras
はフレックス列としてラベル付けされません。脚注2: これは、「JSONフレックス列からドキュメントへのフィールドのマージ」内の二面性ビュー定義とは異なります。つまり、(1)列
extras
はフィールド(moreInfo
)にマップされ、(2)それはフレックス列としてラベル付けされません。