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スキーマを適用することで、データの論理構造、つまりそのビューでサポートされているドキュメントの構造を変更します。一部のスキーマ柔軟性は削除しますが、格納構造(表)は変更しません。



脚注一覧

脚注1: これは、「JSONフレックス列からドキュメントへのフィールドのマージ」での定義とは異なります。つまり、列extrasはフレックス列としてラベル付けされません。
脚注2: これは、「JSONフレックス列からドキュメントへのフィールドのマージ」内の二面性ビュー定義とは異なります。つまり、(1)列extrasはフィールド(moreInfo)にマップされ、(2)それはフレックス列としてラベル付けされません。