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
、表DEPARTMENT
、LOCATION
、EMPLOYEES
および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-13のCREATE 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"} ]}
関連項目:
-
サンプル・スキーマ
HR
については、『Oracle Databaseサンプル・スキーマ』のHRサンプル・スキーマ表の説明、およびhttps://github.com/oracle-samples/db-sample-schemasを参照してください -
JSONデータの更新可能ビューについては、『JSONリレーショナル二面性開発者ガイド』の更新可能なJSONリレーショナル二面性ビューを参照してください
-
マテリアライズド・ビューの作成と使用については、『Oracle Databaseデータ・ウェアハウス・ガイド』の基本マテリアライズド・ビューを参照してください。
親トピック: SQLを使用したJSONデータの生成
脚注の凡例
脚注1:INSTEAD OF
トリガーの詳細は、『Oracle Database PL/SQL言語リファレンス』のINSTEAD OF DMLトリガーを参照してください