25.7 JSON生成に基づく読取り専用ビュー

JSON生成関数またはコンストラクタJSONを使用して読取り専用ビューを作成できます。アクセス権があるユーザーは誰でも、そのビューを読取り専用表であるかのように使用できます。JSONデータのユーザーは、それがそれ自体として格納されているかや必要に応じて生成されているかを把握する必要も気にする必要もありません。

例25-13に、これを示します。結果となるビューは、列ID (部門識別番号)およびDATA (部門の従業員を含む、その部門のJSONデータ)がある読取り専用であるかのように使用できます。SQL*Plusコマンドdescribeを使用すると、次のようになります:

describe department_view;
Name   Null?      Type
---------------------------
ID     NOT NULL   NUMBER(4)
DATA              JSON

特別なJSONコンストラクタ構文が使用されているため(JSON {...})、列DATAのデータ型はJSONです。基にある格納データは、HRのサンプルスキーマHR、表DEPARTMENTLOCATIONEMPLOYEESおよびJOBSから取得されます。

このビューの各行に、単一の部門についての情報(ID、名前、住所および従業員)が表示されます。部門の住所はJSONオブジェクトです。

部門の従業員のデータは従業員オブジェクトの配列であり、各オブジェクトにその従業員のID、氏名および役職が含まれています。その名前は、名と姓が別々に格納される列データで構成されます。

このビューを問い合せると、JSON生成関数を呼び出すSQLコードが評価されます。例25-14に、部門90について単一の文書を返す問合せを示します。

読取りのパフォーマンスを向上させるには、ビューをマテリアライズします。

JSON生成ビューは読取り専用であるため、更新できません(INSTEAD OFトリガー脚注1を使用する場合を除く)。JSONデータが提供される更新可能なビューが必要な場合は、JSONリレーショナル二面性ビューを作成できます。

例25-13 JSON生成を使用するビューの作成

CREATE VIEW department_view AS 
  SELECT  dep.department_id id,
          JSON {'id'                : dep.department_id,
                'departmentName'    : dep.department_name,
                'departmentAddress' : JSON {'street'  : loc.street_address,
                                            'zip'     : loc.postal_code,
                                            'city'    : loc.city,
                                            'state'   : loc.state_province,
                                            'country' : loc.country_id},
                'employees'         : [ SELECT
                                          JSON {'id'    : emp.employee_id,
                                                'name'  : emp.first_name || ' ' || emp.last_name,
                                                'title' : (SELECT job_title 
                                                             FROM jobs job 
                                                             WHERE job.job_id = emp.job_id)}
                                          FROM employees emp 
                                          WHERE emp.department_id = dep.department_id ]} data
    FROM departments dep, locations loc
    WHERE dep.location_id = loc.location_id; 

例25-14 DEPARTMENT_VIEWから生成されたJSON文書

この例では、部門90について生成されるJSON文書をフォーマット出力します。例25-13CREATE VIEW文で使用されている副問合せに対応する、埋込みオブジェクト(フィールドdepartmentAddress、および配列employeesの要素)に注目してください。

SELECT json_serialize(data pretty) FROM department_view WHERE id = 90;
{"id"                : 90,
 "departmentName"    : "Executive",
 "departmentAddress" : {"street"  : "2004 Charade Rd",
                        "zip"     : "98199",
                        "city"    : "Seattle",
                        "state"   : "Washington",
                        "country" : "US"},
 "employees"         : [ {"id"    : 100,
                          "name"  : "Steven King",
                          "title" : "President"},
                         {"id"    : 101,
                          "name"  : "Neena Kochhar",
                          "title" : "Administration Vice President"},
                         {"id"    : 102,
                          "name"  : "Lex De Haan",
                          "title" : "Administration Vice President"} ]}

関連項目:



脚注の凡例

脚注1: INSTEAD OFトリガーの詳細は、『Oracle Database PL/SQL言語リファレンス』INSTEAD OF DMLトリガーを参照してください