release 19 json開発者ガイドrelease 19 json開発者ガイド 目次 例一覧 図一覧...

330
Release 19 JSON 開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて 関連ドキュメント 表記規則 コード例 JSONデータのフォーマット出力 実行計画 /小文字の区別に関する注意 Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点 JSON開発者ガイドのOracle Databaseリリース19cバージョン19.1における変更点 新機能 JSONのマテリアライズド・ビューのサポート SQLファンクションJSON_MERGEPATCH: JSONドキュメントの宣言的更新 新しいSQL/JSONファンクションJSON_SERIALIZEおよびGeoJSONデー JSONデータ・ガイド・サポート 構文の簡素化 JSONデータとSQLオブジェクト型のマッピング JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点 1

Upload: others

Post on 13-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

目次例一覧図一覧表一覧タイトルおよび著作権情報はじめに

対象読者ドキュメントのアクセシビリティについて関連ドキュメント表記規則コード例

JSONデータのフォーマット出力実行計画大/小文字の区別に関する注意

『Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点JSON開発者ガイドのOracle Databaseリリース19cバージョン19.1における変更点

新機能JSONのマテリアライズド・ビューのサポートSQLファンクションJSON_MERGEPATCH: JSONドキュメントの宣言的更新新しいSQL/JSONファンクションJSON_SERIALIZEおよびGeoJSONデータJSONデータ・ガイド・サポート構文の簡素化JSONデータとSQLオブジェクト型のマッピング

JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点

1

Page 2: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

新機能SQL拡張機能シャーディングのサポートLOB記憶域のパフォーマンスの改善JSON検索索引の長いフィールド名のサポート

非推奨となった機能第I部 JSONデータおよびOracle Databaseの概要

1 Oracle DatabaseのJSON

1.1 Oracle DatabaseにおけるJSONの概要1.2 Oracle DatabaseでJSONを使用する前に1.3 JSONに対するOracle Databaseのサポート

2 JSONデータ2.1 JSONの概要2.2 JSON構文およびJSON構文が表すデータ2.3 XMLと比較したJSON

第II部 JSONデータの格納および管理3 JSONデータの格納および管理の概要4 JSON列を含む表の作成

4.1 列にJSONデータが必然的に含まれるかどうかの確認5 SQL/JSON条件IS JSONおよびIS NOT JSON

5.1 JSONオブジェクトの一意フィールドと重複フィールド5.2 厳密なJSON構文と緩慢なJSON構文について5.3 厳密なJSON構文と緩慢なJSON構文の指定

6 JSONデータの文字セットおよび文字エンコーディング7 JSONデータのパーティション化8 JSONデータのレプリケーション

第III部 JSONデータの挿入、更新およびロード9 JSONデータの挿入、更新およびロードの概要10 外部JSONデータのロード11 JSONマージ・パッチによるJSONドキュメントの更新

第IV部 JSONデータの問合せ

2

Page 3: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

12 JSONデータに対する単純なドット表記法アクセス13 SQL/JSONパス式

13.1 SQL/JSONパス式の概要13.2 SQL/JSONパス式の構文

13.2.1 基本的なSQL/JSONパス式の構文13.2.2 SQL/JSONパス式の構文の緩和

13.3 SQL/JSONパス式の項目メソッド13.4 ISO 8601日付および時間のサポート13.5 比較における型

14 SQL問合せファンクションおよび条件で使用される句14.1 SQL問合せファンクションで使用されるRETURNING句14.2 SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句14.3 SQL問合せファンクションおよび条件で使用されるエラー句14.4 SQL/JSON問合せファンクションで使用される空白フィールド句14.5 JSON_VALUEのON MISMATCH句

15 SQL/JSON条件JSON_EXISTS

15.1 JSON_EXISTSでのフィルタの使用15.2 JSON_TABLEとしてのJSON_EXISTS

16 SQL/JSONファンクションJSON_VALUE

16.1 SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用16.2 JSONのnull値に適用されるSQL/JSONファンクションJSON_VALUE

16.3 JSON_VALUEを使用したユーザー定義オブジェクト型インスタンスのインスタンス化16.4 JSON_TABLEとしてのJSON_VALUE

17 SQL/JSONファンクションJSON_QUERY

17.1 JSON_TABLEとしてのJSON_QUERY

18 SQL/JSONファンクションJSON_TABLE

18.1 JSON_TABLEの代替のSQL NESTED句18.2 SQL/JSONファンクションJSON_TABLEのCOLUMNS句18.3 JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化18.4 JSON_TABLEとJSON配列の使用

3

Page 4: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

18.5 JSON_TABLEを使用したJSONデータに対するビューの作成19 Oracle SQLファンクションJSON_SERIALIZE

20 JSONデータ・ガイド20.1 JSONデータ・ガイドの概要20.2 永続的なデータ・ガイド情報: JSON検索索引の一部20.3 データ・ガイドの形式およびデータ・ガイドの作成方法20.4 JSONデータ・ガイドのフィールド20.5 永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー20.6 フィールド列の優先名の指定20.7 データ・ガイド情報に基づくJSONデータのビューの作成

20.7.1 階層データ・ガイドに基づくJSONデータのビューの作成20.7.2 パス式に基づくJSONデータのビューの作成

20.8 データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除20.8.1 階層データ・ガイドに基づくJSONフィールドの仮想列の追加20.8.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加20.8.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除

20.9 データ・ガイド対応検索索引の変更トリガー20.9.1 ユーザー定義のデータ・ガイド変更トリガー

20.10 文書セットごとの複数のデータ・ガイド20.11 データ・ガイドの問合せ20.12 発注書の文書のフラット・データ・ガイド20.13 発注書の文書の階層データ・ガイド

第V部 JSONデータの生成21 SQL/JSONファンクションを使用したJSONデータの生成

21.1 SQL/JSONの生成関数の概要21.2 SQL/JSON生成関数の入力値の処理21.3 SQL/JSONファンクションJSON_OBJECT

21.4 SQL/JSONファンクションJSON_ARRAY

21.5 SQL/JSONファンクションJSON_OBJECTAGG

21.6 SQL/JSONファンクションJSON_ARRAYAGG

4

Page 5: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

第VI部 JSON用のPL/SQLオブジェクト型22 JSON用のPL/SQLオブジェクト型の概要23 JSON用のPL/SQLオブジェクト型の使用

第VII部 GeoJSON地理データ24 GeoJSON地理データの使用

第VIII部 JSON用のパフォーマンス・チューニング25 JSON用のパフォーマンス・チューニングの概要26 JSONデータの索引

26.1 JSONデータの索引付けの概要26.2 JSONデータに対して関数ベースの索引が選択されるかどうかを確認する方法26.3 SQL/JSON条件JSON_EXISTSのビットマップ索引の作成26.4 JSON_VALUE関数ベースの索引の作成26.5 JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用26.6 JSON_VALUE関数ベースの索引とJSON_EXISTS問合せの使用26.7 JSON_VALUEの索引付けおよび問合せに関するデータ型の考慮事項26.8 コンポジットBツリー索引を使用した複数のJSONフィールドの索引付け26.9 JSON検索索引: 非定型の問合せおよび全文検索

27 インメモリーJSONデータ27.1 インメモリーJSONデータの概要27.2 JSONデータのインメモリー列ストアへの移入27.3 インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレード

A Oracle DatabaseのJSONに関する制限事項B 基本的なSQL/JSONパス式の構文の図索引

5

Page 7: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

例一覧2-1 A JSONオブジェクト(JavaScriptのオブジェクト・リテラルの表現)

4-1 JSONデータが整形式であることを確認するためのチェック制約でのIS JSONの使用

4-2 VARCHAR2 JSON列へのJSONデータの挿入

5-1 JSONデータが厳密な整形式(標準)であることを確認するためのチェック制約でのISJSONの使用

7-1 JSON仮想列を使用したパーティション表の作成

9-1 BLOB列へのJSONデータの挿入

10-1 発注書向けのデータベース・ディレクトリ・オブジェクトの作成

10-2 外部表の作成およびJSONダンプ・ファイルからの入力

10-3 BLOB JSON列を含む表の作成

10-4 外部表からデータベース表へのJSONデータのコピー

11-1 JSONマージ・パッチ・ドキュメント

11-2 マージ・パッチ適用されたJSONドキュメント

11-3 JSONマージ・パッチを使用したJSON列の更新

11-4 選択したJSONドキュメントの即時更新

12-1 JSONドット表記法の問合せとJSON_VALUEの比較

12-2 JSONドット表記法の問合せとJSON_QUERYの比較

15-1 JSON_EXISTS: フィルタのないパス式

15-2 JSON_EXISTS: パス式のフィルタ内のカレント項目と有効範囲

15-3 JSON_EXISTS: カレント項目に応じたフィルタ条件

15-4 JSON_EXISTS: フィルタの有効範囲の限定

7

Page 8: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

15-5 JSON_EXISTS: 条件を持つパス式を使用したパス式

15-6 JSON_TABLEを使用して表されたJSON_EXISTS

16-1 JSON_VALUE: BOOLEANとしてPL/SQLに戻されるJSONのブール値

16-2 JSON_VALUE: VARCHAR2としてSQLに戻されるJSONのブール値

16-3 JSON_VALUEを使用したJSONデータからのユーザー定義のオブジェクト・インスタンスのインスタンス化

16-4 JSON_VALUEを使用したJSONデータからのコレクション型インスタンスのインスタンス化

16-5 JSON_TABLEを使用して表されたJSON_VALUE

17-1 JSON_QUERYを使用したJSON値の選択

17-2 JSON_TABLEを使用して表されたJSON_QUERY

18-1 等価のJSON_TABLE問合せ: 単純な構文と完全な構文

18-2 等価: SQL NESTEDとLEFT OUTER JOINを指定したJSON_TABLE

18-3 JSONデータに複数回アクセスすることによるデータの抽出

18-4 JSON_TABLEの使用によって複数回の解析が不要なデータの抽出

18-5 JSON配列全体のJSONデータとしての投影

18-6 JSON配列の要素の投影

18-7 JSON配列の要素と他のデータの投影

18-8 JSON_TABLE: NESTEDを使用した配列要素の投影

18-9 JSONデータに対するビューの作成

18-10 JSONデータに対するマテリアライズド・ビューの作成

19-1 JSON_SERIALIZEを使用したBLOBデータのフォーマット出力テキストへの変換

20-1 JSONデータ・ガイドの検索用でない永続的サポートの有効化

20-2 既存のJSON検索索引のJSONデータ・ガイド・サポートの無効化

20-3 JSON検索索引を使用したJSONデータに関する統計情報の収集

20-4 いくつかのJSONフィールド用の優先列名の指定

20-5 GET_INDEX_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成

20-6 JSON_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成

20-7 すべてのスカラー・フィールドを投影するビューの作成

20-8 パス式で対象とされたスカラー・フィールドを投影するビューの作成

8

Page 9: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

20-9 所定の頻度のスカラー・フィールドを投影するビューの作成

20-10 GET_INDEX_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加

20-11 仮想列の非表示および表示での追加

20-12 配列下にないすべてのスカラー・フィールドの仮想列としての投影

20-13 最小頻度のスカラー・フィールドの仮想列としての投影

20-14 最小頻度のスカラー・フィールドの非表示の仮想列としての投影

20-15 JSONフィールドから投影された仮想列の削除

20-16 変更トリガーADD_VCによる仮想列の自動的な追加

20-17 ユーザー定義の変更トリガーを使用したデータ・ガイド更新のトレース

20-18 2015発注書の文書の追加

20-19 2016発注書の文書の追加

20-20 集計関数JSON_DATAGUIDEを使用した複数のデータ・ガイドの作成

20-21 JSON_DATAGUIDEを使用して取得するデータ・ガイドの問合せ

20-22 最小頻度が80%のパスに対する索引データを使用したデータ・ガイドの問合せ

20-23 発注書のフラット・データ・ガイド

20-24 発注書の階層データ・ガイド

21-1 入力値のJSONとしての宣言

21-2 JSON_OBJECTでの名前/値ペアの使用

21-3 JSON_OBJECTでの列名の使用

21-4 JSON_OBJECTでのワイルドカード(*)の使用

21-5 ABSENT ON NULLを指定したJSON_OBJECTの使用

21-6 JSON_OBJECTでのユーザー定義のオブジェクト型インスタンスの使用

21-7 JSON_ARRAYを使用したJSON配列の構成

21-8 JSON_OBJECTAGGを使用したJSONオブジェクトの構成

21-9 JSON_ARRAYAGGを使用したJSON配列の構成

23-1 インメモリーJSONオブジェクトの構成およびシリアライズ

23-2 メソッドGET_KEYS()を使用したオブジェクト・フィールドのリストの取得

23-3 メソッドPUT()を使用したJSON文書の部分的な更新

24-1 GeoJSONデータを使用した表

9

Page 10: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

機能の オブジェクトの インスタンスとしての選択

24-3 GeoJSON機能の複数のgeometryオブジェクトのSDO_GEOMETRYとしての取得

24-4 スカラーGeoJSONデータの空間索引の作成

24-5 GeoJSONジオメトリと空間演算子の使用

24-6 GeoJSONデータに対するマテリアライズド・ビューの作成

24-7 GeoJSONデータに対するマテリアライズド・ビューの空間索引の作成

26-1 JSON_EXISTSのビットマップ索引の作成

26-2 JSON_VALUEのビットマップ索引の作成

26-3 JSONフィールドに対する関数ベースの索引の作成: ドット表記法

26-4 JSONフィールドに対する関数ベースの索引の作成: JSON_VALUE

26-5 JSON_VALUE関数ベースの索引に対するNULL ON EMPTYの指定

26-6 JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用

26-7 リテラル数値と比較したフィールドを対象としたJSON_EXISTS問合せ

26-8 変数値と比較したフィールドを対象としたJSON_EXISTS問合せ

26-9 変数値と比較して数値にキャストされるフィールドを対象としたJSON_EXISTS問合せ

26-10 フィールド比較の論理積を対象としたJSON_EXISTS問合せ

26-11 JSON_VALUE問合せと明示的なRETURNING NUMBER

26-12 JSON_VALUE問合せと明示的な数値変換

26-13 JSON_VALUE問合せと暗黙的な数値変換

26-14 JSONオブジェクト・フィールドの仮想列の作成

26-15 JSONオブジェクト・フィールドのコンポジットBツリー索引の作成

26-16 コンポジット索引を使用して索引が付けられたJSONデータを問い合せる2通りの方法

26-17 JSON検索索引の作成

26-18 JSON検索索引が使用されていることを示す実行計画

26-19 JSONデータの全文問合せ

26-20 検索パターンをエスケープした、JSONデータの全文問合せ

26-21 いくつかの非定型JSON問合せ

27-1 JSONデータのIM列ストアへの移入

24-2 GeoJSON geometry SDO_GEOMETRY

10

Page 12: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

図一覧B-1 json_basic_path_expression

B-2 json_absolute_path_expression

B-3 json_nonfunction_steps

B-4 json_object_step

B-5 json_field_name

B-6 json_array_step

B-7 json_function_step

B-8 json_item_method

B-9 json_filter_expr

B-10 json_cond

B-11 json_conjunction

B-12 json_comparison

B-13 json_relative_path-expr

B-14 json_compare_pred

B-15 json_var

B-16 json_scalar

12

Page 14: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

表一覧5-1 JSONオブジェクト・フィールドの構文例

13-1 型変換項目メソッドとRETURNINGの型の互換性

14-1 JSON_QUERYラッパー句の例

16-1 互換性のあるスカラー・データ型: JSONからSQLへの変換

20-1 データ・ガイドを取得するためのSQLファンクションおよびPL/SQLファンクション

20-2 JSONスキーマ・フィールド(キーワード)

20-3 Oracle固有のデータ・ガイド・フィールド

20-4 いくつかのJSONフィールド列の優先名

20-5 ユーザー定義のデータ・ガイド変更トリガー・プロシージャのパラメータ

24-1 ジオメトリ・コレクション以外のGeoJSONジオメトリ・オブジェクト

14

Page 16: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

Oracle® DatabaseJSON開発者ガイド

19c

F16118-04(原本部品番号:E96227-05)

2020年6月

アプリケーション開発者向けに、Oracle DatabaseでのJSONデータの使用に関する情報を提供します。データベース内のJSONデータの格納、生成、アクセス、検索および索引付けに関するガイドラインと例が記載されています。

タイトルおよび著作権情報

Oracle Database JSON開発者ガイド, 19c

F16118-04

Copyright © 2015, 2020, Oracle and/or its affiliates.

原本著者: Drew Adams

原本協力者: Oracle JSONの開発、製品管理および品質保証チーム

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証は

16

Page 17: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

いたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs (including any operating system, integrated software,any programs embedded, installed or activated on delivered hardware, and modifications of such programs)and Oracle computer documentation or other Oracle data delivered to or accessed by U.S. Government endusers are "commercial computer software" or “commercial computer software documentation” pursuant tothe applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, theuse, reproduction, duplication, release, display, disclosure, modification, preparation of derivative works,and/or adaptation of i) Oracle programs (including any operating system, integrated software, any programsembedded, installed or activated on delivered hardware, and modifications of such programs), ii) Oraclecomputer documentation and/or iii) other Oracle data, is subject to the rights and limitations specified in thelicense contained in the applicable contract.The terms governing the U.S. Government’s use of Oracle cloudservices are defined by the applicable contract for such services.No other rights are granted to the U.S.Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

IntelおよびIntel InsideはIntel Corporationの商標または登録商標です。SPARCのすべての商標は、SPARC International, Inc.のライセンスに基づいて使用される同社の商標または登録商標です。AMD、EpycおよびAMDロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

17

Page 19: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

はじめにこのマニュアルでは、Oracle Databaseに格納されるJSONデータの使用について説明します。データの格納、生成、表示、操作、管理、検索および問合せの方法を対象とします。

対象読者『Oracle Database JSON開発者ガイド』は、Oracle Database上でJSONアプリケーションを構築する開発者を対象としています。

ドキュメントのアクセシビリティについて

関連ドキュメントこの開発者ガイドに関連しているOracleおよび他のリソースが提示されます。

表記規則このドキュメントで使用する表記規則について説明します。

コード例このマニュアルのコード例は、説明のためのみに使用しています。しかし多くの場合、例の一部をコピー・アンド・ペーストし、自分の環境で実行できます。

対象読者『Oracle Database JSON開発者ガイド』は、Oracle Database上でJSONアプリケーションを構築する開発者を対象としています。

このマニュアルを使用するときには、JSONの理解が役立ちます。このマニュアルに示されている多くの例は、SQLまたはPL/SQLで記述されています。これらのうち1つの言語の実用経験があることが前提となります。

親トピック: はじめに

ドキュメントのアクセシビリティについて

19

Page 20: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracleサポートへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

親トピック: はじめに

関連ドキュメントこの開発者ガイドに関連しているOracleおよび他のリソースが提示されます。

Oracle Databaseリリース18cとOracle Databaseリリース18c Enterprise Editionとの使用可能な機能およびオプションの違いについては、『Oracle Database新機能ガイド』を参照してください。このマニュアルでは、Oracle Databaseリリース18cバージョン1の新機能についても説明しています。Oracle Databaseエラー・メッセージ・リファレンスOracle Databaseエラー・メッセージのドキュメントは、HTML形式でのみ提供されています。出力されたまたはPDFのOracleDatabaseドキュメントにのみアクセスできる場合は、エラー・メッセージを範囲で検索できます。特定の範囲を検出した後、Webブラウザの検索機能を使用してメッセージを検索してください。インターネットに接続している場合、Oracle Databaseオンライン・マニュアルのエラー・メッセージ検索機能を使用すると、特定のエラー・メッセージを検索できます。ドキュメント・ストアとして機能するOracle(Simple Oracle Document Access (SODA)の詳細)

Oracle Database概要

『Oracle Database In-Memoryガイド』

Oracle Database SQL言語リファレンス

Oracle Database PL/SQL言語リファレンス

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス

『Oracle Textリファレンス』

『Oracle Textアプリケーション開発者ガイド』

Oracle Database開発ガイド

リリース・ノート、インストール関連ドキュメント、ホワイト・ペーパーまたはその他の関連ドキュメントは、OTN-J(Oracle Technology Network Japan)から、無償でダウンロードできます。OTNを使用するには、オンラインでの登録が必要です。登録は、OTNへの登録から無償で行えます。

20

Page 21: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

すでにOTNのユーザー名およびパスワードを取得している場合は、OTNのドキュメントでOTNWebサイトのドキュメントのセクションに直接接続できます。

その他の情報については、次のサイトを参照してください。

ISO/IEC 13249-2:2000、「Information technology - Database languages - SQL Multimedia andApplication Packages - Part 2: Full-Text」、International Organization For Standardization、2000

親トピック: はじめに

表記規則このドキュメントで使用する表記規則について説明します。

表記規則 意味

太字 太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント 固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

親トピック: はじめに

コード例このマニュアルのコード例は、説明のためのみに使用しています。しかし多くの場合、例の一部をコピー・アンド・ペーストし、自分の環境で実行できます。

JSONデータのフォーマット出力特に長かったり複雑なJSONデータを読みやすくするため、コード例では、出力をフォーマット出力で示す場合があります。

実行計画このマニュアルのコード例には、実行計画を表しているものがあります。これらは、説明のためのみに使用しています。ここで示している例を自分の環境で実行すると、示された内容とは異なる実行計画になる可能性があります。

大/小文字の区別に関する注意JSONでは大/小文字が区別されます。SQLでは大/小文字は区別されませんが、SQLコードで使用される名前は暗黙的に大文字です。

21

Page 22: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

親トピック: はじめに

JSONデータのフォーマット出力特に長かったり複雑なJSONデータを読みやすくするため、コード例では、出力をフォーマット出力で示す場合があります。

親トピック: コード例

実行計画このマニュアルのコード例には、実行計画を表しているものがあります。これらは、説明のためのみに使用しています。ここで示している例を自分の環境で実行すると、示された内容とは異なる実行計画になる可能性があります。

親トピック: コード例

大/小文字の区別に関する注意JSONでは大/小文字が区別されます。SQLでは大/小文字は区別されませんが、SQLコードで使用される名前は暗黙的に大文字です。

このマニュアルの例については、次の点に注意してください。

SQLでは大/小文字が区別されますが、SQLコード内の名前は、二重引用符(")で囲まないかぎり、暗黙的に大文字であるとみなされます。JSONでは大/小文字が区別されます。JSONコード内では大文字と小文字を正確に使い分けてSQL名を表記する必要があります(大文字のSQL名は大文字で記述する必要があります)。

たとえば、SQLで二重引用符を使用せずにmy_tableという名前の表を作成する場合、JSONコードではこの名前をMY_TABLEとして表記する必要があります。

親トピック: コード例

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

22

Page 23: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

『Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点このマニュアルのOracle Databaseの変更点について説明します。

『Oracle Database JSON開発者ガイド』は、Oracle Database 12cリリース2 (12.2.0.1)の新しいマニュアルでした。Oracle Database 12cリリース1 (12.1.0.2)でのJSONデータの使用に関する情報は、Oracle XML DB開発者ガイドで説明しています。

JSON開発者ガイドのOracle Databaseリリース19cバージョン19.1における変更点Oracle Databaseリリース19cバージョン19.1でのJSONサポートと『Oracle Database JSON開発者ガイド』の変更点について説明します。

JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点Oracle Databaseリリース18cバージョン18.1でのJSONサポートと『Oracle Database JSON開発者ガイド』の変更点について説明します。

JSON開発者ガイドのOracle Databaseリリース19cバージョン19.1における変更点Oracle Databaseリリース19cバージョン19.1でのJSONサポートと『Oracle Database JSON開発者ガイド』の変更点について説明します。

新機能このリリースの新機能は次のとおりです。

親トピック: 『Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点

新機能このリリースの新機能は次のとおりです。

23

Page 24: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONのマテリアライズド・ビューのサポートパフォーマンスの拡張: json_tableでON STATEMENTでリフレッシュされるマテリアライズド・ビューを作成し、かつ他の一定の条件に該当する場合は、そのビューを定義する問合せと一致する問合せをマテリアライズド・ビュー表アクセスにリライトできます。複数のファンクション索引を作成するかわりに、この機能を使用できます。

SQLファンクションJSON_MERGEPATCH: JSONドキュメントの宣言的更新新しいSQLファンクションjson_mergepatchを使用して、JSONドキュメントを宣言的に更新できるようになりました。1つの文を使用して、1つ以上の変更を複数のドキュメントに適用できます。この機能により、JSON更新操作の柔軟性が向上します。

GeoJSONデータに対する新しいSQL/JSONファンクションJSON_SERIALIZEおよびJSONデータ・ガイドのサポート新しいSQLファンクションjson_serializeを使用して、JSONデータをテキストまたはUTFエンコードされたBLOBデータにシリアライズできます。SQL集計ファンクションjson_dataguideは、GeoJSON地理データをドキュメント内で検出できるようになりました。これを使用して、このようなデータをSQLデータ型SDO_GEOMETRYとして投影するビューを作成できます。

構文の簡素化SQL/JSONパス式およびファンクションjson_objectによるSQL/JSON生成に対して、構文が簡素化されています。新しいSQL問合せ句NESTEDは、json_tableをLEFT OUTERJOINとともに使用する単純な代替手段を提供します。

JSONデータとSQLオブジェクト型のマッピングこの機能は、JSONデータとユーザー定義のSQLオブジェクト型およびコレクションとの間のマッピングを可能にします。SQL/JSONファンクションjson_valueを使用して、JSONデータをSQLオブジェクト型のインスタンスに変換できます。逆に、SQL/JSONファンクションjson_objectまたはjson_arrayを使用すると、SQLオブジェクト型のインスタンスからJSONデータを生成できます。

親トピック: JSON開発者ガイドのOracle Databaseリリース19cバージョン19.1における変更点

JSONのマテリアライズド・ビューのサポートパフォーマンスの拡張: json_tableでON STATEMENTでリフレッシュされるマテリアライズド・ビューを作成し、かつ他の一定の条件に該当する場合は、そのビューを定義する問合せと一致する問合せをマテリアライズド・ビュー表アクセスにリライトできます。複数のファンクション索引を作成するかわりに、この機能を使用できます。

親トピック: 新機能

SQLファンクションJSON_MERGEPATCH: JSONドキュメントの宣言的更新

24

Page 25: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

新しいSQLファンクションjson_mergepatchを使用して、JSONドキュメントを宣言的に更新できるようになりました。1つの文を使用して、1つ以上の変更を複数のドキュメントに適用できます。この機能により、JSON更新操作の柔軟性が向上します。

関連項目

JSONマージ・パッチによるJSONドキュメントの更新

親トピック: 新機能

新しいSQL/JSONファンクションJSON_SERIALIZEおよびGeoJSONデータJSONデータ・ガイド・サポート新しいSQLファンクションjson_serializeを使用して、JSONデータをテキストまたはUTFエンコードされたBLOBデータにシリアライズできます。SQL集計ファンクションjson_dataguideは、GeoJSON地理データをドキュメント内で検出できるようになりました。これを使用して、このようなデータをSQLデータ型SDO_GEOMETRYとして投影するビューを作成できます。

関連項目

Oracle SQLファンクションJSON_SERIALIZE

JSONデータ・ガイドのフィールド

親トピック: 新機能

構文の簡素化Syntaxは、SQL/JSONパス式およびファンクションjson_objectによるSQL/JSON生成に対して提供されます。新しいSQL問合せ句NESTEDは、json_tableをLEFT OUTER JOINとともに使用する単純な代替手段を提供します。

関連項目

基本的なSQL/JSONパス式の構文

SQL/JSONの生成関数の概要

SQL/JSONファンクションJSON_OBJECT

JSON_TABLEの代替のSQL NESTED句

基本的なSQL/JSONパス式の構文の図

親トピック: 新機能

JSONデータとSQLオブジェクト型のマッピング

25

Page 26: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

この機能は、 データとユーザー定義の オブジェクト型およびコレクションとの間のマッピングを可能にします。SQL/JSONファンクションjson_valueを使用して、JSONデータをSQLオブジェクト型のインスタンスに変換できます。逆に、SQL/JSONファンクションjson_objectまたはjson_arrayを使用すると、SQLオブジェクト型のインスタンスからJSONデータを生成できます。

関連項目

SQL/JSONファンクションJSON_VALUE

JSON_VALUEを使用したユーザー定義オブジェクト型インスタンスのインスタンス化

JSON_VALUEのON MISMATCH句

SQL/JSONファンクションJSON_OBJECT

SQL/JSONファンクションJSON_ARRAY

親トピック: 新機能

JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点Oracle Databaseリリース18cバージョン18.1でのJSONサポートと『Oracle Database JSON開発者ガイド』の変更点について説明します。

新機能このリリースの新機能は次のとおりです。

非推奨となった機能次の機能は、このリリースでは非推奨であり、将来のリリースではサポートされなくなる可能性があります。

親トピック: 『Oracle Database JSON開発者ガイド』の今回のリリースにおける変更点

新機能このリリースの新機能は次のとおりです。

SQL拡張機能複数のSQL拡張機能がデータベース内のJSONデータの格納および問合せ用に提供されています。

シャーディングのサポートJSONデータ用にシャーディングのサポートが拡張されました。

LOB記憶域のパフォーマンスの改善

JSON SQL

26

Page 27: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

LOB記憶域を使用するJSONデータ用にパフォーマンスが改善されました。これは特に、LOBとして格納されているJSON文書全体の読取りおよび書込みを行う一般的なユースケースに影響します。

JSON検索索引の長いフィールド名のサポートJSON検索索引にサポートされる最大JSONフィールド名の長さが255バイトになりました(以前は64バイト)。

親トピック: JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点

SQL拡張機能

複数のSQLの拡張機能がデータベース内のJSONデータの格納および問合せ用に提供されています。

JSONデータを戻すSQL式が指定可能

キーワードAS JSONとともにSQLファンクションtreatをSQL式に適用して、式がJSONデータを戻すように指定できます。これは、結果がJSONデータであることを判定できない場合に便利です。テキストが強制的にJSONデータとして解釈される必要がある場合にも役立ちます。たとえば、これを使用して、文字列としてではなく、空のJSONオブジェクトとして{}のVARCHAR2値を解釈するように指示できます。

関連項目:

Oracle Database SQL言語リファレンス

JSON_VALUE、JSON_QUERYおよびJSON_TABLEのLOB結果

SQL/JSONファンクションjson_valueは、CLOBインスタンスを戻すことができます。

SQL/JSONファンクションjson_queryは、CLOBまたはBLOBインスタンスを戻すことができます。BLOBの結果はAL32UTF8文字セットです。

前述のように、json_table列のデータ型は、列がFORMAT JSONとして指定されているかどうかによって異なります。指定されている場合はjson_query戻り型がサポートされ、それ以外の場合はjson_value戻り型がサポートされています。

以前のサポート内容は、次のとおりです。:

json_valueでは、VARCHAR2、NUMBER、DATE、TIMESTAMP、TIMESTAMP WITH TIMEZONEおよびSDO_GEOMETRYのみが

戻り型としてサポートされていました。

27

Page 28: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_queryでは戻り型としてVARCHAR2のみがサポートされていました。

関連項目:

Oracle Database SQL言語リファレンス

SQL/JSON生成関数の拡張機能

オプションのキーワードSTRICTが追加されました。宣言されている入力、またはJSONデータであることが想定された入力がある場合、整形式のJSONデータかどうかがチェックされて確認されます。これらのいずれかが整形式でない場合、エラーが発生します。(キーワードFORMAT JSONを使用するか、キーワードAS JSONともにSQLファンクションtreatを使用して、入力がJSONであることを宣言できます。is json制約を持つ表の列からの入力であるか、入力が別のJSON生成関数の出力である場合、入力はJSONであると想定されます。)

SQL/JSON生成関数(json_object、json_array、json_objectagg、json_arrayagg)は、CLOBまたはBLOBインスタンスを戻すことができます。BLOBの結果はAL32UTF8文字セットです。

生成関数への入力式は、次のSQLデータ型(NUMBER、VARCHAR2、DATE、TIMESTAMPに加えて)のいずれかにすることができます。

BINARY_DOUBLE

BINARY_FLOAT

CLOB

BLOB

NVARCHAR2

RAW

TIMESTAMPWITHTIMEZONE

TIMESTAMPWITHLOCALTIMEZONE

INTERVALYEARTOMONTH

INTERVALDAYTOSECOND

生成した結果がJSONでどのように表示されるかは、入力のデータ型によって異なります。

関連項目:

SQL/JSON生成関数の入力値の処理

Oracle Database SQL言語リファレンス

28

Page 29: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSONパス式の項目メソッド

次の新規項目メソッドが追加されました: numberOnly()、stringOnly()、boolean()booleanOnly()、size(),およびtype()です。

名前に"only"が含まれるデータ型の変換メソッドは、"only"が含まれない名前の対応するメソッドと同じです。前者は、特定の型であるJSON値(numberなど)のみを関連のSQLデータ型(NUMBERなど)に変換する点が異なります。名前に"only"が含まれないメソッドは、任意のJSON値を指定したSQLデータ型に変換できます。

すべての項目メソッドが、SQL/JSONファンクションjson_value、json_queryおよびjson_table(列)のパス式で使用できるようになりました。Oracle Database 12cリリース2(12.2.0.1)では、項目メソッドはSQL/JSON条件json_existsのパス式でのみ使用できました。項目メソッドstring()は、(VARCHAR2に加えて) CLOBまたはBLOBを戻すことができるようになりました。デフォルトは、VARCHAR2(4000)です。

関連項目:

SQL/JSONパス式の項目メソッド

JSONデータ・ガイドの拡張機能

Oracle SQL集計関数json_dataguideは、オプションのフォーマット引数を受け入れます。

キーワードFORMATを引数DBMS_JSON.FORMAT_HIERARCHICALとともに指定すると、階層データ・ガイドを返すことができます。

キーワードPRETTYを引数DBMS_JSON.PRETTYとともに指定すると、返されたデータ・ガイドの整形出力(読みやすくするためのインデント)を指定できます。

新しいデータ・ディクショナリ・ビューを使用できます。これにより、データ・ガイド対応の検索索引(USER_JSON_DATAGUIDE_FIELDS、ALL_JSON_DATAGUIDE_FIELDS、DBA_JSON_DATAGUIDE_FIELDS)で、個々のJSONオブジェクト・フィールドに記録されたデータ・ガイド情報が表示されます。(これらは、USER_JSON_DATAGUIDES、ALL_JSON_DATAGUIDES、DBA_JSON_DATAGUIDESビューに加えて、データ・ガイド対応の検索索引でJSON列を含む表を示します。)

スカラー値の配列が含まれるJSON文書の場合、データ・ガイドはスカラー型とARRAY型を記録します。[*]を配列用に記録されたパスに追加することにより、スカラー値用に記録されたパスは、フラット・データ・ガイドに示されます。

29

Page 30: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目:

Oracle Database SQL言語リファレンス

JSON列の存在を記録するデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューのUSER_JSON_COLUMNS、ALL_JSON_COLUMNSおよびDBA_JSON_COLUMNSは、JSONデータの列を含むビューおよび表を示します。

関連項目:

ALL_JSON_COLUMNSおよび関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください

SQL/JSONファンクションのJSON_TABLE構文

json_tableの構文は、次のようにいくつかの一般的なユースケース用に簡略化することにより、拡張されました。

パス式のかわりに単純なドット表記法構文を使用できるようになりました。

列は、JSONオブジェクト・フィールドから投影される場合、および列がフィールドと同じ名前である場合、そのオブジェクトにパス式を指定する必要はありません。パスには列名から推測されます。

関連項目:

Oracle Database SQL言語リファレンス

JSON_TABLEのマテリアライズド・ビューのON STATEMENTのサポート

json_table問合せを使用してマテリアライズド・ビューを作成するときに、キーワードONSTATEMENTを使用できるようになりました。ON COMMITのかわりにON STATEMENTを使用することは、ビューが元表に対してDML文ごとに自動的に同期されることを意味します。

新しいSQLファンクションTO_UTC_TIMESTAMP_TZ

SQLファンクションto_UTC_timestamp_tzは、入力としてISO 8601の日付フォーマット文字列を受け取り、SQLデータ型TIMESTAMP WITH TIMEZONEのインスタンスを戻します。入力はUTC時間(協定世界時、以前はグリニッジ標準時)に正規化されます。SQLファンクションto_timestamp_tzとは異なり、新しいファンクションでは入力文字列がISO 8601日付形式を使用して、タイムゾーンをUTC 0にデフォルト設定すると想定しています。

30

Page 31: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

このファンクションの一般的な使用方法として、SQLファンクションsys_extract_UTCにその出力を提供し、UTC時間を取得してこれをSQLバインド変数としてSQL/JSON条件json_existsに渡し、タイムスタンプ範囲の比較を実行します。

関連項目:

ISO 8601 (ISO日付形式の詳細)

新しいOracle SQL条件JSON_EQUAL

2つのJSON値が等しい場合は、Oracle SQL条件json_equalはこれらを比較してtrueを戻し、それ以外の場合はfalseを戻します。この比較では、無意味な空白および無意味なオブジェクト・メンバーの順序は無視されます。たとえば、JSONオブジェクトに同じメンバーがある場合、その順序に関係なく、これらのオブジェクトは等しくなります。ただし、2つの比較されたオブジェクトのいずれかに1つ以上のフィールドの重複がある場合、json_equalによって戻される値は特定されません。

関連項目

列にJSONデータが必然的に含まれるかどうかの確認

基本的なSQL/JSONパス式の構文

永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー

親トピック: 新機能

シャーディングのサポートJSONデータのシャーディングのサポートが拡張されました。

サポートされている内容は次のとおりです。

ユーザー管理かシステム管理かに関係なく、シャーディングされた表のJSON検索索引。

SQLとPL/SQLからCLOBまたはBLOBとして戻されるJSONデータ用のクロスシャード(およびシャード内)問合せ。これには、SQL/JSONファンクションjson_tableを使用して、CLOBおよびBLOB列へのJSONデータの投影が含まれています。

SQL/JSONファンクションおよび条件を使用する、クロスシャード問合せにおける個別のシャードの評価。これは、次のように使用されます。

SELECT句の関数json_valueおよび集計関数json_dataguide

FROM句の関数json_table

WHERE句の関数json_value、および条件json_existsとjson_textcontains。

31

Page 32: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

チャンク移行中の元表および索引の記憶域表パーティションの自動再配置。

関連項目:

Oracle Shardingの使用

親トピック: 新機能

LOB記憶域のパフォーマンスの改善LOB記憶域を使用するJSONデータに対するパフォーマンスが改善されました。これは特に、LOBとして格納されているJSON文書全体の読取りおよび書込みを行う一般的なユースケースに影響します。

親トピック: 新機能

JSON検索索引の長いフィールド名のサポートJSON検索索引に対してサポートされている最大JSONフィールド名の長さが255バイトになりました(以前は64バイトでした)。

ノート: 名前が64バイトを超えるオブジェクト・フィールドが含まれるJSONデータを索引付けする場合、Oracle Database 18cより前に作成された任意のJSON検索索引およびOracle Text索引を再構築する必要があります。詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。

関連項目

Oracle DatabaseのJSONに関する制限事項

親トピック: 新機能

非推奨となった機能次の機能は今回のリリースで非推奨となり、今後のリリースではサポートされない可能性があります。

数値(0または1)としてブール型のJSON値を戻すSQL/JSONファンクション。VARCHAR2またはBOOLEANとして(PL/SQLのみ)値を戻しますが、NUMBERとして戻されません。SQL数値が必要な場合は、SQL DECODEまたはCASE WHENを使用してVARCHAR2値から0または1を取得できます。

親トピック: JSON開発者ガイドのOracle Databaseリリース18cバージョン18.1における変更点

32

Page 34: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第I部 JSONデータおよびOracleDatabaseの概要JSONデータについてと、SQLおよびPL/SQLをOracle Databaseに格納されたJSONデータと一緒に使用する方法についての概要を説明します。

JSONドキュメント形式の、永続的なアプリケーション・データに基づいたスキーマレスな開発を行うことで、変化するアプリケーション要件に迅速に対応できます。使用されている記憶域スキーマを変更することなく、アプリケーションを変更および再デプロイできます。

SQLおよびリレーショナル・データベースによって、複雑なデータ分析やレポートに対する柔軟なサポートと、強固なデータ保護およびアクセス制御が提供されます。これは、過去にJSONを使用したスキーマレス開発と関連付けらることの多かったNoSQLデータベースには、通常、当てはまりません。

Oracle Databaseでは、SQLおよびリレーショナル・データベースのすべてのメリットがJSONデータに提供されるため、他の種類のデータベース・データと変わらない方法および確実さでデータの格納および操作を行うことが可能です。

Oracle DatabaseにおけるJSONの概要Oracle Databaseは、トランザクション、索引付け、宣言的問合せおよびビューを含むリレーショナル・データベースの機能を使用してJavaScript Object Notation (JSON)データをネイティブにサポートしています。

JSONデータJavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。

34

Page 36: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

1 Oracle DatabaseのJSONOracle Databaseは、トランザクション、索引付け、宣言的問合せおよびビューを含むリレーショナル・データベースの機能を使用してJavaScript ObjectNotation (JSON)データをネイティブにサポートしています。

このマニュアルでは、Oracle Databaseに格納されたJSONデータを扱うためのデータベース言語および機能の使用について取り上げます。特に、SQLおよびPL/SQLとJSONデータの連携方法について説明します。

ノート: Oracleでは、データベース内に格納されたJSONデータへのアクセス用に、Simple Oracle Document Access (SODA) APIファミリも提供しています。SODAは、リレーショナル・データベース機能やSQLおよびPL/SQLなどの言語に関する知識を使用しないスキーマレス・アプリケーション開発向けに設計されています。データベースで文書がどのように格納されているかを把握しなくても、文書コレクションのOracleDatabaseでの作成および格納や、それらの文書の取得および問合せの実行を可能にします。次のように、いくつかの種類のSODAの実装があります。

SODA for REST — HTTPコールを実行できる任意の言語を使用して、Representational State Transfer (REST)のリクエストでは、コレクションおよび文書操作を実行します。SODA for Java — Javaクラスおよびインタフェースは、データベース、コレクションおよび文書を表します。SODA for PL/SQL — PL/SQLオブジェクト型は、コレクションおよび文書を表します。SODA for C — Oracle Call Interface (OCI)のハンドルは、コレクションおよび文書を表します。

SODAの詳細は、ドキュメント・ストアとして機能するOracleを参照してください。

Oracle DatabaseにおけるJSONの概要

36

Page 37: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Databaseは、トランザクション、索引付け、宣言的問合せおよびビューを含むリレーショナル・データベースの機能を使用してJSONをネイティブにサポートしています。リレーショナル・データとは異なり、データを定義するスキーマを必要とせずに、JSONデータをデータベース内に格納したり、索引付けおよび問合せを行うことができます。

Oracle DatabaseでJSONを使用する前に一般的に、Oracle DatabaseでJSONデータを扱う場合に実行するタスクには、(1)is jsonチェック制約を使用したJSON列の作成、(2)列へのJSONデータの挿入、(3)JSONデータの問合せがあります。

JSONに対するOracle DatabaseのサポートJavaScript Object Notation (JSON)に対するOracle Databaseのサポートは、リレーショナル記憶域の使用範囲とJSONデータの問合せの使用範囲のベスト・フィットを実現することにより、リレーショナル問合せとJSON問合せを互いに連携して機能させることを目指しています。Oracle SQL/JSONサポートは、SQL標準のJSONサポートと密接に連携しています。

親トピック: JSONデータおよびOracle Databaseの概要

1.1 Oracle DatabaseにおけるJSONの概要Oracle Databaseは、トランザクション、索引付け、宣言的問合せおよびビューを含むリレーショナル・データベースの機能を使用してJSONをネイティブにサポートしています。リレーショナル・データとは異なり、データを定義するスキーマを必要とせずに、JSONデータをデータベース内に格納したり、索引付けおよび問合せを行うことができます。

(JSONデータは、それを格納する表および列を定義するためにデータベース・スキーマが使用されている場合であっても、スキーマレスとなります。そのスキーマにはJSONデータ自体の構造は指定されていません。)

多くの場合、JSONデータは、Oracle NoSQL DatabaseおよびOracle Berkeley DBなどのNoSQLデータベースに格納されています。これらを使用すると、スキーマに基づいていないデータを格納および取得できますが、これらにはリレーショナル・データベースの厳密な整合性モデルは用意されていません。

このような短所を補うために、場合によっては、NoSQLデータベースと並行してリレーショナル・データベースが使用されます。したがって、NoSQLデータベースに格納されたJSONデータを使用するアプリケーションでは、データの整合性をそれ自体で確保する必要があります。

JSONがOracle Databaseでネイティブにサポートされることで、このような負荷を未然に防ぐことができます。トランザクション、索引付け、宣言的問合せ、ビューなどの、JSONで使用するためのリレーショナル・データベース機能のメリットすべてを利用できます。

構造化問合せ言語(SQL)を使用したデータベース問合せは宣言的です。Oracle Databaseでは、SQLを使用してJSONデータをリレーショナル・データに結合できます。また、JSONデータを

37

Page 38: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

リレーショナルに投影できるため、JSONデータはリレーショナルなプロセスおよびツールで使用できるようになります。さらに、Oracle Databaseの外部で外部表に格納されたJSONデータをデータベース内で問い合せることもできます。

データベースに格納されたJSONデータには、Oracle Call Interface (OCI)、Java Database Connectivity(JDBC)などの、他のデータベース・データへのアクセスと同じ方法でアクセスできます。

JSON言語標準では、JSONデータはテキスト形式で定義されます。標準構文ではUnicode文字で構成されます。Oracle Databaseでは、一般的なSQLデータ型VARCHAR2、CLOBおよびBLOBを使用して、JSONデータを未解析文字データとしてテキスト形式で格納できます。

列値が有効なJSONインスタンスであることを保証するために、常にis_jsonチェック制約を使用することをお薦めします例4-1を参照してください。

データベース表のJSON列

Oracle Databaseでは、JSON文書の格納に使用される表に制限はありません。JSON文書が含まれる列は、他のどんな種類のデータベース・データとも共存させることができます。1つの表に、JSON文書が含まれる複数の列を含めることも可能です。

Oracle DatabaseをJSONのドキュメント・ストアとして使用する場合、JSON列が含まれる表には、通常、JSON以外のハウスキーピング列がいくつか含められます。これらは、通常JSON文書に関するメタデータをトラッキングします。

JSONを使用して、主にリレーショナル・アプリケーションに柔軟性を追加する場合、いくつかの表にはJSON文書用の列も作成されることが考えられます。これらの列は、リレーショナル・モデルに直接マッピングされないアプリケーション・データの管理のために使用されます。

定義上、テキストのJSONデータは、Unicodeエンコーディング(UTF-8またはUTF-16)を使用してエンコードされます。非Unicode文字セットで格納されたテキスト・データはJSONデータであるかのように使用できますが、この場合、この文字セットはデータの処理時に自動的にUTF-8に変換されます。

JSONデータでのSQLの使用

SQLでは、特別な関数や条件または単純なドット表記法を使用して、Oracle Databaseに格納されたJSONデータにアクセスできます。ほとんどのSQLファンクションおよび条件はSQL/JSONの標準に属していますが、一部はOracleに固有のものです。

SQL/JSON問合せファンクションjson_value、json_queryおよびjson_table。

これらは、SQL/JSONパス式をJSONデータに対して評価し、SQL値を生成します。Oracle SQL条件json_textcontains、およびSQL/JSON条件json_exists、isjson、is not json。

38

Page 39: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

条件json_existsでは、特定のJSONデータが存在するかどうかがチェックされます。json_textcontainsでは、JSONデータの全文問合せを実行できます。is jsonおよびis not jsonでは、特定のJSONデータが整形式であるかどうかがチェックされます。

json_existsおよびjson_textcontainsでは、SQL/JSONパス式と一致するデータがチェックされます。問合せファンクションjson_valueとjson_queryを組み合せたような動作の単純なドット表記法。

これは、SQLオブジェクト・アクセス式、つまり抽象データ型(ADT)の属性ドット表記法に似ています。これが、データベースのJSONデータを問い合せる最も簡単な方法です。

SQL/JSONの生成関数であるjson_object、json_array、json_objectaggおよびjson_arrayagg。

これらは、JSONオブジェクトおよび配列データを(SQL値として)生成するためにSQLデータを集めます。Oracle SQL条件json_equal: 2つのJSON値が同じかどうかをテストします。

Oracle SQL集計関数json_dataguide。

これにより、データ・ガイドであるJSONデータが生成され、これを使用してデータベース内の他のJSONデータの構造およびコンテンツに関する情報を検出できます。

問合せのシンプルな例として、表j_purchaseorder(ここでは、poの別名を使用)のJSON列po_documentに格納された文書のドット表記法の問合せを次に示します。これは、すべての発注書の要求者を取得します(JSONフィールドRequestor)。

SELECT po.po_document.Requestor FROM j_purchaseorder po;

JSONデータでのPL/SQLの使用

SQLコードまたはJSON用のPL/SQLオブジェクト型を使用して、PL/SQLコード内でJSONデータを操作できます。(PL/SQLで使用するSQLコード内では、空のJSONフィールド名は使用できません)

組込みのPL/SQLファンクションとして、SQLファンクションおよび条件json_value、json_query、json_object、json_array、json_exists、is json、isnot jsonおよびjson_equalも使用できます。

BOOLEANデータ型がないOracle SQLの場合と異なり、PL/SQLでは、次のようになります。

json_exists、is json、is not jsonおよびjson_equalは、ブール関数です。

コピー

39

Page 40: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_valueは、BOOLEAN値を返すことができます。

JSON向けのPL/SQLオブジェクト型もあり、インメモリーJSONデータの細かい構成および操作に使用できます。テキストのJSONデータに戻って、イントロスペクション、変更およびシリアライズを行えます。

関連項目

JSONデータに対する単純なドット表記法アクセス

SQL/JSONパス式の概要

JSONデータ・ガイド

JSONに対するOracle Databaseのサポート

JSONデータの文字セットおよび文字エンコーディング

JSON用のPL/SQLオブジェクト型

JSONデータの格納および管理の概要

親トピック: Oracle DatabaseのJSON

1.2 Oracle DatabaseでJSONを使用する前に一般的に、Oracle DatabaseでJSONデータを扱う場合に実行するタスクには、(1)is jsonチェック制約を使用したJSON列の作成、(2)列へのJSONデータの挿入、(3)JSONデータの問合せがあります。

1. 主キー列とJSON列がある表を作成し、JSON列に整形式のJSONデータのみを確実に含めるためにis jsonチェック制約を追加します。

次の文では、主キーidとJSON列po_documentがある表j_purchaseorderを作成しています(例4-1も参照)。

CREATE TABLE j_purchaseorder

(id VARCHAR2 (32) NOT NULL PRIMARY KEY, date_loaded TIMESTAMP (6) WITH TIME ZONE,

po_document VARCHAR2 (32767) CONSTRAINT ensure_json CHECK (po_document IS JSON));

2. Oracle Databaseで使用可能な任意のメソッドを使用してJSON列にJSONデータを挿入します。

コピー

40

Page 41: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

次の文では、SQL INSERT文を使用して、いくつかの単純なJSONデータを表j_purchaseorderの3つ目の列(これが列po_document。前を参照)に挿入します。ここでは、一部のJSONデータが省略されています(...)。これらの詳細は、例4-2を参照してください。

INSERT INTO j_purchaseorder

VALUES (SYS_GUID(),

to_date('30-DEC-2014'),

'{"PONumber" : 1600,

"Reference" : "ABULL-20140421",

"Requestor" : "Alexis Bull",

"User" : "ABULL",

"CostCenter" : "A50",

"ShippingInstructions" : {...},

"Special Instructions" : null,

"AllowPartialShipment" : true,

"LineItems" : [...]}');

3. JSONデータを問い合せます。戻り値は常に、JSON値を表すVARCHAR2インスタンスです。ここでは、単純な例をいくつか示します。

次の問合せでは、JSON列po_document内の各文書から、スカラー値(JSON列po_document内のオブジェクトのフィールドPONumberの値であるJSON数値)を抽出しています(例12-1も参照)。

SELECT po.po_document.PONumber FROM j_purchaseorder po;

次の問合せでは、各文書から、JSON電話オブジェクトの配列(フィールドShippingInstructionsの値のオブジェクトのフィールドPhoneの値)を抽出しています(例12-2も参照)。

SELECT po.po_document.ShippingInstructions.Phone FROM j_purchaseorder po;

コピー

コピー

コピー

41

Page 42: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

次の問合せでは、各文書から、複数の値(配列Phone内の各オブジェクトのフィールドtypeの値)を配列として抽出しています。戻される配列は、格納されているデータの一部ではありませんが、問合せによって自動的に構成されます。(配列要素の順序は指定されません。)

SELECT po.po_document.ShippingInstructions.Phone.type FROM j_purchaseorder po;

関連項目

JSON列を含む表の作成

JSONデータに対する単純なドット表記法アクセス

親トピック: Oracle DatabaseのJSON

1.3 JSONに対するOracle DatabaseのサポートJavaScript Object Notation (JSON)に対するOracle Databaseのサポートは、リレーショナル記憶域の使用範囲とJSONデータの問合せの使用範囲のベスト・フィットを実現することにより、リレーショナル問合せとJSON問合せを互いに連携して機能させることを目指しています。OracleSQL/JSONサポートは、SQL標準のJSONサポートと密接に連携しています。

関連項目:

ISO/IEC 9075-2:2016, Information technology--Database languages--SQL--Part 2: Foundation(SQL/Foundation)

ISO/IEC TR 19075–6

Oracle Database SQL言語リファレンス

JSON.org

ECMAインターナショナル

親トピック: Oracle DatabaseのJSON

コピー

42

Page 44: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

2 JSONデータJavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。

JSONの概要JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。

JSON構文およびJSON構文が表すデータJSON (およびJavaScript)の値、スカラー、オブジェクトおよび配列について説明します。

XMLと比較したJSON一般的に、JSONとXML (Extensible Markup Language)は両方ともデータ交換言語として使用されます。主な違いは次のとおりです。

親トピック: JSONデータおよびOracle Databaseの概要

2.1 JSONの概要JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。

JSONは、JavaScriptのオブジェクト・リテラル表記法のサブセットであるとも言えます。JSONは、JavaScriptのオブジェクト・リテラルを表すために使用できるため、一般的にデータ交

換言語として機能します。この点において、XMLとよく似ています。

JSONは、JavaScript表記法(のサブセットとも言える表記法)であるため、多くの場合、解析やシリアライズを行う必要なくJavaScriptプログラムで使用できます。これは、JavaScriptのオブジェク

注1

44

Page 45: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ト・リテラル、配列およびスカラー・データを表すテキスト・ベースの方法です。

JSONは、JavaScriptのコンテキストで定義されているため、実際には言語に依存しないデータ・フォーマットです。JSONデータは様々なプログラミング言語で解析および生成できます。

JSONは、人間にとっては読み書きが比較的簡単であり、ソフトウェアにとっては解析および生成が簡単です。多くの場合、構造化されたデータをシリアライズし、通常はサーバーとWebアプリケーション間でネットワークを介して交換するために使用されます。

関連項目:

JSONデータ交換フォーマットの定義については、『ECMA 404』および『IETF RFC4627』を参照してくださいECMAScript言語仕様については、『ECMA 262』を参照してください

JSONの詳細は、JSON.orgを参照してください

親トピック: JSONデータ

2.2 JSON構文およびJSON構文が表すデータJSON (およびJavaScript)の値、スカラー、オブジェクトおよび配列について説明します。

JSONの値は、オブジェクト、配列、数値、文字列、ブール値(trueまたはfalse)またはnullのいずれかです。オブジェクトおよび配列を除くすべての値はスカラーです。

ノート: JSON値のnullは、SQLに関するかぎり、1つの値です。これは、SQLで値の欠如(存在しないデータ、不明なデータまたは適用できないデータ)を表すNULLとは異なります。特に、SQL条件のIS NULLは、JSONのnull値に対してfalseを戻し、SQL条件のIS NOT NULLはtrueを戻します。

JavaScriptオブジェクトは、プロパティ名と関連するJSON値の0(ゼロ)個以上のペアの連想配列(ディクショナリ)です。 JSONオブジェクトは、JavaScriptオブジェクト・リテラルです。 これは、中括弧({、})で囲まれたプロパティ・リストで、カンマ(,)区切りの名前/値ペアと、各ペアがコロン(:)で区切られた名前と値が含まれます。(カンマまたはコロンの前後のホワイトスペースはオプションで、重要ではありません。)

JSONでは、各プロパティ名および各文字列値は、二重引用符(")で囲む必要があります。JavaScript表記法では、オブジェクト・リテラルで使用されるプロパティ名は、二重引用符で囲むことができますが、必須ではありません。これはまた、一重引用符(')で囲むこともできます。

こうした違いの結果、実際には、引用符で囲まれていないプロパティ名か一重引用符で囲まれた

Foot 2 Foot 3

45

Page 46: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

プロパティ名を使用して表されたデータが、JSONで表されているように緩やかに参照される場合があり、Oracle Database実装を含む一部のJSON実装では、引用符で囲まれていないプロパティ名も、一重引用符で囲まれたプロパティ名も使用できる緩慢な構文がサポートされます。

JSONの文字列は、バックスラッシュ(\)によるエスケープを使用したUnicode文字で構成されています。JSONの数値(数字)は10進数表記法で表され、符号が付いている場合や10進数指数が含まれる場合があります。

オブジェクト・プロパティは、通常フィールドと呼ばれます。これがキーと呼ばれることもありますが、「キー」という言葉の他の使用方法と混同することを避けるために、このマニュアルでは基本的に「フィールド」を使用します。オブジェクト・プロパティの名前/値ペアは、よくオブジェクトのメンバーと呼ばれます(ただし、メンバーは単にプロパティを意味する場合もあります)。オブジェクト・メンバー間の順序は重要ではありません。

ノート:

JSONフィールド名は空(""と記述される)にできます。

特定のJSONオブジェクトの各フィールド名は必ずしも一意である必要はなく、同じフィールド名を繰り返し使用できます。Oracle Databaseで採用されているSQL/JSONパスの評価では常に、特定のフィールド名を持つオブジェクト・メンバーの1つのみが使用されます。同じ名前を持つ他のメンバーは無視されます。このような複数のメンバーのうちどれが使用されるかは指定されていません。JSONオブジェクトの一意フィールドと重複フィールドを参照してください。

JavaScript配列には、0個以上の要素があります。JSON配列は、配列要素(項目とも呼ばれる)の表現を囲む大カッコ([、])で表されます。各要素はカンマ(,)で区切られたオブジェクト、配列またはスカラー値です。配列要素の順序には意味があります。(大カッコまたはカンマの前後のホワイトスペースはオプションで、重要ではありません。)

例2-1 A JSONオブジェクト(JavaScriptのオブジェクト・リテラルの表現)

この例は、発注書を表すJSONオブジェクトを示しており、最上位のフィールド名はPONumber、Reference、Requestor、User、Costcenter、ShippingInstruction、Special Instructions、AllowPartialShipmentおよびLineItemsです。

{ "PONumber" : 1600, "Reference" : "ABULL-20140421", "Requestor" : "Alexis Bull", "User" : "ABULL", "CostCenter" : "A50", "ShippingInstructions" : { "name" : "Alexis Bull", "Address": { "street" : "200 Sporting

Foot 4

コピー

46

Page 47: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Green",

"city" : "South San Francisco",

"state" : "CA", "zipCode" : 99236, "country" : "United States of America" },

"Phone" : [ { "type" : "Office", "number" : "909-555-7307" }, { "type" : "Mobile", "number" : "415-555-1234" } ] }, "Special Instructions" : null, "AllowPartialShipment" : false, "LineItems" : [ { "ItemNumber" : 1, "Part" : { "Description" : "One Magic Christmas",

"UnitPrice" : 19.95,

"UPCCode" : 13131092899 },

"Quantity" : 9.0 }, { "ItemNumber" : 2, "Part" : { "Description" : "Lethal Weapon",

"UnitPrice" : 19.95,

"UPCCode" : 85391628927 },

"Quantity" : 5.0 } ] }

この例のほとんどのフィールドには文字列値があります。たとえば、フィールドUserには値"ABULL"があります。

フィールドPONumberおよびzipCodeにはそれぞれ数値1600および99236があります。

フィールドShippingInstructionsには値としてオブジェクトがあります。このオブジェクトには、フィールドname、AddressおよびPhoneを持つ3つのメンバーがあります。フィールドnameには文字列値("Alexis Bull")があります。

フィールドAddressの値は、フィールドstreet、city、state、zipCodeおよびcountryを持つオブジェクトです。フィールドzipCodeには数値があります。他のフィ

47

Page 48: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ールドには文字列値があります。フィールドPhoneには値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドtypeおよびnumberの2つのメンバーとそれらの値があります。

フィールドSpecial Instructionsにはnull値があります。

フィールドAllowPartialShipmentにはブール値falseがあります。

フィールドLineItemsには値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドItemNumber、PartおよびQuantityを持つ3つのメンバーがあります。

フィールドItemNumberおよびQuantityには数値があります。フィールドPartには値として、フィールドDescription、UnitPriceおよびUPCCodeを持つオブジェクトがあります。フィールドDescriptionには文字列値があります。フィールドUnitPriceおよびUPCCodeには数値があります。

関連項目

厳密なJSON構文と緩慢なJSON構文について

関連項目:

例4-2

親トピック: JSONデータ

2.3 XMLと比較したJSON一般的に、JSONとXML (Extensible Markup Language)は両方ともデータ交換言語として使用されます。主な違いは次のとおりです。

JSONは、単純な構造データで使用する場合に最も役立ちます。XMLは、構造化されたデータと半構造化されたデータの両方で役立ちます。通常、JSONは文書中心ではなくデータ中心ですが、XMLはどちらにも対応しています。JSONはマークアップ言語ではなく、データ表現のみを目的として設計されています。XMLは、文書マークアップ言語とデータ表現言語の両方を兼ねています。

JSONのデータ型は数が少なく、事前に定義されています。XMLデータは、型がないか、XML SchemaまたはDocument Type Definition (DTD)に基づいています。JSONには、単純な構造定義および文書結合構造体がありますが、属性、名前空間、継承および代替はありません。JavaScriptのオブジェクト・リテラルのメンバーの順序は重要ではありません。通常、順序が

48

Page 49: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

問題になるのはXML文書内です。JSONには、XMLのテキスト・ノード(XPathノード・テストtext())に相当するものがありません。これは、特に混在コンテンツがないことを意味します(このことからも、JSONはマークアップ言語ではないと言えます)。JSONには、日付のデータ型がありません(XMLとJavaScriptにはある)。JSONでは、日付は文字列などの使用可能なデータ型を使用して表されます。日付とJSON文字列間における変換には、事実上の業界標準がいくつかあります。ただし、いずれにせよ、JSONを使用するプログラムでは日付表現の変換を処理する必要があります。

通常、JSONデータの方がXMLデータより、定義および機能が単純であるため、生成、解析および処理が簡単です。XMLにはモジュール性と継承の役に立つ名前空間および他の構造体が用意されているため、通常、様々なデータ・ソースの結合が関わるユースケースはXMLの使用に適しています。

親トピック: JSONデータ

脚注の凡例

脚注1:

JSONはこの点においてJavaScriptとは表記法が異なります。JSONでは、文字列内でエスケープされていないUnicode文字U+2028 (LINE SEPARATOR)およびU+2029 (PARAGRAPH SEPARATOR)が許可されます。JavaScriptの表記法では、文字列内でこのような制御文字をエスケープする必要があります。JSONP (JSON with padding)データを生成するときにこの違いが重要になる場合があります。

脚注2:

したがって、JavaScriptオブジェクトは、CおよびC++のハッシュ表、JavaのHashMap、PHPの連想配列、Pythonのディクショナリ、PerlおよびRubyのハッシュと似ています。

脚注3:

コンストラクタObjectまたはオブジェクト・リテラル構文{...}を使用してJavaScriptでオブジェクトが作成されます。

脚注4: 一部のコンテキストでは、空のフィールド名はOracle Databaseと一緒には使用できません。使用する場合は必ず、名前を二重引用符で囲む必要があります。

49

Page 51: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第II部 JSONデータの格納および管理ここでは、データベース表でのJSON列の作成、このような表のパーティション化、Oracle GoldenGateを使用したレプリケーション、JSONデータの文字セット・エンコーディングについて取り上げます。また、列のデータが整形式のJSONデータであることを確認するためのチェック制約としての、SQL/JSON条件is jsonの使用についても説明します。

JSONデータの格納および管理の概要この概要では、(1) JSON列のデータ型、(2) JSONデータ向けのLOB記憶域の考慮事項、(3)JSON列に整形式のJSONデータが格納されていることの確認、について説明します。

JSON列を含む表の作成JSON列を持つ表を作成できます。SQL条件is jsonをチェック制約として使用して、列に挿入されるデータが(整形式の)JSONデータになるようにします。JSONデータを対象とした列を作成する場合は常にis_jsonチェック制約を使用することをお薦めします。

SQL/JSON条件IS JSONおよびIS NOT JSONSQL/JSON条件is jsonおよびis not jsonは補足的な条件です。これらは、引数が構文的に正しい(つまり、整形式の)JSONデータかどうかをテストします。これらは、SELECT文のCASE式またはWHERE句で使用できます。is jsonはチェック制約で使用できます。

JSONデータの文字セットおよび文字エンコーディングテキストのJSONデータでは常にUnicode文字セットが使用されます。この点で、JSONデータの方がXMLデータより簡単に使用できます。これは、JSONデータ交換フォーマットの重要な部分です(RFC 4627)。Oracle Databaseで処理されるJSONデータでは、必要な文字セットの変換が自動的に行われます。

JSONデータのパーティション化JSON仮想列をパーティション化キーとして使用して、表をパーティション化できます。仮想列は、SQL/JSONファンクションjson_valueを使用してJSON列から抽出されます。

JSONデータのレプリケーション

51

Page 52: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle GoldenGateを使用して、JSONデータが格納された列を持つ表をレプリケートできます。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

52

Page 53: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

3 JSONデータの格納および管理の概要この概要では、(1) JSON列のデータ型、(2) JSONデータ向けのLOB記憶域の考慮事項、(3) JSON列に整形式のJSONデータが格納されていることの確認、について説明します。

JSON列のデータ型Oracle DatabaseにJSONデータを格納するには、データ型がVARCHAR2、CLOBまたはBLOBの列を使用します。どのデータ型を使用しても、それらのデータ型の他のデータを操作する場合と同様に、JSONデータを操作できます。標準のデータ型を使用してJSONデータを格納すると、アドバンスト・レプリケーションなどのOracle Databaseのすべての機能で、JSON文書が格納された表を使用できるようになります。どれを使用するかは、一般的に、管理が必要なJSON文書のサイズによって決まります。

最も大きいJSON文書が4000バイト(または文字)を超えないことが確かな場合は、VARCHAR2(4000)を使用します 。

Oracle Exadataを使用している場合は、VARCHAR2(4000)を選択すると、パフォーマンスの向上のために一部のJSON操作の実行をExadataの記憶域セルに押し下げることができるため、パフォーマンスを向上させることができます。JSON文書のうち、いくつかが4000バイト(または文字)を超えるということがわかっており、すべて32767バイト(または文字)以下であることが確かな場合は、VARCHAR2(32767)を使用します 。

VARCHAR2(32767)の場合、文書の最初の約3.5Kバイト(または文字)は、表の行の一部として表内に格納されます。これは、VARCHAR2(4000)ではなくVARCHAR2(32767)を使用することで増えるコストが、約3.5Kより大きい文書にのみ適用されることを意味します。ほとんどの文書がこのサイズよりも小さい場合は、VARCHAR2(4000)を使用する場合と比べてパフォーマンスにほとんど差は出ません。Oracle Exadataを使用する場合は、行内に格納されているすべての文書に対してプッシュダウ

脚注1脚注1

脚注1

53

Page 54: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ンが有効になります。32767バイト(または文字)よりも大きいJSON文書があることがわかっている場合は、BLOB(バイナリ・ラージ・オブジェクト)またはCLOB (キャラクタ・ラージ・オブジェクト)の記憶域を使用します 。

JSON列に整形式のJSONデータが格納されていることの確認SQL/JSON条件is jsonを使用して、一部のJSONデータが整形式かどうかをチェックできます。整形式のJSONデータ以外のデータが一部の行に含まれることが予期される場合を除いて、すべてのJSON列にis jsonチェック制約を適用することをお薦めします。

JSON解析のオーバーヘッドは、条件が挿入や更新のパフォーマンスに重大な影響を及ぼさないことを評価するといったもので、制約を除外すると、JSONデータの問合せに単純なドット表記法の構文を使用できないことになります。

何をもって整形式のJSONデータとするかは明確ではありません。実際には、JSONデータには、標準の定義に厳密には従わない特徴がいくつかあることが一般的です。JSONデータの特定の列に、標準の定義(厳密な構文)と、一般的に使用されるJavaScriptのような構文(緩慢な構文)のどちらの構文を必要とするかを制御できます。Oracle Database向けのデフォルトのSQL/JSON構文は緩慢です。どの種類の構文を使用するかは、条件is jsonで制御します。JSON列にis jsonチェック制約を適用することで、このように緩慢なJSON構文をデフォルトで使用できるようになります。

JSONデータにLOB記憶域を使用する際の考慮事項CLOB記憶域ではなく、BLOBの使用をお薦めします。

これは、データベースの文字セットがOracleの推奨値であるAL32UTF8に設定されている場合に、特に該当します。AL32UTF8のデータベースでは、CLOBインスタンスはUCS2文字セットを使用して格納されます。これは、1文字に2バイト必要になることを意味します。ある文書の内容の大半が、文字セットAL32UTF8でシングルバイトを使用して表される文字で構成されている場合は、この文書に必要な記憶域が2倍になります。

データベースの文字セットがAL32UTF8ではない場合でも、CLOBではなくBLOBの記憶域を選択すると、JSON文書を格納するときに文字セットの変換が必要なくなるという利点があります(JSONデータの文字セットおよび文字エンコーディングを参照)。

ラージ・オブジェクト(LOB)を使用する場合は、次のようにすることをお薦めします。

句LOB (COLUMN_NAME) STORE AS (CACHE)をCREATE TABLE文で使用して、JSON文書の読取り操作が、データベース・バッファ・キャッシュを使用して最適化されるようにします。SecureFiles LOBを使用します。JSONデータに必要な記憶域を減らすために、Oracle Advanced

脚注1

54

Page 55: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Compressionの使用も検討します。圧縮を使用する場合は、Mediumの圧縮オプションをお薦めします。このオプションは、容量の節約とパフォーマンスの適度なバランスを提供します。

SQL/JSONファンクションおよび条件では、データが格納されるのがBLOBかCLOBかという特別な考慮事項なしに、JSONデータを使用できます。アプリケーション開発の観点から見ると、BLOBコンテンツと連携するためのAPIコールは、CLOBコンテンツと連携するためのものとほとんど同じです。

CLOBではなくBLOB記憶域を選択する(JSONまたはその他の種類のデータを対象に)マイナス面は、SQL*Plusなどのコマンドライン・ツールを使用したBLOBコンテンツとの連携がより難しい場合があるということです。次に例を示します。

BLOB列からデータを選択するときに、出力可能なテキストとしてそのデータを表示する場合に、SQLファンクションto_clobを使用する必要がある。

BLOB列を対象に挿入または更新の操作を実行するときに、SQLファンクションrawtohexを使用して、文字列を明示的にBLOB形式に変換する必要がある。

関連項目:

SQLファンクションto_clobの詳細は、Oracle Database SQL言語リファレンスを参照してくださいSQLファンクションrawtohexの詳細は、Oracle Database SQL言語リファレンスを参照してください。

クライアントを使用してJSONデータをLOBインスタンスとして取得する場合の考慮事項Oracle Call Interface (OCI)、Java Database Connectivity (JDBC)などのクライアントを使用して、LOBバッチでデータベースからJSONデータを取得する場合は、次の最適化のいずれかを使用することを検討してください。

LOBデータ・インタフェースを使用する場合:

OCIでは、BLOBデータおよびCLOBデータに対してデータ型SQLT_BINおよびSQLT_CHRをそれぞれ使用します。

JDBCでは、BLOBデータおよびCLOBデータに対してメソッドgetBytes()およびgetString()をそれぞれ使用します。

LOBロケータ・インタフェースを使用する場合:

LOBプリフェッチ・サイズを大きい値(65 KBなど)に設定します。

Foot 2

55

Page 56: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

フェッチされたLOBを、各行の読取り後に解放します。そうしないと、パフォーマンスが低下し、メモリーがリークする可能性があります。

この例は、JDBCでLOBロケータ・インタフェースを使用する方法を示しています。

Statement stmt = conn.createStatement(); // conn is a

java.sql.Connection

stmt.setFetchSize(1000); // Set batch fetch size to 1000 rows

// set LOB prefetch size to be 65 KB((OraclePreparedStatement)stmt).setLobPrefetchSize(65000);// Query the JSON data in column jdoc of table myTab, returning JSON

as a BLOB instance

rset = stmt.executeQuery(

"SELECT id, json_serialize(jdoc RETURNING BLOB) FROM myTab");

while (rset.next()) { // Iterate over the returned rows

Blob blob = rset.getBlob (2);

// Do something with the BLOB instance for the row

blob.free(); // Free the LOB at the end of each iteration}

rset.close();

関連項目:

Oracle Database SecureFiles and Large Objects開発者ガイド

関連項目

JSONデータの文字セットおよび文字エンコーディング

JSONデータの挿入、更新およびロードの概要

JSONデータに対する単純なドット表記法アクセス

親トピック: JSONデータの格納および管理

脚注の凡例

コピー

56

Page 57: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

脚注1: 制限がバイト単位かそれとも文字単位かは、セッション・パラメータNLS_LENGTH_SEMANTICSによって決まります。脚注2: SQLファンクションrawtohexの戻り値は32767バイトに制限されています。値は、この長さを超えて変換されたデータをすべて削除するように切り捨てられます。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

57

Page 58: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

4 JSON列を含む表の作成JSON列を持つ表を作成できます。SQL条件is jsonをチェック制約として使用して、列に挿入されるデータが(整形式の)JSONデータになるようにします。JSONデータを対象とした列を作成する場合は常にis_jsonチェック制約を使用することをお薦めします。

例4-1および例4-2にこれを示します。これらの例では、このマニュアル内の別の場所にある例で使用されるデータを保持する表を作成し、データを入力します。

例4-2では、簡潔にするために、2行のデータ(1つのJSON文書)のみが挿入されています。

ノート: SQL/JSON条件IS JSONおよびIS NOT JSONは、NULL以外のSQL値に対してはtrueまたはfalseを戻します。ただし、これらは両方とも、SQLのNULLに対してはunknown (trueでもfalseでもありません)を戻します。チェック制約で使用される場合、SQL NULL値の列への挿入が阻止されることはありません。(ただし、SQLのWHERE句で使用される場合、SQL NULLは戻されません。)

チェック制約によってデータ挿入のパフォーマンスが低下することは事実です。特定の列に整形式のJSONデータのみが挿入されることが確実である場合、チェック制約を無効にすることを検討できますが、制約は削除しないでください。

関連項目:

完全表j_purchaseorderの作成の詳細は、外部JSONデータのロードを参照してください。CREATE TABLEの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例4-1 JSONデータが整形式であることを確認するためのチェック制約でのIS JSONの使用

CREATE TABLE j_purchaseorder コピー

58

Page 59: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

(id VARCHAR2 (32) NOT NULL PRIMARY KEY,

date_loaded TIMESTAMP (6) WITH TIME ZONE,

po_document VARCHAR2 (23767)

CONSTRAINT ensure_json CHECK (po_document IS JSON));

例4-2 VARCHAR2 JSON列へのJSONデータの挿入

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

to_date('30-DEC-2014'),

'{"PONumber" : 1600,

"Reference" : "ABULL-20140421",

"Requestor" : "Alexis Bull",

"User" : "ABULL",

"CostCenter" : "A50",

"ShippingInstructions" :

{"name" : "Alexis Bull",

"Address" : {"street" : "200 Sporting Green",

"city" : "South San Francisco",

"state" : "CA",

"zipCode" : 99236,

"country" : "United States of America"},

"Phone" : [{"type" : "Office", "number" : "909-555-

7307"},

{"type" : "Mobile", "number" : "415-555-

1234"}]},

"Special Instructions" : null,

"AllowPartialShipment" : true,

[{"ItemNumber" : 1,

"Part" : {"Description" : "One Magic Christmas",

"UnitPrice" : 19.95,

"UPCCode" : 13131092899},

"Quantity" : 9.0},

{"ItemNumber" : 2,

"Part" : {"Description" : "Lethal Weapon",

"UnitPrice" : 19.95,

"UPCCode" : 85391628927},

"Quantity" : 5.0}]}');

コピー

59

Page 60: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

to_date('30-DEC-2014'),

'{"PONumber" : 672,

"Reference" : "SBELL-20141017",

"Requestor" : "Sarah Bell",

"User" : "SBELL",

"CostCenter" : "A50",

"ShippingInstructions" : {"name" : "Sarah Bell",

"Address" : {"street" : "200

Sporting Green",

"city" : "South San

Francisco",

"state" : "CA",

"zipCode" : 99236,

"country" : "United

States of America"},

"Phone" : "983-555-6509"},

"Special Instructions" : "Courier",

"LineItems" :

[{"ItemNumber" : 1,

"Part" : {"Description" : "Making the Grade",

"UnitPrice" : 20,

"UPCCode" : 27616867759},

"Quantity" : 8.0},

{"ItemNumber" : 2,

"Part" : {"Description" : "Nixon",

"UnitPrice" : 19.95,

"UPCCode" : 717951002396},

"Quantity" : 5},

{"ItemNumber" : 3,

"Part" : {"Description" : "Eric Clapton: Best Of

1981-1999",

"UnitPrice" : 19.95,

"UPCCode" : 75993851120},

"Quantity" : 5.0}]}');

列にJSONデータが必然的に含まれるかどうかの確認

60

Page 61: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

表またはビューの特定の列が整形式のJSONデータであることをどうすれば確認できるでしょうか。この場合、この列はDBA_JSON_COLUMNS、USER_JSON_COLUMNSおよびALL_JSON_COLUMNSの静的データ・ディクショナリ・ビューにリストされます。

親トピック: JSONデータの格納および管理

4.1 列にJSONデータが必然的に含まれるかどうかの確認表またはビューの特定の列が整形式のJSONデータであることをどうすれば確認できるでしょうか。この場合、この列はDBA_JSON_COLUMNS、USER_JSON_COLUMNSおよびALL_JSON_COLUMNSの静的データ・ディクショナリ・ビューにリストされます。

これらの各ビューには、列名、データ型および形式(TEXTまたはBINARY)、表名またはビュー名(列TABLE_NAME)、およびオブジェクトが表かそれともビューか(列OBJECT_TYPE)がリストされます。

JSONデータに考慮される表の列の場合、is jsonチェック制約を含める必要があります。ただし、ビューの場合、次の基準のいずれかを満たせば、列はJSONデータとしてみなされます。

基礎となるデータにis jsonチェック制約が含まれる。

列が、SQL/JSONファンクションjson_queryの使用の結果である。

列が、json_objectといったJSON生成ファンクションの使用の結果である。

列はSQLファンクションtreatとキーワードAS JSONの使用で発生したものです。

is jsonチェック制約により表の列がJSONデータであることが確認される場合で、かつその制約が後から無効にされた場合、列はビュー内にリストされたままです。チェック制約が削除されている場合、列はビューから削除されます。

ノート: チェック制約によって論理条件ORを使用して条件is jsonが別の条件と結合される場合、列はこれらのビューにリストされません。この場合、列内のデータがJSONデータであるかどうかは確実ではありません。たとえば、制約jcol is json ORlength(jcol) < 1000の場合、列jcol内のデータがJSONデータであることは確認されません。

関連項目:

ALL_JSON_COLUMNSおよび関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください

親トピック: JSON列を含む表の作成

61

Page 63: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

5 SQL/JSON条件IS JSONおよびISNOT JSONSQL/JSON条件is jsonおよびis not jsonは補足的な条件です。これらは、引数が構文的に正しい(つまり、整形式の)JSONデータかどうかをテストします。これらは、SELECT文のCASE式またはWHERE句で使用できます。is jsonはチェック制約で使用できます。

引数が構文的に正しい場合、is jsonはtrueを戻し、is not jsonはfalseを戻します。

解析中にエラーが発生した場合、エラーは発生せず、データは整形式ではないとみなされます。is jsonはfalseを返し、is not jsonはtrueを返します。解析中以外にエラーが発生した場合は、そのエラーが発生します。

整形式のデータとは、構文的に正しいデータであることを意味します。テキストとして格納されているJSONデータは、厳密な構文と緩慢な構文と呼ばれる2つの意味での整形式にすることができます。また、テキストのJSONデータの場合は、JSONオブジェクトに重複したフィールド(キー)を含めることができるかどうかを指定できます。

テキストのJSONデータがデータベース内で生成される場合は、キーワードSTRICTを指定した条件is jsonを満たします。これには次の方法による生成が含まれます。

SQL/JSON生成関数を使用(FORMAT JSONまたはTREAT AS JSONにキーワードSTRICTを指定しない場合。このキーワードには、データがJSONデータであることを宣言する意味があり(ユーザーがそれを保証します)、整形式であるかどうかはチェックされません)

SQLファンクションjson_serializeの使用

PL/SQL DOMでのSQLファンクションto_clob、to_blobまたはto_varchar2の使用

SQL/JSONファンクションjson_queryの使用

FORMAT JSONを指定したSQL/JSONファンクションjson_tableの使用

関連項目:

63

Page 64: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

is jsonおよびis not jsonの詳細は、Oracle Database SQL言語リファレンスを参照してください。

JSONオブジェクトの一意フィールドと重複フィールドデフォルトでは、フィールド名は、特定のJSONオブジェクトに対して一意である必要はありません。しかし、特定のJSONデータに重複するフィールド名を持つオブジェクトがない場合のみ、このJSONデータが整形式であるとみなすように指定することもできます。

厳密なJSON構文と緩慢なJSON構文についてJSON向けのOracleのデフォルト構文は緩慢です。特に、この構文は、オブジェクト・フィールドに対してJavaScript構文を反映し、ブール型の値およびnull値では大/小文字が区別されず、数字、ホワイトスペースおよびUnicode文字のエスケープについてはより寛容です。

厳密なJSON構文と緩慢なJSON構文の指定Oracle Database向けのデフォルトのJSON構文は緩慢です。構文が厳密か緩慢かが問題になるのは、SQL/JSON条件is jsonおよびis not jsonの場合のみです。他のすべてのSQL/JSONファンクションおよび条件では、入力を解析するために緩慢な構文が使用され、出力を戻すために厳密な構文が使用されます。

関連項目

JSON列を含む表の作成

親トピック: JSONデータの格納および管理

5.1 JSONオブジェクトの一意フィールドと重複フィールドデフォルトでは、フィールド名は、特定のJSONオブジェクトに対して一意である必要はありません。しかし、特定のJSONデータに重複するフィールド名を持つオブジェクトがない場合のみ、このJSONデータが整形式であるとみなすように指定することもできます。

JSON標準では、特定のJSONオブジェクトに対してフィールド名が一意である必要があるかどうかは指定されません。つまり、このことは先験的に、整形式のJSONオブジェクトには同じフィールド名を持つ複数のメンバーを設定できることを意味します。重複する名前のチェックには追加の時間が必要になるため、これがOracle DatabaseでJSONデータを扱う際のデフォルトの動作になっています。

特定のJSONデータに含まれるすべてのオブジェクトが一意のフィールド名を持つ(つまり、重複するフィールド名を持つオブジェクトがない)場合のみ、このJSONデータが整形式であるとみなすように指定できます。これは、SQL/JSON条件is jsonでキーワードWITH UNIQUE KEYSを使用することで行います。

UNIQUE KEYSを指定しないか、キーワードWITHOUT UNIQUE KEYSを使用する場合、オブジェ

Foot 1

64

Page 65: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

クトが重複フィールド名を持ったままでも整形式であるとみなすことができます。

Oracle Databaseで採用されている評価では常に、特定のフィールド名を持つオブジェクト・メンバーの1つのみが使用されます。同じフィールド名を持つ他のメンバーは無視されます。このような複数のメンバーのうちどれが使用されるかは指定されていません。

整形式のJSONデータで重複フィールド名が許可されるかどうかは、整形式かどうかの確認に、厳密な構文と緩慢な構文のどちらが使用されるかとかかわっています。

親トピック: SQL/JSON条件IS JSONおよびIS NOT JSON

5.2 厳密なJSON構文と緩慢なJSON構文についてJSON向けのOracleのデフォルト構文は緩慢です。特に、この構文は、オブジェクト・フィールドに対してJavaScript構文を反映し、ブール型の値およびnull値では大/小文字が区別されず、数字、ホワイトスペースおよびUnicode文字のエスケープについてはより寛容です。

標準ECMA-404のJSONデータ交換フォーマット、およびECMA-262のECMAScript言語指定により、JSON構文が定義されます。

これらの指定に応じて、各JSONのフィールドおよび各文字列値は、二重引用符(")で囲む必要があります。Oracleではこの厳密なJSON構文をサポートしていますが、これはデフォルトの構文ではありません。

JavaScript表記法では、オブジェクト・リテラルで使用されるフィールドは、二重引用符で囲むことができますが、必須ではありません。これはまた、一重引用符(')で囲むこともできます。Oracleではこの緩慢なJSON構文もサポートしており、これがデフォルトの構文です。

また、実際に、一部のJavaScript実装(ただし、JavaScript標準ではありません)では次の1つ以上が許可されています。

キーワードtrue、falseおよびnullの大/小文字の相違(TRUE、True、TrUe、fALSe、NulLなど)。

配列の最後の要素またはオブジェクトの最後のメンバーの後ろに追加されるカンマ(,) ([a,b, c,]、{a:b, c:d,}など)。

先頭に1つ以上の0がある数字(0042.3など)。

小数点の前に0がない小数(0.14ではなく.14など)。

小数点の後に小数部分がない数字(342.や1.e27など)。

数値がマイナスではないことを意味する、数字の前のプラス記号(+) (+1.3など)。

この構文も、Oracleのデフォルトの(緩慢な) JSON構文の一部として許可されます。(厳密な数字構文は、JSON標準を参照してください。)

65

Page 66: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ASCIIのスペース文字(U+0020)以外にも、JSON標準では、引用符で囲まれたフィールドまたは文字列値の外側で使用される場合、次の文字は重要でない(無視される)ホワイトスペースとして定義されています。

タブ、水平タブ(HT、 ^I、10進数の9、U+0009、\t)

行送り、改行(LF、 ^J、10進数の10、U+000A、\n)

キャリッジ・リターン(CR、 ^M、10進数の13、U+000D、\r)

ただし、JSONの緩慢な構文では、ASCII制御文字(0-31)のすべて、およびASCIIスペース文字(10進数の32、U+0020)は(重要でない)ホワイトスペース文字として処理されます。制御文字には次のようなものがあります。

Null (NUL、 ^@、10進数の0、U+0000、\0)

ベル(NEL、 ^G、10進数の7、U+0007、 \a)

垂直タブ(VT、 ^K、10進数の11、U+000B)

エスケープ(ESC、 ^[、10進数の27、U+001B、\e)

削除(DEL、 ^?、10進数の127、U+007F)

ASCIIのスペース文字(U+0020)は、引用符で囲まれたフィールドまたは文字列値内で許可されてエスケープされていない唯一のホワイトスペース文字です。これは、厳密なJSON構文と緩慢なJSON構文の両方に対して当てはまります。

厳密なJSON構文と緩慢なJSON構文の両方において、引用符で囲まれたオブジェクト・フィールドおよび文字列値に含めることができるのはUnicode文字のみですが、これらの一部は次のようにエスケープする必要があります。

ASCII制御文字は許可されていませんが、\b (バックスペース)、\f (フォーム・フィード)、\n (改行、行送り)、\r (キャリッジ・リターン)および\t (タブ、水平タブ)の各エスケープ・シーケンスによって表される文字は除きます。二重引用符(")、スラッシュ(/)およびバックスラッシュ(\)文字もエスケープする(バックスラッシュを前に置く)必要があります(それぞれ\"、\/および\\)。

緩慢なJSON構文では、引用符で囲まれていないオブジェクト・フィールドに、ホワイトスペースとJSON構造文字(左右の大カッコ([、])と中カッコ({、})、コロン(:)およびカンマ(,))を除く任意のUnicode文字を含めることができますが、エスケープ・シーケンスは許可されません。

名前または文字列にも任意のUnicode文字を含めることができますが、この場合、Unicodeコード・ポイントを表す4つのASCIIの16進数字を後ろに付けたASCIIのエスケープ構文\uを使用します。

厳密なJSON構文と緩慢なJSON構文のいずれにおいても、出力可能でないかホワイトスペースとして表示される可能性がある他のUnicode文字(ノーブレークスペース文字(U+00A0)など)はホワイト

66

Page 67: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

スペースとみなされません。

表5-1は、JSON構文のいくつかの例を示しています。

表5-1 JSONオブジェクト・フィールドの構文例

例 整形式かどうか

"part number": 1234 緩慢および厳密: はい。スペース文字は許可されます。

part number: 1234 緩慢(および厳密): いいえ。引用符で囲まれていない名前では、スペース文字を含むホワイトスペース文字は許可されません。

"part\tnumber":1234

緩慢および厳密: はい。タブ文字のエスケープ・シーケンスは許可されます。

"part number":1234

緩慢および厳密: いいえ。エスケープされていないタブ文字は許可されません。エスケープされていないホワイトスペース文字で許可されるのはスペースのみです。

"\"part\"number":1234

緩慢および厳密: はい。名前が引用符で囲まれている場合、エスケープされている二重引用符は許可されます。

\"part\"number:1234

緩慢および厳密: いいえ。名前は引用符で囲む必要があります。

'\"part\"number':1234

緩慢: はい、厳密: いいえ。一重引用符で囲まれた名前(オブジェクト・フィールドと文字列)は、緩慢な構文でのみ許可されます。引用符で囲まれた名前では、エスケープされている二重引用符が許可されます。

"pärt :number":1234

緩慢および厳密: はい。引用符で囲まれた名前では、任意のUnicode文字が許可されます。これには、ホワイトスペース文字と、コロン(:)などの、JSONの構造的な文字が含まれます。

part:number:1234 緩慢(および厳密): いいえ。引用符で囲まれている名前では、構造文字は許可されません。

関連項目

JSON構文およびJSON構文が表すデータ

関連項目:

JSONデータ交換フォーマットの構文については、『IETF RFC4627』および『ECMA404』を参照してくださいJSONおよびJavaScriptの詳細は、ECMA InternationalおよびJSON.orgを参照してください

67

Page 68: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

親トピック: SQL/JSON条件IS JSONおよびIS NOT JSON

5.3 厳密なJSON構文と緩慢なJSON構文の指定Oracle Database向けのデフォルトのJSON構文は緩慢です。構文が厳密か緩慢かが問題になるのは、SQL/JSON条件is jsonおよびis not jsonの場合のみです。他のすべてのSQL/JSONファンクションおよび条件では、入力を解析するために緩慢な構文が使用され、出力を戻すために厳密な構文が使用されます。

特定のJSON入力データに厳密に正しい構文が使用されていることを確認する必要がある場合は、最初にis jsonまたはis not jsonを使用してチェックしてください。

JSON標準に応じてデータを厳密な整形式としてチェックするよう指定するには、(STRICT) (カッコを含む)をis jsonまたはis not json式に追加します。

例5-1に、これを示します。これは例4-1と同じですが、列に挿入されたすべてのデータがJSON標準に応じた整形式であることを確認するために(STRICT)が使用されています。

関連項目:

CREATE TABLEの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例5-1 JSONデータが厳密な整形式(標準)であることを確認するためのチェック制約でのIS JSONの使用

CREATE TABLE j_purchaseorder

(id VARCHAR2 (32) NOT NULL PRIMARY KEY,

date_loaded TIMESTAMP (6) WITH TIME ZONE,

po_document VARCHAR2 (32767)

CONSTRAINT ensure_json CHECK (po_document IS JSON (STRICT)));

関連項目

厳密なJSON構文と緩慢なJSON構文について

親トピック: SQL/JSON条件IS JSONおよびIS NOT JSON

脚注の凡例

コピー

68

Page 69: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

脚注1: オブジェクト・フィールドは、オブジェクトの「キー」と呼ばれることもあります。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

69

Page 70: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

6 JSONデータの文字セットおよび文字エンコーディングJSONデータでは常にUnicode文字セットが使用されます。この点で、JSONデータの方がXMLデータより簡単に使用できます。これは、JSONデータ交換フォーマットの重要な部分です(RFC 4627)。Oracle Databaseで処理されるJSONデータでは、必要な文字セットの変換が自動的に行われます。

Oracle Databaseでは、JSONデータの処理時にUTF-8を内部で使用します(解析、問合せ)。このような処理に入力されるデータまたはこのような処理から出力されるデータをUTF-8とは異なる文字セットにする必要がある場合は、それに応じた文字セット変換が実行されます。

文字セット変換はパフォーマンスに影響する可能性があります。また、情報が失われる可能性もあります。入力データをUTF-8に変換する操作では情報が失われる可能性は高くありませんが、出力文字セットで表すことができない文字の場合、出力への変換の結果として情報の損失が発生する可能性があります。

JSONデータがUnicodeのようにデータベースに格納されている場合、格納または取得時に文字セットの変換は必要ありません。これは、データベースの文字セットがAL32UTF8 (Unicode UTF-8)である場合、またはJSONデータが文字セットAL16UTF16を含むCLOBインスタンス内に格納されている場合です。可能であれば、データベース文字セットとしてAL32UTF8を使用することをお薦めします。

データベース文字セットに関係なく、データ型BLOBを使用して格納されているJSONデータでは、格納または取得時に文字セットの変換はありません。JSONデータは、AL32UTF8、AL16UTF16またはAL16UTF16LEとしてデータ型BLOBを使用して格納できます。

SQL/JSONファンクションまたはPL/SQLメソッドを使用してJSONデータを変換し、データ型BLOBを使用して変換の結果を戻す場合、結果はAL32UTF8としてエンコードされます。これは、入力BLOBデータは別のUnicodeエンコーディングを使用している場合にも当てはまります。

たとえば、ファンクションjson_queryを使用してBLOB入力からJSONデータを抽出し、BLOBとして結果を戻す場合は、AL32UTF8を使用して戻されます。

70

Page 71: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSONファンクションまたはPL/SQLメソッドのアプリケーションでVARCHAR2またはCLOBの戻りデータ型を指定し、およびデータベース文字セットがUnicodeでないる場合に、文字セットの変換で情報の損失が発生することがあります。最終的にBLOBとして作成されている場合でも、入力JSONデータがBLOBインスタンスに格納された場合、一部がVARCHAR2またはCLOBに一時的に変更されると、変換後のBLOBデータに情報が損失する可能性があります。

関連項目

JSONデータの格納および管理の概要

関連項目:

Unicodeの詳細は、Unicode.orgを参照してください

JSONデータ交換フォーマットについては、『IETF RFC4627』および『ECMA 404』を参照してくださいデータベースでの様々なキャラクタ・セットの使用の詳細は、Oracle Database MigrationAssistant for Unicodeガイドを参照してください。

データベースでのキャラクタ・セット変換の詳細は、Oracle Databaseグローバリゼーション・サポート・ガイドを参照してください。

親トピック: JSONデータの格納および管理

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

71

Page 72: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

7 JSONデータのパーティション化JSON仮想列をパーティション化キーとして使用して、表をパーティション化できます。仮想列は、SQL/JSONファンクションjson_valueを使用してJSON列から抽出されます。

可能な場合の非JSON列のパーティション化JSON仮想列を使用して表をパーティション化できますが、非JSON列の使用が好ましいことが一般的です。パーティション化キーによって、新しい行を挿入するパーティションが指定されます。JSON仮想列として定義されたパーティション化キーは、SQL/JSONファンクションjson_valueを使用し、パーティション定義のjson_value式が行が挿入されるたびに実行されます。この方法は、特に、大きなJSON文書の挿入ではコストがかかる可能性があります。

JSON仮想列を使用した表のパーティション化ルールパーティション化キーとして機能する仮想列は、SQL/JSONファンクションjson_valueを使用して定義する必要があります。仮想列のデータ型は、json_value式に対して使用されるRETURNING句によって定義されます。仮想列に対してデータを抽出するために使用されるjson_valueのパスには、述語を含めないようにする必要があります。(パスがストリーム可能である必要があります。)

仮想列を定義する式が参照するJSON列にはis jsonチェック制約を含めることができますが、このような制約を含めることは必須ではありません。

関連項目:

CREATE TABLEの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例7-1 JSON仮想列を使用したパーティション表の作成

72

Page 73: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

この例は、表j_purchaseorder_partitionedを作成します。これは、仮想列po_num_vcを使用してパーティション化されています。この仮想列はJSON列po_documentを参照します(CLOB記憶域を使用)。仮想列を定義するjson_value式は、JSONフィールドPONumberをpo_documentから数値として抽出します。列po_documentには、is jsonチェック制約はありません。

CREATE TABLE j_purchaseorder_partitioned

(id VARCHAR2 (32) NOT NULL PRIMARY KEY,

date_loaded TIMESTAMP (6) WITH TIME ZONE,

po_document CLOB,

po_num_vc NUMBER GENERATED ALWAYS AS (json_value (po_document, '$.PONumber' RETURNING NUMBER))) LOB (po_document) STORE AS (CACHE)

PARTITION BY RANGE (po_num_vc) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2000));

親トピック: JSONデータの格納および管理

コピー

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

73

Page 74: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

8 JSONデータのレプリケーションOracle GoldenGateを使用して、JSONデータが格納された列を持つ表をレプリケートできます。

Oracle GoldenGateでは、レプリケートする表に非仮想主キー列が必要であることに注意してください。主キー列を仮想にすることはできません。

JSONデータ上のすべての索引もレプリケートされます。ただし、レプリカ・データベース上で、JSON検索索引をメンテナンスするために使用する任意のOracle Text操作を実行する必要があります。このようなプロシージャの例は、次のとおりです。

CTX_DDL.sync_index

CTX_DDL.optimize_index

関連項目:

Oracle GoldenGateの詳細は、Oracle GoldenGateのドキュメントを参照してください

CTX_DDL.sync_indexの詳細は、Oracle Textリファレンスを参照してください。

CTX_DDL.optimize_indexの詳細は、Oracle Textリファレンスを参照してください。

親トピック: JSONデータの格納および管理

74

Page 76: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第III部 JSONデータの挿入、更新およびロードOracle Databaseにデータを挿入、更新およびロードするための通常の方法では、JSONデータが使用されます。また、JSONダンプ・ファイルの内容から外部表を作成することもできます。

JSONデータの挿入、更新およびロードの概要標準データベースAPIを使用して、Oracle DatabaseへのJSONデータの挿入および更新を行えます。ファイルシステムのファイルに含まれるJSONデータをデータベースに公開する外部表を作成することで、このようなデータを直接処理できます。JSONマージ・パッチを使用してJSONドキュメントを更新できます。

外部JSONデータのロードJSONデータのデータベース表を、JSONダンプ・ファイルの内容から作成できます。

JSONマージ・パッチによるJSONドキュメントの更新Oracle SQLファンクションjson_mergepatch使用して、JSONドキュメントの特定の部分を更新できます。指定したJSONドキュメントに対する変更を指定するJSONマージ・パッチ・ドキュメントを渡します。JSONマージ・パッチはIETF標準です。

76

Page 78: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

9 JSONデータの挿入、更新およびロードの概要標準データベースAPIを使用して、Oracle DatabaseへのJSONデータの挿入および更新を行えます。ファイルシステムのファイルに含まれるJSONデータをデータベースに公開する外部表を作成することで、このようなデータを直接処理できます。JSONマージ・パッチを使用してJSONドキュメントを更新できます。

JSONデータの挿入または更新での標準データベースAPIの使用JSONデータは標準のSQLデータ型を使用して格納されるため、VARCHAR2列とラージ・オブジェクト(LOB)列の挿入または更新に使用されるすべての標準データベースAPIを、JSON文書を格納する列に使用できます。これらのAPIにとって、格納されているJSON文書は文字列にすぎません。

SQL条件is jsonをチェック制約として使用して、JSON列に整形式のJSONデータのみを格納するように指定します。データベースでは、このチェック制約を他のチェック制約と同じように扱って、列の内容に関するルールを適用します。このように、データ型がVARCHAR2、BLOBまたはCLOBのJSON文書が格納された列の処理は、同じ型の他の列と同じように扱われます。

JSON列の文書に更新操作を実行するには、文書全体の置換が必要です。JSON文書に細かい修正を加えることができますが、変更をディスクに保存するためには、更新した文書全体を書き込む必要があります。

JSON文書のJSON列への挿入は、その列のデータ型がVARCHAR2またはCLOBの場合には簡単です—例4-2を参照してください。このような列の更新についても同じです。

しかし、データ型がBLOBのJSON列にデータを挿入したり、そのようなデータを更新したりするために、SQL*Plusなどのコマンドライン・ツールを使用した場合には、JSONデータを適切にバイナリ形式に変換する必要があります。例9-1に、部分的な例を示します。表my_tableにはJSON列json_docがあり、この列ではBLOB記憶域が使用されていると仮定します。

例9-1 BLOB列へのJSONデータの挿入

78

Page 79: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

挿入されるテキストのJSONデータ(部分的に省略されたリテラル・データ{...}として表示される)には、データベース文字セット(WE8MSWIN1252)の文字が含まれます。このデータはPL/SQLファンクションUTL_RAW.cast_to_rawに渡されます。ここで、データ型がRAWにキャストされます。この結果は関数UTL_RAW.convertに渡され、ここで文字セットAL32UTF8に変換されます。

INSERT INTO my_table (json_doc)

VALUES (UTL_RAW.convert(UTL_RAW.cast_to_raw('{....}'), 'AL32UTF8', 'WE8MSWIN1252'));

ファイルシステム・ファイルのJSONデータを処理するための外部表の使用外部表を使用すると、ファイルシステム内に個別のファイルとして格納されているJSON文書へのアクセスが容易になります。各ファイルは、外部表の行としてOracle Databaseに公開できます。また、外部表は、NoSQLデータベースによって生成されるダンプ・ファイルの内容へのアクセスも提供できます。JSON文書の外部表を使用して、実質的に、ファイルシステム・ファイル内のデータに直接問合せを実行できます。これは、1回の処理ですべてのファイルのデータに対する処理のみが必要な場合に便利です。

ただし、文書の複数の問合せを実行する必要がある場合、特に、それぞれの問合せで外部表の異なる行(異なる文書)からデータを選択する場合には、パフォーマンスを向上させるために、SELECT文としてINSERTを使用して、外部表のデータを通常でのデータベース表にコピーすることを検討します。例10-4を参照してください。JSONデータが通常の表のJSON列にロードされたら、その内容に索引を付け、反復的かつ選択的な方法で、データの問合せを効率的に行うことができるようになります。

JSONマージ・パッチを使用したJSONドキュメントの更新Oracle SQLファンクションjson_mergepatchまたはPL/SQLオブジェクト型メソッドjson_mergepatch()を使用して、JSONドキュメントの特定の部分を更新できます。どちらの場合も、指定したJSONドキュメントに対する変更を宣言的に指定するJSONマージ・パッチ・ドキュメントを指定します。JSONマージ・パッチはIETF標準です。

関連項目:

IETF RFC7396 (JSONマージ・パッチの定義)

Oracle Database SQL言語リファレンス(SQLファンクションjson_mergepatchの詳細)

コピー

79

Page 80: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ノート: データを挿入、更新およびロードするための通常の方法以外に、Simple OracleDocument Access (SODA) APIも使用できます。SODAは、リレーショナル・データベース機能やSQLおよびPL/SQLなどの言語に関する知識を使用しないスキーマレス・アプリケーション開発向けに設計されています。データベースで文書がどのように格納されているかを把握しなくても、JSONだけでなく、任意の種類の文書コレクションの作成および格納や、それらの文書の取得および問合せの実行を可能にします。SODAには、JSON文書に固有の問合せ機能も用意されています。SODAの実装には、次の2種類があります。

SODA for Java: データベース、コレクションおよび文書を表すJavaクラス。

SODA for REST: HTTPコールを実行できる任意の言語を使用した、RepresentationalState Transfer (REST)リクエストとしてのSODA操作。

SODAの詳細は、ドキュメント・ストアとして機能するOracleを参照してください。

関連項目:

PL/SQLオブジェクト型を使用したJSONデータの更新の詳細は、JSON用のPL/SQLオブジェクト型を参照してください。

SQLファンクションrawtohexの詳細は、Oracle Database SQL言語リファレンスを参照してください。

関連項目

外部JSONデータのロード

JSONマージ・パッチによるJSONドキュメントの更新

JSON列を含む表の作成

JSONデータの格納および管理の概要

親トピック: JSONデータの挿入、更新およびロード

このページは役に立ちましたか?

80

Page 82: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

10 外部JSONデータのロードJSONデータのデータベース表を、JSONダンプ・ファイルの内容から作成できます。

このトピックでは、JSONダンプ・ファイル$ORACLE_HOME/demo/schema/order_entry/PurchaseOrders.dmp内のデータから、JSON文書の全表をロードする方法について説明します。このファイルの形式には、OracleNoSQL Databaseなどの一般的なNoSQLデータベースによって作成されるエクスポート形式との互換性があります。ファイルの各行には、JSONオブジェクトとして表される単一のJSON文書が含まれます。

このような外部表は直接問い合せることができます。または、パフォーマンスを向上させるために、異なる行を対象とする複数の問合せがある場合には、外部表のデータから標準のデータベース表をロードできます。

例10-1では、ファイルシステム・ディレクトリ$ORACLE_HOME/demo/schema/order_entryに対応するデータベース・ディレクトリを作成しています。次に、例10-2では、このデータベース・ディレクトリを使用して外部表であるjson_dump_file_contentsを作成し、ダンプ・ファイルPurchaseOrders.dmpのデータを入力しています。これは、すべてのJSON文書を列json_documentにコピーして、外部表にデータを一括で入力します。

次に、例10-4ではINSERTをSELECT文として使用して、外部表のJSON文書を、通常のデータベース表j_purchaseorderのJSON列po_documentにコピーします。

外部表のJSON列json_documentにBLOB記憶域を選択するため、通常の表の列po_documentも型BLOBにする必要があります。例10-3では、BLOB列po_documentを含めて表j_purchaseorderを作成します。

ノート: データベース・ディレクトリを作成するためには、システム権限CREATE ANYDIRECTORYが必要です。

関連項目:

82

Page 83: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

外部表の概要は、Oracle Database概要を参照してください。

外部表の詳細は、Oracle DatabaseユーティリティおよびOracle Database管理者ガイドを参照してください。Oracle Databaseデータウェアハウス・ガイド

CREATE TABLEの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例10-1 発注書向けのデータベース・ディレクトリ・オブジェクトの作成

ここで、$ORACLE_HOMEはその値に置き換える必要があります。

CREATE OR REPLACE DIRECTORY order_entry_dir AS '$ORACLE_HOME/demo/schema/order_entry';

例10-2 外部表の作成およびJSONダンプ・ファイルからの入力

CREATE TABLE json_dump_file_contents (json_document BLOB) ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY

order_entry_dir

ACCESS PARAMETERS

(RECORDS DELIMITED BY 0x'0A'

DISABLE_DIRECTORY_LINK_CHECK

FIELDS (json_document CHAR(5000)))

LOCATION

(order_entry_dir:'PurchaseOrders.dmp')) PARALLEL

REJECT LIMIT UNLIMITED;

例10-3 BLOB JSON列を含む表の作成

表j_purchaseorderには、主キーidと、BLOBデータ型を使用して格納されているJSON列po_documentがあります。この列に対して、LOBキャッシュ・オプションがオンになっています。

DROP TABLE j_purchaseorder;

コピー

コピー

コピー

83

Page 84: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

CREATE TABLE j_purchaseorder

(id VARCHAR2 (32) NOT NULL PRIMARY KEY,

date_loaded TIMESTAMP (6) WITH TIME ZONE,

po_document BLOB CONSTRAINT ensure_json CHECK (po_document IS JSON))

LOB (po_document) STORE AS (CACHE);

例10-4 外部表からデータベース表へのJSONデータのコピー

INSERT INTO j_purchaseorder (id, date_loaded, po_document) SELECT SYS_GUID(), SYSTIMESTAMP, json_document FROM json_dump_file_contents

WHERE json_document IS JSON;

親トピック: JSONデータの挿入、更新およびロード

コピー

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

84

Page 85: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

11 JSONマージ・パッチによるJSONドキュメントの更新Oracle SQLファンクションjson_mergepatchを使用して、JSONドキュメントの特定の部分を更新できます。指定したJSONドキュメントに対する変更を指定するJSONマージ・パッチ・ドキュメントを渡します。JSONマージ・パッチはIETF標準です。

UPDATE文でjson_mergepatchを使用すると、JSON列のドキュメントを更新できます。例11-3に、これを示します。

SELECTリストでjson_mergepatchを使用すると、選択したドキュメントを変更できます。変更したドキュメントは、後で返したり、処理できます。例11-4に、これを示します。

JSONマージ・パッチは、主に構造にオブジェクトを使用し、明示的なnull値を使用しないJSONドキュメントの更新に適しています。配列要素を追加、削除または変更することはできません(配列全体を明示的に置き換える場合を除く)。また、フィールドの値をnullに設定することはできません。

JSONマージ・パッチは、UNIXのpatchユーティリティと同様に動作します。パッチを適用するソース・ドキュメントおよび変更を指定するパッチ・ドキュメントを指定すると、更新された(パッチが適用された)ソース・ドキュメントのコピーが返されます。パッチ・ドキュメントでは、ソースと結果のドキュメントの違いを指定します。UNIXのpatchの場合、差異はUNIXdiffユーティリティ出力の形式になります。JSONマージ・パッチの場合、ソースと宛先の両方がJSONドキュメントです。

JSONマージ・パッチは、ソースとパッチのコンテンツのマージとして考えることができます。2つのオブジェクト(ソースとパッチから1つずつ)をマージする場合、一方のオブジェクトにあるが他方には存在しないフィールドを持つメンバーは結果に保持されます。例外として、フィールド値がnullであるパッチ・メンバーは、ソース・オブジェクトにそのようなフィールドがない場合には無視されます。

同じフィールドを持つオブジェクト・メンバーをマージする場合:

85

Page 86: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

パッチ・フィールドの値がNULLの場合、フィールドはソース・ホースからドロップされ、結果に含まれません。それ以外の場合、フィールドは結果に保持されますが、その値はソース・フィールド値とパッチ・フィールド値をマージした結果になります。つまり、この場合のマージ操作は、値自体がオブジェクトであるフィールドに対して再帰的に行われます。

より正確には、JSONマージ・パッチは次のように動作します。

パッチがJSONオブジェクトでない場合は、パッチでソースを置き換えます。

それ以外(パッチがオブジェクト)の場合は、次の手順を実行します。

1. ソースがオブジェクトでない場合は、空のオブジェクト({})であるかのように動作します。

2. パッチ・オブジェクトの(p-field:p–value)メンバーに対して繰り返されます。

パッチ・メンバーのp-valueがnullの場合は、対応するメンバーをソースから削除します。

それ以外の場合は、再帰します。対応するソース・フィールドの値を、対応するソース・フィールドの値を、(次のパッチとして) p-valueでその値を(次のソースとして)マージ・パッチ適用した結果で置き換えます。

パッチ・フィールド値nullに特別な意味がない場合(そのフィールドに対応するソース・メンバーを削除)、これをフィールド値として使用して対応するソース・フィールド値をnullに設定できます。この特別な削除動作では、ソース・フィールド値をnullに設定できません。

例:

パッチ・メンバー"PONumber":99999は、フィールドPONumberでソース・メンバーをオーバーライドし、その値をパッチ指定の値99999に置き換えます。

json_mergepatch('{"User":"ABULL", "PONumber":1600}',

'{"PONumber":99999}')の結果は{"User":"ABULL", "PONumber":99999}になります。パッチ・メンバー"tracking":123456は、欠落したソース・メンバーをフィールドtrackingでオーバーライドし、そのパッチ・メンバーを結果に追加します。また、ソース・メンバー"PONumber":1600は、フィールドPONumberで欠落したパッチ・メンバーをオーバーライドします。これは結果に保持されます。json_mergepatch('{"PONumber":1600}', '{"tracking":123456}')の結果は{"PONumber":1600, "tracking":123456}"になります。

パッチ・メンバー"Reference":nullは、フィールドReferenceでソース・メンバーをオーバーライドし、結果から削除します。

86

Page 87: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_mergepatch('{"PONumber":1600, "Reference":"ABULL-20140421"}',

'{"Reference":null}')の結果は{"PONumber":1600}になります。

パッチ値[1,2,3]は対応するソース値[4,5,6]をオーバーライドして、置き換えます。

json_mergepatch('{"PONumber":1600, "LineItems":[1, 2, 3]}',

'{"LineItems":[4,5,6]}')の結果は{"PONumber":1600, "LineItems":[4, 5,6]}になります。

ノート: マージ・パッチ・プロシージャでは、特に、非オブジェクト・パッチに対する再帰的な動作がないことにより、配列の値を個別に追加、削除または置換できません。このような変更を加えるには、配列全体を置き換える必要があります。たとえば、ソース・ドキュメントにメンバーPhone:["999-555-1212", "415-555-1234"]がある場合、2番目の電話番号を削除するには、コンテンツにメンバー"Phone":["999-555-1212"]があるパッチを使用できます。

関連項目:

IETF RFC7396 (JSONマージ・パッチの定義)

Oracle Database SQL言語リファレンス(SQLファンクションjson_mergepatchの詳細)

例11-1 JSONマージ・パッチ・ドキュメント

例2-1に示したドキュメントに適用される場合、このJSONマージ・パッチ・ドキュメントでは、次のことが実行されます。

メンバー"Category" : "Platinum"を追加します。

フィールドShippingInstructionsを持つメンバーを削除します。

フィールドSpecial Instructionsの値を文字列"Contact User SBELL"に置き換えます。フィールドLineItemsの値を空の配列[]に置き換えます

メンバー"AllowPartialShipment" : nullをメンバー"Allow Partial Shipment": falseに置き換えます(フィールド値がすでにfalseであったため、実質的にはフィールドの名前が変更されます)。

{ "Category" : "Platinum", "ShippingInstructions" : null, "Special Instructions" : "Contact User SBELL", "LineItems" : [], "AllowPartialShipment" : null,

コピー

87

Page 88: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"Allow Partial Shipment" : false }

例11-2 マージ・パッチ適用されたJSONドキュメント

この例は、例2-1のドキュメントを例11-1のパッチでマージ・パッチ適用した結果のドキュメントを示しています。

{ "PONumber" : 1600,

"Reference" : "ABULL-20140421",

"Requestor" : "Alexis Bull",

"User" : "ABULL",

"CostCenter" : "A50",

"Special Instructions" : "Contact User SBELL", "Allow Partial Shipment" : false, "LineItems" : [], "Category" : "Platinum" }

例11-3 JSONマージ・パッチを使用したJSON列の更新

この例では、j_purchaseorder.po_documentのすべてのドキュメントを更新して、フィールド"Special Instructions"を削除します。

UPDATE j_purchaseorder SET po_document = json_mergepatch(po_document, '{"Special Instructions":null}');

例11-4 選択したJSONドキュメントの即時更新

この例では、j_purchaseorder.po_document内のすべてのドキュメントを選択し、フィールド"Special Instructions"が削除されたドキュメントのフォーマット出力の更新済のコピーを返します。

SELECT json_mergepatch(po_document, '{"Special Instructions":null}' RETURNING CLOB PRETTY)

FROM j_purchaseorder;

関連項目

コピー

コピー

コピー

88

Page 89: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONデータの挿入、更新およびロードの概要

JSON用のPL/SQLオブジェクト型の使用

SQL問合せファンクションおよび条件で使用されるエラー句

SQL問合せファンクションで使用されるRETURNING句

親トピック: JSONデータの挿入、更新およびロード

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

89

Page 90: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第IV部 JSONデータの問合せJSONデータの問合せには、単純なドット表記法を使用できます。また、より多くの機能が必要な場合には、SQL/JSONファンクションおよび条件を使用できます。一連のJSON文書の構造および型の情報をまとめたデータ・ガイドを作成して問い合せることができます。

JSONデータをデータベース格納する際には、標準のデータ型(VARCHAR2、BLOBおよびCLOB)が使用されるため、JSONデータに対するSQL問合せは、他のデータベース・データと同じように実行されます。

特定のJSONフィールドに問合せを実行するために、または、特定のJSONフィールドをSQL列にマッピングするために、SQL/JSONパス言語を使用できます。最もシンプルな形式のパス式は、ピリオド(.)で区切られた1つ以上のフィールド名から構成されます。より複雑なパス式には、フィルタと配列索引を含められます。

Oracleでは、JSONコンテンツの問合せに2つの方法を提供しています。

ドット表記法構文。これは、基本的には表の別名で、その後にJSON列名と1つ以上のフィールド名が、すべてピリオド(.)で区切られて表されます。各フィールド名の後に配列ステップが続く場合があります。この構文は、簡単に使用できるように、また、可能な場合にはJSON値を戻すように設計されています。SQL/JSONファンクションおよび条件。パス言語を完全にサポートし、ドット表記法構文で可能な範囲よりも強力で柔軟性があります。Oracle Databaseに格納されているJSONデータを作成、問合せおよび操作するために、使用できます。

条件json_existsは、JSONデータ内に特定の値が存在するかどうかをテストします。条件is jsonおよびis not jsonは、データが整形式のJSONデータであるかどうかをテストします。前者は、特にチェック制約として使用します。ファンクションjson_valueは、JSONデータからSQL値としてスカラー値を選択します。

90

Page 91: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ファンクションjson_queryは、JSON値を表すSQL文字列として1つ以上の値をJSONデータから選択します。特に、JSON文書のフラグメント(通常はJSONオブジェクトまたは配列)を取得するために使用されます。ファンクションjson_tableは、JSONデータを仮想表として投影します(これは、インライン・ビューとみなすこともできます)。

パス言語は問合せ言語の一部であるため、データに固定スキーマが課されることはありません。この設計は、スキーマレスな開発をサポートします。実際には、「スキーマ」は、特定のパスを指定することで問合せ時にその場で定義されます。これは、SQLでスキーマ(表の行と列のセット)がデータの格納時に定義されるという、より一般的なアプローチとは対照的です。

Oracle SQL条件json_equalはパス式の引数を受け入れません。2つのJSON値を比較し、同じであればtrueを戻し、それ以外の場合はfalseを戻します。この比較では、無意味な空白および無意味なオブジェクト・メンバーの順序は無視されます。たとえば、JSONオブジェクトに同じメンバーがある場合、その順序に関係なく、これらのオブジェクトは等しくなります。ただし、2つの比較されたオブジェクトのいずれかに1つ以上のフィールドの重複がある場合、json_equalによって戻される値は特定されません。

JSONデータ・ガイドを生成して問合せを行い、JSONコンテンツのナビゲーションに役立てることができます。データ・ガイドを利用することで、JSON文書の構造および型の情報を深く理解できます。データ・ガイドの情報は、追加した新しい文書をトラッキングするために、自動更新されるようにできます。

関連項目:

SQL/JSONファンクションおよび条件の構文およびセマンティクスの詳細は、『Oracle DatabaseSQL言語リファレンス』を参照してください

JSONデータに対する単純なドット表記法アクセスドット表記法は、簡単で一般的な、共通するユースケース向けに設計されています。ドット表記法構文を使用したJSONデータの問合せでは、可能な場合は必ずJSON値が戻されます。

SQL/JSONパス式Oracle Databaseでは、SQL/JSONパス式を使用したJSONデータへのSQLアクセスが提供されます。

SQL問合せファンクションおよび条件で使用される句句RETURNING、ラッパー、エラーおよび空白フィールドについて説明します。これらは、SQLファンクションおよび条件のjson_value、json_query、json_table、json_serialize、json_mergepatch、is json、is not json、json_existsおよびjson_equalの1つ以上で使用されます。

91

Page 92: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSON条件JSON_EXISTSSQL/JSON条件json_existsでは、SQL/JSONパス式を行フィルタとして使用して、JSON文書の内容に基づいて行を選択できます。条件json_existsは、SELECT文のCASE式またはWHERE句で使用できます。

SQL/JSONファンクションJSON_VALUESQL/JSONファンクションjson_valueは、JSONデータを選択し、SQLスカラーやユーザー定義のSQLオブジェクト型またはSQLコレクション型(VARRAY、ネストした表)のインスタンスを返します。

SQL/JSONファンクションJSON_QUERYSQL/JSONファンクションjson_queryは、1つ以上の値をJSONデータから選択し、JSON値を表す文字列(VARCHAR2、CLOBまたはBLOBインスタンス)を戻します。したがって、json_queryを使用してJSON文書のフラグメントを取得できます。

SQL/JSONファンクションJSON_TABLESQL/JSONファンクションjson_tableは様々なSQLデータ型の列に特定のJSONデータを投影します。これを使用してJSON文書の一部を新規仮想表の行および列にマップしますが、これは、インラインのビューとみなすこともできます。

Oracle SQLファンクションJSON_SERIALIZEOracle SQLファンクションjson_serializeは、入力としてJSONデータ(任意のSQLデータ型、VARCHAR2、CLOBまたはBLOB)を受け取り、そのテキスト表現を返します。

JSONデータ・ガイドJSONデータ・ガイドを使用すると、Oracle Databaseに格納されたJSON文書の構造と内容に関する情報を検出できます。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

92

Page 93: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

12 JSONデータに対する単純なドット表記法アクセスドット表記法は、簡単で一般的な、共通するユースケース向けに設計されています。ドット表記法構文を使用したJSONデータの問合せでは、可能な場合は必ずJSON値が戻されます。

ドット表記法の問合せに対する戻り値は常に、JSONデータを表す文字列(データ型VARCHAR2(4000))です。文字列の内容は、次のように対象のJSONデータによって決まります。

単一のJSON値が対象である場合、この値はJSONスカラー、オブジェクトまたは配列のいずれであるかに関係なく文字列内容です。複数のJSON値が対象である場合、文字列の内容は、これらの値が要素であるJSON配列です。

この動作は、SQL/JSONファンクションjson_valueおよびjson_queryとは対照的です。これらの関数は、より複雑な問合せに使用できます。これらの関数は、指定したパス式が問合せ対象のJSONデータと一致しない場合には、NULLを戻すか、エラーを発生させます。また、オプションの句を受け入れるため、そこで戻り値のデータ型の指定(RETURNING句)、複数の値を配列としてラップするかどうか(ラッパー句)、通常のエラーの処理方法(ON ERROR句)、欠落したJSONフィールドの処理方法(ON EMPTY句)を指定できます。

前述の最初の事例におけるドット表記法の動作は、スカラー値の場合はjson_value関数の動作と似ており、オブジェクトまたは配列値の場合はjson_queryの動作と似ています。2番目の事例における動作は、配列ラッパーを使用したjson_queryの動作と似ています。

ドット表記法構文は、表の別名(必須)に続いて、ドット(つまりピリオド(.))、JSON列の名前、.json_fieldの形式または. json_fieldに続いてarray_stepの形式の1つ以上のペアが続きます。このjson_fieldはJSONフィールド名で、array_stepは配列ステップ式です(基本的なSQL/JSONパス式の構文で説明しています)。

93

Page 94: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

各json_fieldは有効なSQL識別子である必要があり 、列にはis jsonチェック制約が設定されている必要があり、これにより、整形式のJSONデータが含まれるようにします。これらの規則のどちらも順守されない場合、問合せのコンパイル時にエラーが発生します。(エラーの発生を回避するには、チェック制約が存在する必要があります。ただし、これは、アクティブである必要はありません。制約を非アクティブ化すると、このエラーは発生しません。)

JSON問合せのドット表記法の場合、SQLの一般的な事例とは異なり、引用符で囲まれていない識別子(列名の後ろ)は、大文字と小文字を区別して(つまり、引用符で囲まれているかのように)処理されます。これは大変都合がよく、JSONフィールド名を引用符で囲まなくても識別子として使用できます。たとえば、jcolumn."friends"ではなく、jcolumn.friendsと入力してかまいません。また、このことは、JSONオブジェクトが大文字を使用して名前を付けられている場合(FRIENDSなど)、jcolumn.friendsではなくjcolumn.FRIENDSと書く必要があることを意味します。

次に、ドット表記法構文の例をいくつか示します。これらはすべて、poという別名を持つ表のJSON列po_documentを参照しています。

po.po_document.PONumber – フィールドPONumberの値。

po.po_document.LineItems[1] – 配列LineItemsの2つ目の要素(配列の位置は0が基準)。po.po_document.LineItems[*] – 配列LineItemsのすべての要素(*はワイルドカード)。po.po_document.ShippingInstructions.name – オブジェクトShippingInstructionsの子であるフィールドnameの値。

ノート:

ドット表記法構文の各コンポーネントは最大128バイトに制限されています。SQLドット表記法構文およびSQL識別子の詳細は、Oracle Database SQL言語リファレンスを参照してください。

単純なドット表記法のJSON問合せでは、4Kバイトよりも長い値は戻せません。値がこの制限を超えると、かわりにSQL NULLが戻されます。実際の値を取得するには、ドット表記法のかわりにSQL/JSONファンクションjson_queryまたはjson_valueを使用し、RETURNING句で適切な戻り型を指定します。JSONドット表記法構文の詳細は、Oracle Database SQL言語リファレンスを参照してください。

JSONデータに対するJSONドット表記法の式の照合は、SQL/JSONパス式の場合と同じであり、これには、暗黙の配列反復を許可する緩和が含まれます(SQL/JSONパス式の構文の緩和を参照)。ドット表記法の式のJSON列はパス式のコンテキスト項目に相当し、ドット表記法で使用される各識別子は、パス式で使用される各識別子に相当します。

Foot 1

94

Page 95: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

たとえば、JSON列jcolumnがパス式のコンテキスト項目に相当する場合、式jcolumn.friendsはパス式$.friendsに相当し、jcolumn.friends.nameはパス式$.friends.nameに相当します。

後者の例の場合、コンテキスト項目はオブジェクトでもオブジェクトの配列でもかまいません。これがオブジェクトの配列である場合、配列内の各オブジェクトはフィールドfriendsに対して照合されます。フィールドfriendsの値自体はオブジェクトでもオブジェクトの配列でもかまいません。後者の場合、配列内の最初のオブジェクトが使用されます。

ノート: (1)配列要素に対してワイルドカードを暗黙で使用する(SQL/JSONパス式の構文の緩和を参照)、(2)配列の大カッコ間にワイルドカードを明示的に使用する([*])以外に、ドット表記法構文を使用する際には、パス式でワイルドカードを使用することはできません。これは、アスタリスク(*)が有効なSQL識別子ではないためです。たとえば、次のように指定すると構文エラーが発生します:mytable.mycolumn.object1.*.object2。ドット表記法構文は、単純なパス式の使用に対する便利な代替手段ですが、一般的なパス式の使用の代用手段ではありません。

例12-1は、ドット表記法の問合せとjson_valueの問合せの対応を示しています。例4-2のデータが与えられた場合、各問合せにより、文字列"1600" (JSON数値1600を表すVARCHAR2値)が戻されます。

例12-2は、ドット表記法の問合せとjson_queryの問合せの対応を示しています。最初のペアの各問合せにより、電話オブジェクトのJSON配列(を表す値VARCHAR2)が戻されます。2番目のペアの各問合せにより、例17-1の場合のように、電話のタイプの配列(を表すVARCHAR2値)が戻されます。

関連項目:

SQLオブジェクトおよびオブジェクト属性へのアクセス(オブジェクト・アクセス式)に使用されるドット表記法の詳細は、Oracle Database SQL言語リファレンスを参照してください。

例12-1 JSONドット表記法の問合せとJSON_VALUEの比較

SELECT po.po_document.PONumber FROM j_purchaseorder po;

SELECT json_value(po_document, '$.PONumber') FROM j_purchaseorder;

コピー

95

Page 96: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例12-2 JSONドット表記法の問合せとJSON_QUERYの比較

SELECT po.po_document.ShippingInstructions.Phone FROM j_purchaseorder po;

SELECT json_query(po_document, '$.ShippingInstructions.Phone')

FROM j_purchaseorder;

SELECT po.po_document.ShippingInstructions.Phone.type FROM j_purchaseorder po;

SELECT json_query(po_document, '$.ShippingInstructions.Phone.type'

WITH WRAPPER) FROM j_purchaseorder;

関連項目

SQL/JSONパス式の概要

JSON列を含む表の作成

SQL/JSONファンクションJSON_TABLE

親トピック: JSONデータの問合せ

脚注の凡例

脚注1: これは、特に、ドット表記法構文では空白のフィールド名("")を使用できないことを意味します。

コピー

このページは役に立ちましたか?

96

Page 98: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

13 SQL/JSONパス式Oracle Databaseでは、SQL/JSONパス式を使用したJSONデータへのSQLアクセスが提供されます。

SQL/JSONパス式の概要Oracle Databaseでは、SQL/JSONパス式を使用したJSONデータへのSQLアクセスが提供されます。

SQL/JSONパス式の構文SQL/JSONパス式は、パスの部分を選択するためにSQL/JSONファンクションおよび条件によってJSONデータと照合されます。パス式にはワイルドカードおよび配列範囲を使用できます。照合では大文字/小文字が区別されます。

SQL/JSONパス式の項目メソッドSQL/JSONパス式で使用可能なOracle項目メソッドについて説明します。

ISO 8601の日時のサポート国際標準化機構(ISO)の標準8601は、日付と時間を表すために国際的に受け入れられている方法について説明しています。Oracle Databaseでは、ISO 8601の日付と時刻の形式の多くをサポートしています。

比較における型SQL/JSONパス式のフィルタ条件における比較では、コンパイル時に静的に型が指定されます。比較のオペランドの有効な型が同じであると認識されない場合、型キャストでの調整が行われることがあります。

親トピック: JSONデータの問合せ

13.1 SQL/JSONパス式の概要Oracle Databaseでは、SQL/JSONパス式を使用したJSONデータへのSQLアクセスが提供されます。

JSONは、JavaScript値の表記法です。JSONデータがデータベースに格納されている場合、XMLデ

98

Page 99: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ータ用のXQueryまたはXPath式とある程度似たパス式を使用してこのデータを問い合せることができます。SQL/XMLでXQuery式を使用してXMLデータに対するSQLのアクセスが許可されるのと同じように、Oracle Databaseでは、SQL/JSONパス式を使用してJSONデータに対するSQLのアクセスが提供されます。

SQL/JSONパス式の構文は単純です。パス式では、この式と一致するかこの式を満たす0(ゼロ)個以上のJSON値が選択されます。

SQL/JSON条件json_existsの場合、少なくとも1つの値が一致する場合はtrueが戻され、一致する値がない場合はfalseが戻されます。単一の値が一致した場合、この値がスカラーである場合はSQL/JSONファンクションjson_valueによってこの値が戻され、スカラーでない場合はエラーが発生します。パス式に一致する値がない場合は、json_valueによってSQL NULLが戻されます。

SQL/JSONファンクションjson_queryは、一致する値をすべて戻します。つまり、この関数は複数の値を戻すことができます。この動作は、XQueryの場合のように値のシーケンスを戻す動作とみなすことも、複数の値を戻す動作とみなすこともできます。(ユーザーから見えるシーケンスが現れることはありません。)

どのような場合でも、パス式の照合では、パス式の各ステップを順番に照合しようとします。いずれかのステップの照合が失敗すると、後続のステップの照合は行われず、パス式の照合は失敗します。各ステップの照合が成功すると、パス式の照合は成功します。

関連項目

SQL/JSONパス式の構文

親トピック: SQL/JSONパス式

13.2 SQL/JSONパス式の構文SQL/JSONパス式は、パスの部分を選択するためにSQL/JSONファンクションおよび条件によってJSONデータと照合されます。パス式にはワイルドカードおよび配列範囲を使用できます。照合では大文字/小文字が区別されます。

SQL/JSONパス式およびJSONデータをSQL/JSONファンクションまたは条件に渡します。パス式はデータに対して照合され、一致するデータが特定のSQL/JSONファンクションまたは条件によって処理されます。この照合プロセスは、パス式が一致データを関数または条件に戻すという観点で検討することができます。

基本的なSQL/JSONパス式の構文SQL/JSONパス式の基本的な構文を示します。これは、コンテキスト項目記号($)とその後のゼロ個以上のオブジェクト、配列および子孫ステップで構成されます。それぞれの後にフィルタ式を続けることができ、オプションでファンクション・ステップを指定できます。例を

99

Page 100: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

示します。

SQL/JSONパス式の構文の緩和暗黙的な配列のラップおよびアンラップを可能にするため、SQL/JSONパス式の基本的な構文は緩和されています。これは、データが発展して特定のJSON値のかわりにこのような値の配列が使用される(またはこの逆)場合、コード内のパス式を変更する必要がないことを意味します。例を示します。

関連項目

厳密なJSON構文と緩慢なJSON構文について

基本的なSQL/JSONパス式の構文の図

親トピック: SQL/JSONパス式

13.2.1 基本的なSQL/JSONパス式の構文SQL/JSONパス式の基本的な構文を示します。これは、コンテキスト項目記号($)とその後のゼロ個以上のオブジェクト、配列および子孫ステップで構成されます。それぞれの後にフィルタ式を続けることができ、オプションでファンクション・ステップを指定できます。例を示します。

ただし、この基本的な構文は、非配列パターンに対する配列の照合および配列パターンに対する非配列の照合の緩和によって拡張されます。SQL/JSONパス式の構文の緩和を参照してください。

SQL/JSONパス式に対するデータの照合では、大/小文字が区別されます。

SQL/JSONの基本的なパス式(ここでは単にパス式とも呼びます)は、絶対パス式または相対パス式です。

絶対パス式は、パス式のコンテキスト項目(つまり、照合するJSONデータ)を表すドル記号($)から始まります。このデータは、SQL/JSONファンクションに引数として渡されたSQL式の評価結果です。ドル記号の後にゼロ個以上の非ファンクション・ステップが続き、その後にオプションのファンクション・ステップが続きます。

相対パス式は、アット・マーク(@)の後にゼロ個以上の非ファンクション・ステップが続き、その後にオプションのファンクション・ステップが続く形式です。ドル記号($)のかわりにアット・マークを使用する点を除き、絶対パス式と同じ構文になります。

相対パス式はフィルタ式(フィルタと短縮される)内で使用されます。アット・マークは、パス式のカレント・フィルタ項目(相対パス式を含むフィルタに先行する(周囲の)パス式の部分に一致するJSONデータ)を表します。相対パス式は、絶対パス式がコンテキスト項目に対して照合されるのと同じように、カレント・フィルタ項目に対して照合されます。非ファンクション・ステップは、オブジェクト・ステップ、配列ステップまたは子孫ステップの後にオプションのフィルタ式が続く形式です。

単一のファンクション・ステップは、基本パス式(絶対または相対)ではオプションです。こ

100

Page 101: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

のステップがあったら、これがパス式の最後のステップになります。これはピリオド(.) (ドットと呼ぶこともある)の後にSQL/JSON項目メソッドが続き、その後に左カッコ(()および右カッコ())が続く形式です。これらのカッコの中にホワイトスペースを入れることができます(このようなホワイトスペースは重要ではありません)。項目メソッドは、同じパス式内の残りの部分、かつファンクション・ステップに先行する部分が対象とするデータに適用されます。項目メソッドは、目的のデータを変換するために使用されます。引数としてパス式に渡されたSQLファンクションまたは条件は、対象データのかわりとして変換済データを使用します。オブジェクト・ステップは、ピリオド(.)の後にオブジェクト・フィールド名またはすべてのフィールド(の値)を表すアスタリスク (*)ワイルドカードが続く形式です。フィールド名は空にすることができます。この場合は、""(ホワイトスペースなし)と記述する必要があります。空でないフィールド名は、大文字または小文字の文字A-Zで始まり、このような文字または10進数字(0-9)のみを含む必要があり、それ以外の場合は、二重引用符(")で囲む必要があります。オブジェクト・ステップは、指定されたフィールドの値を戻します。フィールドにワイルドカードが使用されている場合、すべてのフィールドの値が特に順序は指定されずに戻されます。配列ステップは、左大カッコ([)の後ろに、すべての配列要素を表すアスタリスク(*)ワイルドカードまたはカンマ(,)で区切られた1つ以上の特定の配列索引または範囲指定のどちらかが続き、その後ろに右大カッコ(])が付いた形式です。アスタリスクと配列索引または範囲指定の両方を使用すると、エラーが発生します。パス式では、配列に対するJavaScript変換の場合のように、配列索引付けは0を基準として行われます(0、1、2、...)。範囲指定の形式はNからMです。NとMは配列索引であり、Nは厳密にM未満となります。 NがM未満ではない場合は、問合せのコンパイル時にエラーが発生します。

索引または範囲指定を使用する場合、一括して指定される配列要素は、反復せずに昇順で指定する必要があり、そうでない場合はコンパイル時にエラーが発生します。たとえば、[3,1 to 4]、[4, 2]、[2, 3 to 3]および[2, 3, 3]のぞれぞれでエラーが発生します。最初の2つでエラーが発生するのは順序が昇順でないためで、残りの2つでエラーが発生する理由は、配列索引3 (索引付けが0を基準にしているため、4つ目の配列要素の索引になる)が繰り返されているためです。

同様に、照合の結果として生じる配列値内の要素は昇順であり、反復は行われません。パス式にアスタリスクが使用される場合、すべての配列要素が配列順序で戻されます。子孫ステップでは、2つの連続したピリオド(..)(ドット・ドットとも呼ばれる)の後にフィールド名を指定します(オブジェクト・ステップの場合と同じ構文)。

これは、直前のステップ(前のステップがない場合はコンテキスト項目)と一致するオブジェクトまたは配列で、再帰的に子孫を参照します。

脚注1

101

Page 102: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

各子孫レベルでは、各オブジェクトおよびオブジェクトである各配列要素について、指定された名前を持つすべてのフィールドの値が収集されます。収集されたフィールド値をすべて返します。

たとえば、次の問合せとデータについて考えます。

json_query(some_json_column, '$.a..z' WITH ARRAY WRAPPER)

{ "a" : { "b" : { "z" : 1 }, "c" : [ 5, { "z" : 2 } ], "z" : 3 } "z" : 4 }

この問合せでは[1,2,3]のような配列が返され、その要素は1、2および3になります。ドット・ドット(..)の直前のステップ、つまりフィールドa内の各フィールドzの値が収集されます。値4の最上位のフィールドzは、フィールドaの値内にないため一致しません。

フィールドaの値は、子孫が参照されるオブジェクトです。

zというフィールドがあり、その値(3)が収集されます。また、値がオブジェクトであるフィールドbもあります。これは、フィールドzの値(1)を収集するために子孫が参照されます。値が配列であるフィールドcもあり、この配列には、値(2)が収集されるフィールドzを持つオブジェクトである要素があります。

したがって、収集されるJSON値は3、1および2です。これらの値は未定義の順序で配列にラップされます。可能性のある戻り値の1つは、[1,2,3]です。

フィルタ式(フィルタと短縮される)は、疑問符(?)の後カッコ(())で囲まれたフィルタ条件を記述します。条件が満たされるとフィルタが満たされ、trueが戻されます。フィルタ条件では、その引数に述語(ブール型関数)が適用されます。次のいずれかが該当します。この例の、cond、cond1およびcond2が、フィルタ条件を表します。

( cond ): カッコを使用してグループ化することで、前後にあるその他のフィルタ条件から、フィルタ条件condを1つのユニットとして区別します。

cond1 && cond2: cond1とcond2の論理積(and)で、両方を満たす必要があります。

cond1 || cond2: cond1およびcond2の包含的論理和(or)で、cond1、cond2またはその両方を満たす必要があります。

コピー

コピー

102

Page 103: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

! ( cond ): condの否定を表し、condが満たされてはならないことを意味します。

exists (、単純な相対パス式、): 対象となるデータが存在する条件。

比較(次のいずれか)

相対パス式、その後に比較述語、その後にJSONスカラー値またはSQL/JSON変数のいずれか。

JSONスカラー値またはSQL/JSON変数のいずれか、その後に比較述語、その後に相対パス式。

JSONスカラー値、その後に比較述語、その後に別のJSONスカラー値。

相対パス式の後にhas substring、starts with、like、like_regexまたはeq_regexが続き、その後にJSON文字列またはSQL文字列(データベース文字セットからUTF8に自動的に変換される)にバインドされているSQL/JSON変数が続きます。

has substringは、一致するデータ値に部分文字列として指定された文字列が含まれていることを意味します。starts withは、一致するデータ値に接頭辞として指定された文字列が含まれていることを意味します。likeは、JSON文字列データ値が、SQL LIKE4文字セット・セマンティクスを使用するSQL LIKEパターンとして解釈される指定された文字列と一致することを意味します。パターン内のパーセント記号(%)は、ゼロ個以上の文字に一致します。アンダースコア(_)は1文字と一致します。

ノート: SQL LIKEの場合とは異なり、パス式の述語likeにはエスケープ文字がありません。また、likeパターンで文字`、つまりグレーブ・アクセント記号(U+0060)を使用しないことをお薦めします。バッククォートやバックティックとも呼ばれるこの文字は、将来使用するために予約されています。

like_regexは、JSON文字列データ値が、SQL LIKE4文字セット・セマンティクスを使用するSQL REGEXP LIKE正規表現パターンとして解釈される指定された文字列と一致することを意味します。like_regexはパターン一致比較の例外です。パターンが空のJSON文字列("")と一致するためです。

eq_regexはlike_regexと同様ですが、次の2つの違いがあります。

eq_regexは、JSON文字列データ値全体に対する正規表現パターンと一致します。完全な文字列は、比較対象のパターンと一致する必要があります。like_regexは、JSON文字列の一部がパターンと一致す

103

Page 104: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

る場合に満たされます。eq_regexパターンが空のJSON文字列("")と一致しません。

これらのすべての述語について、空の文字列("")のパターンは空の文字列のデータに一致します。また、like_regex以外のすべてで、空でない文字列であるパターンは空の文字列のデータと一致しません。like_regexの場合、空でないパターンは空の文字列データと一致します。相対パス式の後にinが続き、その後に値リストが続きます。つまり、値が値リストにある値のいずれかになります。

比較述語は==、<>、!=<a id="fn_2" name="fn_2" href="#fn_2" onclick='footdisplay(2, "!=is an Oracle alias for the SQL/JSON standard comparison predicate <>.")'>、<、<=、>=または>です(それぞれ等しい、等しくない、未満、以下、以上、より

大きい)。SQL/JSON変数は、ドル記号($)の後に、json_existsのPASSING句内にバインドされるSQL識別子の名前が続きます。値リストは、(の後に、1つ以上のスカラー値およびSQL/JSON変数をカンマ(,)で区切ったリストが続き、その後に)が続く形式です。

このように、フィルタ条件で使用できる述語は、&&、||、!、exists、==、<>、!=、<、<=、>=、>およびinです。

例を示します。次の基準の両方が満たされると、フィルタ条件(a || b) && (!(c) || d< 42)が満たされることになります。

aとbのフィルタ条件のうち、少なくともいずれか1つが満たされる: (a || b)

フィルタ条件cが満たされない、は数値dが42以下になる、またはその両方が当てはまる: (!(c) || d < 42)

比較述語!、&&、||は、この順番で優先度が高くなります。カッコは、常にグループ化を制御するために使用できます。グループ化のためのカッコを使用しないと、前述の例はa || b && !(c) || d < 42のようになり、次の条件の少なくともいずれか1つが満たされた場合に、この式が満たされます。

条件b && !(c)が満たされる。つまり、条件bと!(c)がそれぞれ満たされることを意味する(つまり、条件cは満たされない)。

条件aが満たされる。

条件d < 42が満たされる。

比較の少なくとも一方をSQL/JSON変数にすることはできません。比較のデフォルトの型は、非変数側の型に基づいてコンパイル時に定義されます。型指定項目メソッドを使用すると、このデフ

注2

104

Page 105: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ォルトを別の型でオーバーライドできます。一致するデータの型は、比較のために自動的に変換され、決定された型(デフォルトまたは項目メソッドで指定)に適合します。たとえば、$.a >5では5が数値であるため、数値の比較が課され、$.a > "5"では"5"が文字列であるため、文字列の比較が課されます。

ノート: 強力な全文検索の場合は、Oracle SQLファンクションjson_textcontainsを使用します。この場合、JSON検索索引を作成する必要があります。あまり強力ではない代替方法として、JSON検索索引を作成せず、フィルタ条件に単純な文字列パターン一致のみが必要な場合は、パターン一致比較のいずれかを使用できます(hassubstring、starts with、like、like_regexまたはeq_regex)。

パス式の例を次に示しますが、その意味も詳述しています。

$ - コンテキスト項目。

$.friends - コンテキスト項目オブジェクトのフィールドfriendsの値。ドル記号($)の直後のドット(.)は、コンテキスト項目がJSONオブジェクトであることを示します。

$.friends[0] - コンテキスト項目オブジェクトのフィールドfriendsの値である配列の最初の要素であるオブジェクト。大カッコ表記法は、フィールドfriendsの値が配列であることを示します。$.friends[0].name - コンテキスト項目オブジェクトのフィールドfriendsの値である配列の最初の要素であるオブジェクトのフィールドnameの値。2番目のドット(.)は、配列friendsの最初の要素が(フィールドnameを持つ)オブジェクトであることを示します。

$.friends[*].name - コンテキスト項目オブジェクトのフィールドfriendsの値である配列の各オブジェクトのフィールドnameの値。

$.*[*].name - コンテキスト項目オブジェクトのフィールドの配列値に含まれる各オブジェクトのフィールドnameの値。

$.friends[3, 8 to 10, 12] – 配列friends(コンテキスト項目オブジェクトのフィールド)の4番目、9番目から11番目、13番目の要素。要素は昇順に指定する必要があり、戻される順序は、4番目、9番目、10番目、11番目、13番目の順です。$.friends[3].cars - 配列friendsの4番目の要素であるオブジェクトのフィールドcarsの値。ドット(.)は、4番目の要素が(フィールドcarsを持つ)オブジェクトであることを示します。$.friends[3].* - 配列friendsの4番目の要素であるオブジェクトのすべてのフィールドの値。$.friends[3].cars[0].year – 配列friendsの4番目の要素であるオブジェクトのフィールドcarsの値である配列の最初の要素であるオブジェクトのフィールドyearの値。

$.friends[3].cars[0]?(@.year > 2016) – 配列cars (配列friendsの4番目の要素で

105

Page 106: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

あるオブジェクトのフィールド)の最初のオブジェクト。ただし、そのフィールドyearの値が2016よりも大きいか、2016よりも大きい数値に変換できるもの。"2017"などのyear値は、テストを満たす数値2017に変換されます。"recent"などのyear値は、一致せず、テストに失敗します。$.friends[3].cars[0]?(@.year.number() > 2016) - 前と同じです。項目メソッドnumber()は数値に変換できる数値または文字列値のみを許可し、その動作は数値比較述語>によってすでに指定されています。

$.friends[3].cars[0]?(@.year.numberOnly() > 2016) - 前と同じですが、year値が数値の場合のみです。項目メソッドnumberOnly()は、year値が文字列数字("2017"など)である車を除外します。

$.friends[3]?(@.addresses.city == "San Francisco") – 配列friendsの4番目の要素であるオブジェクト。ただし、そのaddressesフィールドの値が、フィールドcityの値が文字列"San Francisco"のオブジェクトであるもの。

$.friends[*].addresses?(@city starts with "San ").zip - 住所cityの名前がSanで始まる、friendsのすべてのaddressesの郵便番号。(この場合、フィルタは最後のパス・ステップではありません。)

$..zip - 任意のレベルのzipフィールドのすべての値。

$.friends[3]?(@.addresses.city == "San Francisco" &&

@.addresses.state == "Nevada") – 配列friendsの4番目の要素であるオブジェクト。ただし、cityが"San Francisco"の住所に対する一致があり、stateが"Nevada"の住所に対する一致があるもの。ノート: 論理積になったフィルタ条件は、必ずしも同じオブジェクトに該当する必要はありません。このフィルタでは、cityがSan Franciscoのオブジェクトがあるかどうかと、stateがNevadaのオブジェクトがあるかどうかがテストされます。cityがSanFranciscoでstateがNevadaの両方を備えたオブジェクトがあるかどうかはテストされません。JSON_EXISTSでのフィルタの使用を参照してください。

$.friends[3].addresses?(@.city == "San Francisco" && @.state ==

"Nevada") – 配列friendsの4番目の要素であるオブジェクト。ただし、そのオブジェクトに、cityの"San Francisco"への一致と、stateの"Nevada"への一致があること。

前述の例とは異なり、この場合の論理積のフィルタ条件(フィールドcityとstate)は、同じaddressesオブジェクトに適用されます。フィルタは、その外側にある特定のaddressesオブジェクトに適用されます。

関連項目

JSON_EXISTSでのフィルタの使用

SQL問合せファンクションで使用されるRETURNING句

106

Page 107: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSONパス式の項目メソッド

SQL/JSONパス式の構文の緩和

基本的なSQL/JSONパス式の構文の図

SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句

ISO 8601日付および時間のサポート

関連項目:

ISO 8601 (ISOの日付形式の詳細)

SQL条件REGEXP LIKEの詳細は、Oracle Database SQL言語リファレンスを参照してくださいSQL条件LIKEおよびLIKE4キャラクタ・セット・セマンティクスの詳細は、Oracle DatabaseSQL言語リファレンスを参照してください

親トピック: SQL/JSONパス式の構文

13.2.2 SQL/JSONパス式の構文の緩和暗黙的な配列のラップおよびアンラップを可能にするため、SQL/JSONパス式の基本的な構文は緩和されています。これは、データが発展して特定のJSON値のかわりにこのような値の配列が使用される(またはこの逆)場合、コード内のパス式を変更する必要がないことを意味します。例を示します。

SQL/JSONパス式の基本的な構文では、SQL/JSONパス式の基本的な構文を定義しています。サポートされている実際のパス式の構文では、この定義を次のように緩和します。

パス式のステップが配列を対象としている(予測している)が、実際のデータは配列を示していない場合、データは暗黙的に配列にラップされます。パス式のステップが非配列を対象としている(予測している)が、実際のデータは配列を示している場合、配列タは暗黙的にアンラップされます。

この緩和により、次の省略が可能になります。すなわち、[*]は、オブジェクト・アクセッサ.の前にあり、オブジェクト・フィールド名が後ろに続く場合は常に省略でき、本質的に何の変更も行われません。この逆もまた真です。[*]は、オブジェクト・アクセッサ.の前に常に挿入でき、本質的に何の変更も行われません。

つまり、特定のオブジェクトの配列の各要素のフィールドpropの値を表すオブジェクト・ステップ[*].propは.propとして省略でき、単一オブジェクトのprop値を表すかのように見えるオブジェクト・ステップ.propは、オブジェクト・アクセッサが適用された配列の各要素のprop値も表します。

107

Page 108: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

これは重要な機能です。なぜなら、データが発展して特定のJSON値のかわりにこのような値の配列が使用される(またはこの逆)場合、コード内のパス式を変更する必要がないからです。

たとえば、フィールドtypeおよびnumberを伴う単一オブジェクトが値であるフィールドPhoneを持つオブジェクトがデータにもともと含まれるときに、このデータが発展して電話の配列を表す場合、単一の電話番号と一致するパス式$.Phone.numberを引き続き使用できます。パス式$.Phone.numberは、番号を選択して単一の電話オブジェクトと一致することも、各番号を選択して電話オブジェクトの配列と一致することもできます。

同様に、データに両方の種類の表現が混在する(単一の電話オブジェクトを使用するデータ・エントリ、および電話オブジェクトの配列を使用するエントリ、または両方を使用するエントリさえも存在する)場合、同じパス式を使用して、これらの異なる種類のエントリの電話情報にアクセスできます。

次に、SQL/JSONパス式の基本的な構文の項のパス式の例を、相当する式の説明とともに示します。

$.friends – 次のいずれかのフィールドfriendsの値。

(単一の)コンテキスト項目オブジェクト。

($[*].friendsに相当)コンテキスト項目配列内の各オブジェクト。

$.friends[0].name - 次のオブジェクトのいずれかのフィールドnameの値。

コンテキスト項目オブジェクトのフィールドfriendsの値である配列の最初の要素。

($.friends.nameに相当)コンテキスト項目オブジェクトのフィールドfriendsの値。($[*].friends.nameに相当)コンテキスト項目配列の各オブジェクトのフィールドfriendsの値。

($[*].friends[0].nameに相当)コンテキスト項目配列の各オブジェクトのフィールドfriendsの値である各配列の最初の要素。

コンテキスト項目はオブジェクトでもオブジェクトの配列でもかまいません。後者の場合、配列内の各オブジェクトはフィールドfriendsについて照合されます。

フィールドfriendsの値はオブジェクトでもオブジェクトの配列でもかまいません。後者の場合、配列内の最初のオブジェクトが使用されます。$.*[*].name – 次のオブジェクトのいずれかのフィールドnameの値。

コンテキスト項目オブジェクトのフィールドの配列値の要素。

($.*.nameに相当)コンテキスト項目オブジェクトのフィールドの値。

($[*].*.nameに相当)コンテキスト項目配列のオブジェクトのフィールドの値。

108

Page 109: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

($[*].*[*].nameに相当)コンテキスト項目配列のオブジェクトのフィールドの配列値の各オブジェクト。

関連項目

基本的なSQL/JSONパス式の構文

親トピック: SQL/JSONパス式の構文

13.3 SQL/JSONパス式の項目メソッドSQL/JSONパス式で使用できるOracle項目メソッドについて説明します。

項目メソッドは、このメソッドで終了するパス式(の残り)が対象とするJSONデータに適用されます。メソッドは、目的のデータを変換するために使用されます。パス式に渡されたSQLファンクションまたは条件は、対象データのかわりとして変換済データを使用します。項目メソッドのアプリケーションがフィルタとして機能し、この結果セットから対象データを削除する場合があります。

引数の型が間違っているなどのなんらかの理由で項目メソッドの変換が失敗した場合、パスは照合されず(参照データがない状態)、エラーは発生しません。このことは、特に、パス式が渡されるSQL/JSONファンクションまたは条件のエラー句でこのようなエラーが処理されないことを意味します。

配列への項目メソッドの適用

項目メソッドsize()およびtype()を除き、項目メソッドが配列を対象とする場合、このメソッドは配列自体ではなく各配列要素に適用されます。たとえば、$.a.method()は、項目メソッドmethod()を配列aの各項目に適用して変換し、配列のかわりに使用します。(このことは、実質的に、オブジェクト・ステップに対して非配列が想定される場合の配列の暗黙のアンラップと同様です。)一致の結果セットには、対象の配列ではなく、変換された配列要素が含まれます。

json_queryまたはjson_queryセマンティクスを持つjson_table列式に対して、ラッパー句を使用すると変換されたすべての配列要素値を配列として取得できます。たとえば、次のような問合せになります。

SELECT json_query('["alpha", 42, "10.4"]', '$[*].stringOnly()' WITH ARRAY WRAPPER) FROM dual;

配列["alpha", "10.4"]が返されます(VARCHAR2値として)。

コピー

109

Page 110: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

これに関して、項目メソッドsize()およびtype()は例外です。配列に適用する場合、これらの項目メソッドは、その要素を処理するかわりに配列をそのまま扱います。次に例を示します。

SELECT json_value('[19, "Oracle", {"a":1},[1,2,3]]', '$.type()')

FROM dual;

単一のVARCHAR2値'array'が返されます。

項目メソッドの説明

次の項目メソッドの説明では、対象となるJSON値が特定のSQLデータ型の値として解釈される場合があると記述されています。これは、そのSQLデータ型を含むjson_value RETURNING句で制御されたかのように処理されることを意味します。

たとえば、項目メソッドstring()は句RETURNING VARCHAR2(4000)を含むjson_valueと同じようにターゲットを解釈します。ブール値はstring()によって"true"または"false"として扱われ、null値は"null"として扱われ、数値は正準な文字列形式で表されます。

一部の項目メソッドは、対象のJSONデータをSQLのデータ型であるかのように解釈するため、RETURNING句のかわりにjson_valueとともに使用できます。また、列型を指定するかわりにjson_tableとともに使用できます。つまり、項目メソッドは、抽出されたJSONデータにSQLデータ型を指定するために使用できます。

このような項目メソッドをjson_valueのRETURNING句またはjson_tableの列型指定とともに使用することもできます。抽出されたJSONデータに使用するSQLデータ型が項目メソッドおよびjson_value RETURNING句またはjson_table列タイプの両方によって制御されている場合はどうなりますか。

2つのデータ型に互換性がある場合、RETURNING句または列のデータ型が使用されます。これらのために、VARCHAR2はVARCHAR2とCLOBの両方と互換性があります。

これらのデータ型に互換性がない場合、静的コンパイル時にエラーが発生します。

表13-1 型変換項目メソッドとRETURNINGの型の互換性

項目メソッド 互換性のあるRETURNING句のデータ型

string()またはstringOnly() VARCHAR2またはCLOB (string()がJSON null値に対してSQL NULLを返すことを除く)

number()またはnumberOnly() NUMBER

コピー

110

Page 111: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

date() DATE

timestamp() TIMESTAMP

boolean()またはbooleanOnly() VARCHAR2

RETURNING句または列指定を使用すると、文字データの長さ、および数値データの精度とスケールを指定できます。これにより、対象データの比較のために項目メソッドで指定されるものよりも、抽出に対して正確にSQLデータ型を割り当てることができます。

たとえば、項目メソッドstring()およびRETURNING VARCHAR2(150)を使用する場合、戻されるデータのデータ型はVARCHAR2(150)で、VARCHAR2(4000)ではありません。

名前に"only"が含まれるデータ型の変換メソッドは、"only"が含まれない名前の対応するメソッドと同じです。前者は、特定の型であるJSON値(numberなど)のみを関連のSQLデータ型(NUMBERなど)に変換する点が異なります。名前に"only"が含まれないメソッドは、任意のJSON値を指定したSQLデータ型に変換できます。("only"メソッドで配列を対象とする場合、変換は通常どおり、各配列要素に適用されます。)

abs(): 対象となるJSONの数値の絶対値。SQLファンクションABSの使用に対応します。

boolean(): 対象となるJSON値のSQL VARCHAR2(20)の解釈。

booleanOnly(): JSONのブール値である場合、対象となるJSONデータのSQLVARCHAR2(20)の解釈。それ以外の場合、一致はありません。フィルタとして機能し、JSONのブール値の場合のみ一致が可能です。ceiling(): 最も近い整数に切り上げられた対象となるJSONの数値。SQLファンクションCEILの使用に対応します。

date(): 対象となるJSON文字列のSQLの日付の解釈。対象となる文字列データは、サポートされているISO 8601形式のいずれかである必要があります。それ以外の場合、一致はありません。double(): 対象となるJSON文字列または数値のSQL BINARY_DOUBLEでの解釈。

floor(): 最も近い整数に切り捨てられた対象となるJSONの数値。SQLファンクションFLOORの使用に対応します。

length(): 対象となるJSON文字列内の、SQL NUMBERとして解釈される文字数。

lower(): 対象となるJSON文字列内の文字に対応する小文字の文字列。

number(): 対象となるJSON文字列または数値のSQL NUMBERの解釈。

numberOnly(): JSONのブール値である場合、対象となるJSONデータのSQL NUMBERの解釈。それ以外の場合、一致はありません。フィルタとして機能し、JSONの数値の場合のみ一致が可能です。

111

Page 112: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

size(): 配列内の要素数。あるいはスカラーまたはオブジェクトの場合は1。この項目メソッドは、json_query、json_valueおよびjson_tableとともに使用できます。配列のデータに適用される場合、配列要素に対する暗黙的な反復は発生しません。結果の値は配列要素の数に一致します。(暗黙的反復のルールに対する例外。)

string(): 対象となるスカラーのJSON値のSQL VARCHAR2(4000)の解釈。

stringOnly(): JSON文字列である場合、対象となるスカラーJSON値のSQLVARCHAR2(4000)の解釈。それ以外の場合、一致はありません。フィルタとして機能し、JSON文字列の場合のみ一致が可能です。timestamp(): 対象となるJSON文字列のSQL TIMESTAMPの解釈。対象となる文字列データは、サポートされているISO 8601形式のいずれかである必要があります。それ以外の場合、一致はありません。<a id="fn_3" name="fn_3" href="#fn_3" onclick='footdisplay(3, "Applyingitem method timestamp() to a supported ISO 8601 string <ISO-STRING> has the effect of SQLsys_extract_utc(to_utc_timestamp_tz(

type(): SQL VARCHAR2(20)値として解釈される、対象となるデータのJSONデータ型の名前。この項目メソッドは、json_query、json_valueおよびjson_tableとともに使用できます。配列のデータに適用される場合、配列要素に対する暗黙的な反復は発生しません。結果の値は"array"となります。(暗黙的反復のルールに対する例外。)

nullの値の場合、"null"。

trueまたはfalseの値の場合、"boolean"。

数値の場合、"number"。

文字列の場合、"string"。

配列の場合、"array"。

オブジェクトの場合、"object"。

upper(): 対象となるJSON文字列内の文字に対応する大文字の文字列。

項目メソッドboolean()、booleanOnly()、date()、length()、lower()、number()、numberOnly()、string()、stringOnly()、timestamp()およびupper()は、SQL/JSON標準に対するOracleの拡張機能です。その他の項目メソッドのabs()、ceiling()、double()、floor()、size()およびtype()は標準に含まれています。

関連項目

基本的なSQL/JSONパス式の構文

ISO 8601日付および時間のサポート

脚注3

112

Page 113: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

比較における型

SQL問合せファンクションで使用されるRETURNING句

SQL/JSONファンクションJSON_VALUE

SQL/JSONファンクションJSON_TABLE

SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句

親トピック: SQL/JSONパス式

13.4 ISO 8601日付および時間のサポート国際標準化機構(ISO)の標準8601は、日付と時間を表すために国際的に受け入れられている方法について説明しています。Oracle Databaseでは、ISO 8601の日付と時刻の形式の多くをサポートしています。

国際標準化機構(ISO)の標準8601は、日付と時間を表すために国際的に受け入れられている方法について説明しています。適切なOracle Databaseの日付と時刻の値として、最も一般的なISO 8601日時形式の文字列を操作できます。サポートされているISO 8601形式は、基本的に数字のみで言語に依存しない明確な形式です。

これは日付および時間に許可されている構文です。

日付(のみ): YYYY-MM-DD

日付と時刻: YYYY-MM-DDThh:mm:ss[.s[s[s[s[s[s]]]]][Z|(+|-)hh:mm]

各要素の意味は次のとおりです。

YYYYは、4桁の10進数で年を指定します。

MMは、00から12までの2桁の10進数で月を指定します。

DDは、00から31までの2桁の10進数で日を指定します。

hhは、00から23までの2桁の10進数で時間を指定します。

mmは、00から59までの2桁の10進数で分を指定します。

ss[.s[s[s[s[s]]]]]は、00から59までの2桁の10進数で秒を指定します。オプションで、小数点を1から6桁の10進数で追加します(秒の端数部分を表します)。Zは、UTC時間(タイムゾーン0)を指定します。(–00:00ではなく、+00:00で指定することもできます。)

(+|-)hh:mmは、UTCとの差異でとタイムゾーンを指定します。(+または–のいずれか1つを指定する必要があります。)

時間の値の場合、タイムゾーン部分はオプションです。これが指定されていない場合、UTC時間

113

Page 114: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

が使用されます。

他のISO 8601の日時構文はサポートされていません。具体的には、次のとおりです。

ハイフンで始まるマイナスの日付(例: –2018–10–26T21:32:52) (BCE1年より前の日付)はサポートされていません。ハイフンおよびコロンの区切り文字が必要です。いわゆる基本形式YYYYMMDDThhmmssはサポートされていません。序数の日付(年と通算日、カレンダ週と曜日番号)はサポートされていません。

年に4桁より大きい桁数を使用することは、サポートされていません。

サポートされている日付および時間は、次のとおりです。

2018–10–26T21:32:52

2018-10-26T21:32:52+02:00

2018-10-26T19:32:52Z

2018-10-26T19:32:52+00:00

2018-10-26T21:32:52.12679

サポートされていない日付と時間は、次のとおりです。

2018-10-26T21:32 (時間が指定された場合、そのすべての部分が存在する必要があります)

2018-10-26T25:32:52+02:00 (時間部分は25で、範囲外です)

18-10-26T21:32 (年がすべて指定されていません)

関連項目:

ISO 8601標準

WikipediaのISO 8601

親トピック: SQL/JSONパス式

13.5 比較における型SQL/JSONパス式のフィルタ条件での比較は、コンパイル時に静的に型を指定します。比較のオペランドの有効な型が同じであると認識されない場合、型キャストでの調整が行われることがあります。

SQL/JSONパス式がJSONデータを対象としているため、比較のオペランドはJSON値です。JSON値

114

Page 115: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

の型の比較は単純です。JSONのデータ型である文字列、数値、null、オブジェクトおよび配列は、相互に排他的であり、比較できません。

ただし、比較オペランドはSQLデータ型の値として解釈(基本的にキャスト)されることがあります。たとえば、number()などの一部の項目メソッドが使用されている場合などです。この項は、このような有効値の型チェックに対応しています。

onlyが付く項目メソッドのいずれかを使用して、明示的にこのような型キャストを回避できます。たとえば、メソッドnumberOnly()を使用すると、数値への暗黙的な型キャストが回避されます。

SQLは静的に型を指定する言語のため、型はコンパイル時に決定されます。同じことがSQL/JSONパス式に適用され、特にフィルタ条件での比較にも適用されます。これは、評価方法に関係なく(索引、マテリアライズド・ビューおよびインメモリー・スキャンなどの機能を使用するかどうかに関係なく)、問合せに対して同じ結果が得られるという意味です。

これを実現するには、次のようにします。

両方のオペランドの型が認識されており、同じである場合、型チェックが実行されます。

両方のオペランドの型が不明の場合、コンパイル時にエラーが発生します。

1つのオペランドの型が認識されていて、もう一方の型が不明な場合、後者のオペランドは前者の型にキャストされます。たとえば、$.a?(@.b.c == 3)で$a.b.cの型がコンパイル時に不明とします。パス式は、$.a?(@.b.c.number() == 3)としてコンパイルされます。実行時に、$a.b.cと一致するデータの数値へのキャストが試行されます。文字列値"3"は数値3にキャストされ、比較が実行されます。

両方のオペランドの型は認識されており、これらが異なっている場合、一方の型のもう一方の型へのキャストが試行されます。詳細を次に示します。

次の組合せで使用される比較オペランドは調整されず、コンパイル時のエラーが発生します。

double型以外の非数値型と比較される数値。

数値以外の非double型と比較されるdouble型。

double型と比較される文字列。

非ブール型と比較されるブール値。'true'または'false'の文字列値(または'tRUe'などの大/小文字のバリアント)との比較の場合を除きます。文字列がサポートされているISO 8601形式である場合を除く、文字列と比較される日付またはタイムスタンプ。文字列以外の非日付型と比較される日付。

文字列以外の非タイムスタンプ型と比較されるタイムスタンプ(タイムゾーンがある場合と

脚注4

115

Page 116: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ない場合)。JSON null以外の任意の型と比較されるJSON null。

次の組合せで使用される比較オペランドの調整の試行が、型キャストによって行われます。他のオペランドと互換性のある型にするために、型キャストの項目メソッドがオペランドのいずれかに暗黙的に適用されます。

doubleと比較される数値 — double()は暗黙的に通知に適用され、これをdouble値にします。ブールと比較される'true'または'false'の文字列値(または'tRUe'などの大/小文字のバリアント) - boolean()は暗黙的に文字列に適用され、これをブール値にします。

日付と比較されるサポートされているISO 8601形式の文字列 — date()は暗黙的に文字列に適用され、これを日付値にします。(存在する任意のタイムゾーン・コンポーネントは削除されます。)

タイムゾーンが含まれているかいないかに関係なくタイムスタンプと比較される、サポートされているISO 8601形式の文字列 — timestamp()は暗黙的に文字列に適用され、これをタイムスタンプ値にします。このため、UTCタイムゾーン(協定世界時、ゼロのオフセット)はデフォルトとして使用され、文字列で指定された任意のタイムゾーンを考慮します。

関連項目

SQL/JSONパス式の項目メソッド

ISO 8601日付および時間のサポート

親トピック: SQL/JSONパス式

脚注の凡例

脚注1: 範囲指定のtoは、配列のslice演算子と非公式に呼ばれることがあります。脚注2: !=は、SQL/JSON標準比較述語<>のOracle別名。脚注3: 項目メソッドtimestamp()をサポートされているISO 8601文字列<ISO-STRING>に適用すると、SQL sys_extract_utc(to_utc_timestamp_tz(<ISO-STRING>))の効果があります。脚注4: ここでこのようなキャストを回避するには、項目メソッドnumberOnly(): $.a?(@.b.c.numberOnly() == 3)を適用します。文字列値"3"を含むデータは一致せず、フィルタで除外されます。

116

Page 118: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

14 SQL問合せファンクションおよび条件で使用される句RETURNING、ラッパー、エラーおよび空白フィールドの句について説明します。これらは、SQLファンクションおよび条件のjson_value、json_query、json_table、json_serialize、json_mergepatch、isjson、is not json、json_existsおよびjson_equalの1つ以上で使用されます。

SQL問合せファンクションで使用されるRETURNING句SQLファンクションjson_value、json_query、json_serializeおよびjson_mergepatchは、オプションでRETURNING句を受け入れます。この句は、ファンクションから返される値のデータ型を指定します。この句についてと、デフォルト動作(RETURNING句なし)について説明します。

SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句SQL/JSON問合せファンクションのjson_queryおよびjson_tableは、オプションのラッパー句を受け入れます。これには、json_queryによって返される値、またはjson_table列のデータに使用される値の形式を指定します。この句についてと、デフォルト動作(ラッパー句なし)について説明します。例を示します。

SQL問合せファンクションおよび条件で使用されるエラー句一部のSQL問合せファンクションおよび条件は、オプションでエラー句を受け入れます。これにより、ファンクションまたは条件によって発生した実行時エラーの処理方法を指定します。この句についてと、デフォルト動作(エラー句なし)についてまとめます。

SQL/JSON問合せファンクションで使用される空白フィールド句SQL/JSON問合せファンクションのjson_value、json_queryおよびjson_tableは、オプションでON EMPTY句を受け入れます。これは、対象となるJSONフィールドが問合せデータ内にない場合の処理を指定します。この句についてと、デフォルト動作(ON EMPTY句なし)について説明します。

JSON_VALUEのON MISMATCH句

118

Page 119: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

RETURNING句でユーザー定義のオブジェクト型またはコレクション型インスタンスを指定する場合、ファンクションjson_valueには、オプションでON MISMATCH句を指定できます。この句では、対象のJSON値が指定したSQL戻り値と一致しない場合に使用する処理を指定します。この句についてと、デフォルト動作(ON MISMATCH句なし)について説明します。

親トピック: JSONデータの問合せ

14.1 SQL問合せファンクションで使用されるRETURNING句SQLファンクションjson_value、json_query、json_serializeおよびjson_mergepatchは、オプションでRETURNING句を受け入れます。この句は、ファンクションから返される値のデータ型を指定します。この句についてと、デフォルト動作(RETURNING句なし)について説明します。

json_valueの場合、VARCHAR2、NUMBER、DATE、TIMESTAMP、TIMESTAMP WITH TIMEZONE、SDO_GEOMETRYおよびCLOBの事前定義済SQLデータ型から任意のものをRETURNING句で使用できます。ユーザー定義のオブジェクト型またはコレクション型を使用することもできます。

ノート: Oracle SQLデータ型DATEのインスタンスには、時間コンポーネントを含めることができます。JSONデータでは、ISO 8601日時値を表す文字列を使用できます。つまり、時間コンポーネントを使用できます。ただし、json_valueにRETURNING DATEを指定すると、常に、ANSI日付であるSQL DATE値が返され、つまり、値には時間コンポーネントがありません。時間コンポーネントを持つSQL DATE値を返すには、RETURNING TIMESTAMPを使用し、戻り値をDATEにキャストします。次に例を示します。

SELECT cast(json_value('{"a" : "2019-01-02T12:34:56"}', '$.a' RETURNING TIMESTAMP) AS DATE) FROM DUAL;

json_query、json_serializeおよびjson_mergepatchの場合、VARCHAR2、CLOBまたはBLOBを使用できます。BLOBの結果はAL32UTF8文字セットです。json_serializeによって返されるデータ型に関係なく、返されるデータはテキストのJSONデータを表します。

必要に応じて、VARCHAR2の長さ(デフォルト: 4000)、およびNUMBERの精度とスケールを指定できます。

デフォルトの動作(RETURNING句なし)では、VARCHAR2(4000)を使用します。

コピー

119

Page 120: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

データ型SDO_GEOMETRYは、Oracle Spatial and Graphデータ向けです。特に、これは、json_valueをGeoJSONデータで使用できることを意味します。このデータは、JSONで地理データをエンコーディングするための形式です。

また、RETURNING句は、PRETTYおよびASCIIの2つのオプションのキーワードも受け入れます。両方を使用する場合は、PRETTYがASCIIの前にくる必要があります。キーワードPRETTYはjson_valueには指定できません。

キーワードPRETTYを使用すると、改行文字の挿入およびインデントにより、戻されたデータがわかりやすいように出力されます。デフォルトの動作では、わかりやすいようには出力されません。

キーワードASCIIを使用すると、標準のASCII Unicodeエスケープ・シーケンスを使用することにより、戻されるデータ内の非ASCII Unicode文字がすべて自動的にエスケープされます。デフォルトの動作では、非ASCII Unicode文字はエスケープされません。

ヒント: パス式として$のみを使用することにより、コンテキスト項目全体をわかりやすいように出力できます。

RETURNING句でVARCHAR2を指定した場合、値のスカラーは次のように表されます。

ブール値は、小文字の文字列"true"および"false"で表されます。

null値は、SQL NULLで表されます。

JSONの数値は、正準な形式で表されます。このため、JSONの数値では、出力の文字列がテキストの入力データの表現と異なる可能性があります。正準な形式で表された場合、数値は次のようになります。

SQL NUMBERの精度と範囲の制限の対象となる場合があります。

SQL NUMBERの制限事項の対象とならない場合には、次のようになります。

精度は40桁に制限されます。

オプションの指数は、9桁と1つの符号(+または-)に制限されます。

使用できる符号(-、+)、小数点(.)および指数のインジケータ(E)を含めて、テキスト全体が48文字に制限されます。

正準な形式のJSONの数値は、次のようなものです。

JSONの数値です。(JSONデータで数値として解析されます。)

先行するプラス(+)符号はありません。

必要な場合にのみ小数点(.)が使用されます。

その数値が小数(0と1の間)の場合は、小数点の前に単一のゼロ(0)が置かれます。

120

Page 121: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

必要な場合にのみ指数表記法(E)が使用されます。これが当てはまるのは、特に、出力文字数が制限されすぎている場合です(VARCHAR2(N)のNが小さいことによる)。

OracleではSQL/JSON標準を拡張し、戻りデータ型がVARCHAR2(N)の場合は、データ型の直後にオプションのキーワードTRUNCATEを指定できるようにしました。TRUNCATEが存在し、かつ戻り値がNよりも長い場合は、値が切り捨てられ、先頭N文字のみが戻されます。TRUNCATEがない場合、このケースはエラーとして扱われ、エラー句またはデフォルトのエラー処理動作によって通常どおり処理されます。

関連トピック

SQL問合せファンクションおよび条件で使用されるエラー句

JSON_VALUEを使用したユーザー定義オブジェクト型インスタンスのインスタンス化

関連項目:

SQLデータ型DATEおよびTIMESTAMPの詳細は、『Oracle Database SQL言語リファレンス』を参照してください

SQLデータ型NUMBERの詳細は、『Oracle Database SQL言語リファレンス』を参照してくださいOracle Spatial and Graphデータの使用の詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。GeoJSON.org

親トピック: SQL問合せファンクションおよび条件で使用される句

14.2 SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句SQL/JSON問合せファンクションのjson_queryおよびjson_tableは、オプションのラッパー句を受け入れます。これには、json_queryによって返される値、またはjson_table列のデータに使用される値の形式を指定します。この句についてと、デフォルト動作(ラッパー句なし)について説明します。例を示します。

ラッパー句は、次のいずれかの形式をとります。

WITH WRAPPER - パス式と一致するすべてのJSON値が含まれるJSON配列を表す文字列値を使用します。配列要素の順序は指定されません。WITHOUT WRAPPER - パス式と一致する単一のJSONオブジェクトまたは配列を表す文字列値を使用します。パス式がスカラー値(オブジェクトまたは配列ではありません)または複数の

121

Page 122: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

値と一致する場合、エラーが発生します。WITH CONDITIONAL WRAPPER - パス式と一致するすべてのJSON値を表す文字列値を使用します。0個の値、単一のスカラー値、または複数の値の場合、WITH CONDITIONALWRAPPERはWITH WRAPPERと同じです。単一のJSONオブジェクトまたは配列値の場合は、WITHOUT WRAPPERと同じです。

デフォルトの動作はWITHOUT WRAPPERです。

オプションのキーワードUNCONDITIONALは、これを使用する方が明確になる場合はキーワードWITHの直後に追加できます。WITH WRAPPERとWITH UNCONDITIONAL WRAPPERは同じことを意味します。

オプションのキーワードARRAYは、これを使用する方が明確になる場合はキーワードWRAPPERの直前に追加できます。WRAPPERとARRAY WRAPPERは同じことを意味します。

表14-1は、ラッパー句の使用可能性を示しています。配列ラッパーは太字で示されています。

表14-1 JSON_QUERYラッパー句の例

パス式と一致するJSON値 WITH WRAPPER WITHOUT WRAPPER

WITH CONDITIONALWRAPPER

{"id": 38327} (単一のオブジェクト)

[{"id": 38327}] {"id": 38327} {"id": 38327}

[42, "a", true](単一の配列)

[[42, "a",true]]

[42, "a", true] [42, "a", true]

42 [42] エラー(スカラー) [42]

42, "a", true [42, "a", true] エラー(複数の値) [42, "a", true]

なし [] エラー(値なし) []

たとえば、JSONオブジェクトを取得するためのjson_query問合せを検討してみます。パス式がオブジェクトではなくJSONスカラー値と一致した場合、または複数のJSON値(任意の種類)と一致した場合はどうなるでしょうか。エラーを発生させずに、一致した値を取得したい場合があります。たとえば、オブジェクトである値の1つを選択し、さらに処理したい場合があります。配列ラッパーを使用すると、このような処理を行うことができます。

ラッパーを使用する理由がエラーの発生を回避することのみであり、これらのエラー事例をエラーでない事例と区別する必要がない場合、条件付きラッパーが役立ちます。アプリケーションが探しているものが単一のオブジェクトまたは配列であり、パス式によって一致したデータがそのものである場合、予期した値を単一の配列にラップする必要はありません。

122

Page 123: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

一方、無条件ラッパーの場合、結果として生成される配列は常にラッパーであることが判明しています。アプリケーションはこの事実に頼ることができます。条件付きラッパーを使用する場合、アプリケーションでは、戻された配列を解析するために追加の処理を行う必要がある場合があります。たとえば、表14-1では、同じ配列([42, "a", true])が、この配列と一致するパス式、およびその各要素と一致するパス式という、まったく異なる事例に対して戻されています。

親トピック: SQL問合せファンクションおよび条件で使用される句

14.3 SQL問合せファンクションおよび条件で使用されるエラー句一部のSQL問合せファンクションおよび条件は、オプションでエラー句を受け入れます。これにより、ファンクションまたは条件によって発生した実行時エラーの処理方法を指定します。この句についてと、デフォルト動作(エラー句なし)についてまとめます。

デフォルトでは、JSON用のSQLファンクションおよび条件により、実行時エラーの発生が回避されます。たとえば、JSONデータが構文的に無効な場合、json_existsおよびjson_equalはfalseを戻し、json_valueはNULLを戻します。

ただし、場合によってはデフォルト動作をオーバーライドするエラー句を指定することもできます。指定できるエラー処理は異なりますが、エラー処理を指定可能なJSON用の各SQLファンクションおよび条件では、少なくともエラー発生のERROR ON ERROR動作がサポートされます。

オプションのエラー句は次の形式を使用できます。

ERROR ON ERROR - エラーを発生させます(特別な処理なし)。

NULL ON ERROR - エラーを発生させるかわりにNULLを戻します。

json_existsに使用できません。

FALSE ON ERROR - エラーを発生させるかわりにfalseを戻します。

デフォルトであるjson_existsおよびjson_equalにのみ使用できます。

TRUE ON ERROR - エラーを発生させるかわりにtrueを戻します。

json_existsおよびjson_equalにのみ使用できます。

EMPTY OBJECT ON ERROR - エラーを発生させるかわりに空のオブジェクト({})を戻します。json_queryにのみ使用できます。

EMPTY ARRAY ON ERROR - エラーを発生させるかわりに空の配列([])を戻します。

json_queryにのみ使用できます。

EMPTY ON ERROR – EMPTY ARRAY ON ERRORと同じ。

DEFAULT 'literal_return_value' ON ERROR - エラーを発生させるかわりに指定した

123

Page 124: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

値を戻します。値は、問合せのコンパイル時に定数である必要があります。

使用不可:

json_exists動作を含むjson_exists、json_equal、json_serialize、json_mergepatchまたはjson_table列値句の場合

json_query、またはjson_query動作を含むjson_table列値句

json_tableの低レベル・エラー処理

SDO_GEOMETRYがjson_valueのRETURNING句データ・タイプとして、またはjson_table列データ・タイプとして指定されている場合

デフォルト動作はNULL ON ERROR(条件json_existsおよびjson_equalを除く)です。

ノート: json_tableのエラー処理には2つのレベルがありますが、これらは、パス式の2つのレベルである行と列に対応しています。存在する場合、列のエラー・ハンドラにより、行レベルのエラー処理がオーバーライドされます。両レベルのデフォルトのエラー・ハンドラはNULL ON ERRORです。

ノート: 欠落フィールドの照合を試行したことによるエラーの場合、ON EMPTY句はONERRORで指定された動作より優先されます。

ノート: ON ERROR句は、構文的に正しいSQL/JSONパス式がJSONデータに対して照合されたときに発生する実行時エラーに対してのみ有効です。構文的に正しくないパス式の場合、コンパイル時エラーが発生します。これは、ON ERROR句によっては処理されません。

関連項目

SQL/JSON問合せファンクションで使用される空白フィールド句

SQL/JSONファンクションJSON_TABLE

SQL/JSONファンクションJSON_QUERY

SQL/JSONファンクションJSON_VALUE

Oracle SQLファンクションJSON_SERIALIZE

SQL/JSON条件JSON_EXISTS

JSON_VALUEのON MISMATCH句

関連項目:

JSON用のSQLファンクションのエラー句の詳細は、『Oracle Database SQL言語リファレン

124

Page 125: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ス』を参照してください

JSON用のSQL条件のエラー句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください

親トピック: SQL問合せファンクションおよび条件で使用される句

14.4 SQL/JSON問合せファンクションで使用される空白フィールド句SQL/JSON問合せファンクションのjson_value、json_queryおよびjson_tableは、オプションでON EMPTY句を受け入れます。これは、対象となるJSONフィールドが問合せデータ内にない場合の処理を指定します。この句についてと、デフォルト動作(ON EMPTY句なし)について説明します。

通常、SQL/JSONファンクションおよび条件のエラーへの対処は、エラー句(ON ERROR)を使用して行います。しかし、データ内に見つからない特定のJSONフィールドと照合するために問合せるときのように、この通常のエラー処理とは異なる対処が必要な特別なケースがあります。照合するフィールドがないという理由だけでエラーを発生させたくない場合があります。(欠落フィールドは、通常エラーとして扱われます。)

通常は、ON ERROR句と一緒にNULL ON EMPTY句を使用します。このように組み合せることにより、通常のエラーはON ERROR句に従って処理されますが、欠落フィールドの照合を試行した場合のエラーにはNULLが戻されるだけになります。このときに、ON EMPTY句がない場合は、ONERROR句で欠落フィールドのケースも処理されます。

NULL ON EMPTYの他に、ERROR ON EMPTYとDEFAULT ... ON EMPTYも使用できます。これらは、同様の名前を持つON ERROR句と類似しています。

ON EMPTY句のみがある(ON ERROR句がない)場合、欠落フィールドの動作はON EMPTY句によって指定され、その他のエラーは、NULL ON ERROR句がある場合と同じ方法で処理されます(これがON ERRORのデフォルト)。どちらの句もない場合には、NULL ON ERRORのみが使用されます。

JSON_VALUEで作成された索引に対するNULL ON EMPTYの使用

NULL ON EMPTYは、json_value式で作成される関数索引の場合に特に便利です。この句は、索引の選択を行うかどうか、またはいつ行うかへの影響は持ちませんが、json_value式の対象であるフィールドが欠落しているために索引付けが行われない一部のデータでインデックス付けが行われるようにすることを許可する際に有効です。

索引を移入する問合せには、通常ERROR ON ERRORを使用することによって、問合せパス式の結

125

Page 126: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

果が複数の値や複雑な値になったときはエラーが発生するようにします。しかし、パス式の対象フィールドが欠落しているだけはエラーを発生させずに、そのデータをインデックス付けする場合があります。例26-5は、json_value式で索引を作成するときのNULL ON EMPTYの使用方法を示しています。

関連項目

JSON_VALUE関数ベースの索引の作成

SQL問合せファンクションおよび条件で使用されるエラー句

親トピック: SQL問合せファンクションおよび条件で使用される句

14.5 JSON_VALUEのON MISMATCH句RETURNING句でユーザー定義のオブジェクト型またはコレクション型インスタンスを指定する場合、ファンクションjson_valueには、オプションでON MISMATCH句を指定できます。この句では、対象のJSON値が指定したSQL戻り値と一致しない場合に使用する処理を指定します。この句についてと、デフォルト動作(ON MISMATCH句なし)について説明します。

ノート: ON ERROR句およびON EMPTY句は、パス式に一致するJSONデータがない場合にのみ適用されます。パス式に一致するJSONデータが、指定されたオブジェクトまたはコレクションの戻り型と一致しない場合は、ON MISMATCHが句が適用されます。戻り型がユーザー定義のオブジェクト型またはコレクション型のインスタンスである場合にのみ、ON MISMATCH句を使用できます。別の戻り型で使用する場合は、問合せのコンパイル時エラーが発生します。

json_valueファンクションが対象とするJSONデータを反映するSQLオブジェクト型またはコレクション型のインスタンスを返す場合、その対象とするデータと、返されるオブジェクトまたはコレクションの定義が一致する必要があります。一致しない場合、問合せのコンパイル時エラーが適用されます。

このようなエラーのデフォルト処理は、無視するだけです。ただし、次のように1つ以上のONMISMATCH句を指定して、このようなエラーを様々な方法で処理できます。

IGNORE ON MISMATCH: デフォルトの動作(不一致を無視)を明示的に指定します。返されるオブジェクトまたはコレクションのインスタンスには、対象のJSONデータに対する不一致のため、1つ以上のSQL NULL値を含めることができます。

NULL ON MISMATCH: オブジェクト型またはコレクション型の値としてSQL NULLを返します。ERROR ON MISMATCH: 不一致の場合に問合せのコンパイル時エラーを発生させます。

また、各タイプのON MISMATCH句の後には、それぞれが処理する不一致の種類を示す1つ以上の

126

Page 127: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

句をカンマ(,)で区切り、カッコ((…))で囲んで指定できます。不一致の種類は次のとおりです。

MISSING DATA: オブジェクト型またはコレクション型のデータに一致するために必要だったJSONデータが欠落していました。EXTRA DATA: 1つ以上のJSONフィールドに、対応するオブジェクト型またはコレクション型のデータがありません。たとえば、JSONフィールドaddressについて、同じ名前のオブジェクト型属性がありません(デフォルトでは大文字と小文字を区別しません)。TYPE ERROR: JSONスカラー値のデータ型に、対応する戻りSQLスカラー・データ型との互換性がありません。これは、表16-1で示されている非互換性、またはSQLデータ型の制約が厳しすぎる(VARCHAR(2)がJSON文字列"hello"には短すぎるなど)が原因である可能性があります。

指定されたハンドラ(NULL ON MISMATCHなど)に対してこのような種類の不一致句(EXTRADATAなど)が存在しない場合、そのハンドラはすべての種類の不一致に適用されます。

様々な種類のON MISMATCH句を必要な数だけ使用できますが、2つ以上が互いに矛盾する場合は、問合せのコンパイル時エラーが発生します。

関連項目

JSON_VALUEを使用したユーザー定義オブジェクト型インスタンスのインスタンス化

親トピック: SQL問合せファンクションおよび条件で使用される句

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

127

Page 128: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

15 SQL/JSON条件JSON_EXISTSSQL/JSON条件json_existsでは、SQL/JSONパス式を行フィルタとして使用して、JSON文書の内容に基づいて行を選択できます。条件json_existsは、SELECT文のCASE式またはWHERE句で使用できます。

条件json_existsは、JSONデータ内に特定の値が存在するかどうかをチェックします。値が存在する場合はtrueが戻され、存在しない場合はfalseが戻されます。より正確に言うと、json_existsでは、対象とするデータが1つ以上のJSON値と一致する場合はtrueが戻されます。一致するJSON値がない場合は、falseが戻されます。

また、json_existsを使用して、JSONデータで使用するビットマップ索引を作成することもできます。例26-1を参照してください。

エラー・ハンドラERROR ON ERROR、FALSE ON ERRORおよびTRUE ON ERRORが適用されます。デフォルトはFALSE ON ERRORです。このハンドラが有効になるのはエラーが発生したときですが、通常、エラーが発生するのは、特定のJSONデータが(緩慢な構文を使用した)整形式でない場合です。条件is jsonおよびis not jsonの事例とは異なり、条件json_existsでは、検査するデータが整形式のJSONデータであることを予期しています。

json_existsの2番目の引数はSQL/JSONパス式であり、オプションでPASSING句とオプションのエラー句が付加されます。

json_existsで使用されるSQL/JSONパス式のオプションのフィルタ式では、SQL/JSON変数を参照できます。これらの変数の値は、PASSING句にバインドすることでSQLによって渡されます。このような変数でサポートされるSQLデータ型は、VARCHAR2、NUMBER、BINARY_DOUBLE、DATE、TIMESTAMPおよびTIMESTAMP WITHTIMEZONEです。

ノート: JSON値nullに適用されたSQL/JSON条件json_existsは、SQL文字列'true'を戻します。

関連項目:

128

Page 129: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_existsの詳細は、Oracle Database SQL言語リファレンスを参照してください。

JSON_EXISTSでのフィルタの使用SQL/JSON条件json_existsは、照合データが格納された文書を選択するために、1つ以上のフィルタ式を持つパス式と一緒に使用できます。フィルタを使用することで、様々な条件を満たす特定のフィールドを持つ文書があるかどうかをテストできます。

JSON_TABLEとしてのJSON_EXISTSSQL/JSON条件json_existsは、SQL/JSONファンクションjson_tableの特別な事例であるとみなすことができます。

関連項目

SQL問合せファンクションで使用されるRETURNING句

SQL問合せファンクションおよび条件で使用されるエラー句

親トピック: JSONデータの問合せ

15.1 JSON_EXISTSでのフィルタの使用SQL/JSON条件json_existsは、照合データが格納された文書を選択するために、1つ以上のフィルタ式を持つパス式と一緒に使用できます。フィルタを使用することで、様々な条件を満たす特定のフィールドを持つ文書があるかどうかをテストできます。

SQL/JSON条件json_existsは、SQL/JSONパス式と一致するデータが含まれる文書に対してtrueを戻します。パス式にフィルタが含まれる場合、そのパスと一致するデータにフィルタが適用されます。json_existsが目的のデータが含まれる文書に対してtrueを戻すためには、そのデータはフィルタも満たす必要があります。

フィルタは、直前のパスに適用され、(a)特定の文書にそのパスと一致するデータがあるかどうかと、(b)その一致するデータがフィルタを満たすかどうかがテストされます。これらの両方の条件が該当する場合は、json_existsは文書に対してtrueを戻します。

フィルタの直前のパス式が、そのフィルタで使用されるパターンの有効範囲を定義します。フィルタ内のアット・マーク(@)は、そのパスの対象となるデータを参照します。これを、フィルタのカレント項目と呼びます。たとえば、パス式$.LineItems?(@.Part.UPCCode ==85391628927)の@は、配列LineItemsの1つの出現を参照します。

例15-1 JSON_EXISTS: フィルタのないパス式

この例では、部品説明にUPCコードのエントリが含まれる明細項目を持つ発注書文書を選択します。

129

Page 130: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$.LineItems.Part.UPCCode');

例15-2 JSON_EXISTS: パス式のフィルタ内のカレント項目と有効範囲

この例では、部品に値85391628927のUPCコードが含まれる明細項目を持つ文書を選択するための、3つの同等の方法を示します。

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$?(@.LineItems.Part.UPCCode ==

85391628927)');

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$.LineItems?(@.Part.UPCCode == 85391628927)');

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$.LineItems.Part?(@.UPCCode == 85391628927)');

1つ目の問合せでは、フィルタの有効範囲はコンテキスト項目、つまり、発注書全体です。@はコンテキスト項目を参照します。

2つ目の問合せでは、フィルタの有効範囲はLineItems配列(とその各要素、暗黙的)です。@はその配列の要素を参照します。

3つ目の問合せでは、フィルタの有効範囲は、LineItems配列の1つの要素のPartフィールドです。@はPartフィールドを参照します。

例15-3 JSON_EXISTS: カレント項目に応じたフィルタ条件

この例は、UPCコードが85391628927の部品が含まれる明細項目およびオーダー数量が3を超える明細項目の両方を持つ、発注書文書を選択します。この場合の各フィルタの有効範囲(つまり、カレント項目)は、コンテキスト項目です。各フィルタ条件は、個別に(同じ文書に)適用されます。2つの条件は、必ずしも同じ明細項目に適用されるとは限りません。

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$?(@.LineItems.Part.UPCCode ==

コピー

コピー

コピー

130

Page 131: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

85391628927

&& @.LineItems.Quantity >

3)');

例15-4 JSON_EXISTS: フィルタの有効範囲の限定

この例は例15-3と似ていますが、その動作はまったく異なります。この例は、UPCコードを持ち、さらにオーダー数量が3を超える部品を持つ、明細項目が含まれる発注書文書を選択します。フィルタのカレント項目の有効範囲はより低いレベルになり、コンテキスト項目ではなく、1つのLineItems配列要素になります。つまり、json_existsでtrueが戻されるためには、1つの明細項目が両方の条件を満たす必要があります。

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document, '$.LineItems?(@.Part.UPCCode == 85391628927

&& @.Quantity >

3)');

例15-5 JSON_EXISTS: 条件を持つパス式を使用したパス式

この例では、フィルタのある部分の有効範囲を限定し、別の部分の有効範囲は文書(コンテキスト項目)レベルになるようにする方法を示します。この例は、値が"ABULL"のUserフィールドを持つ発注書文書と、UPCコードを持ち、さらにオーダー数量が3を超える部品を持つ明細項目が含まれる発注書文書を選択します。つまり、ここでは、例15-4で選択したのと同じ文書と、ユーザー"ABULL"が含まれるすべての文書が選択されます。パス式の述語existsへの引数は、特定の明細項目を指定するパス式です。この述語は、一致が見つかる(つまり、そのような明細項目が存在する)場合にtrueを返します。

(この例または類似のものをSQL*Plusで使用する場合は、SET DEFINE OFFを最初に使用する必要があります。このようにすることで、SQL*Plusで&& existsが置換変数として解釈されずに、定義するように求めるプロンプトが表示されます。)

SELECT po.po_document FROM j_purchaseorder po

WHERE json_exists(po.po_document,

'$?(@.User == "ABULL"

&& exists(@.LineItems?(@.Part.UPCCode == 85391628927

コピー

コピー

131

Page 132: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

&& @.Quantity >

3)))');

関連項目

基本的なSQL/JSONパス式の構文

親トピック: SQL/JSON条件JSON_EXISTS

15.2 JSON_TABLEとしてのJSON_EXISTSSQL/JSON条件json_existsは、SQL/JSONファンクションjson_tableの特別な事例であるとみなすことができます。

例15-6に、この対応を示します。2つのSELECT文で得られる結果は同じになります。

この対応は、おそらくjson_existsについてより深く理解する手助けとなるのみでなく、どちらを使用しても同じ結果が得られることを意味しているため、実質的に重要な意味を持ちます。

特に、json_existsを複数回使用する場合、またはこれをjson_valueまたはjson_query (これらもjson_tableを使用して表すことができます)と組み合せて使用して同じデータにアクセスする場合、json_tableを1回呼び出す方が、データが解析されるのが1回のみであるという利点があります。

このため、オプティマイザがjson_exists、json_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、より少ないjson_tableの呼出しに自動的にリライトすることがよく起こります。

例15-6 JSON_TABLEを使用して表されたJSON_EXISTS

SELECT select_list

FROM table WHERE json_exists(column, json_path error_handler ON ERROR);

SELECT select_list

FROM table,

json_table(column, '$' error_handler ON ERROR COLUMNS ("COLUMN_ALIAS" NUMBER EXISTS PATH json_path)) AS "JT"

WHERE jt.column_alias = 1;

コピー

132

Page 133: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目

JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化

親トピック: SQL/JSON条件JSON_EXISTS

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

133

Page 134: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

16 SQL/JSONファンクションJSON_VALUESQL/JSONファンクションjson_valueは、JSONデータを選択し、SQLスカラーやユーザー定義のSQLオブジェクト型またはSQLコレクション型(VARRAY、ネストした表)のインスタンスを返します。

json_valueが単一のスカラーのJSON値を対象にする場合、スカラーのSQL値を返します。返されるスカラー値のSQLデータ型を指定できます。デフォルトは、VARCHAR2(4000)です。json_valueがJSON配列を対象にしている場合、SQLコレクション型(VARRAYまたはネストした表)を戻り型として指定すると、json_valueはそのコレクション型のインスタンスを返します。

対象のJSON配列の要素は、返されたコレクション型インスタンスの要素を提供します。スカラーのJSON配列要素は、返されたコレクション・インスタンスにスカラーのSQL値を生成します(前を参照)。オブジェクトであるJSON配列要素(次を参照)または配列は再帰的に処理されます。json_valueがJSONオブジェクトを対象にしている場合、ユーザー定義のSQLオブジェクト型を戻り型として指定すると、json_valueはそのオブジェクト型のインスタンスを返します。

対象のJSONオブジェクトのフィールド値は、返されたオブジェクト型インスタンスの属性値を提供します。対象のJSONオブジェクトのフィールド名は、SQLオブジェクト属性のSQL名と比較されます。スカラー・フィールド値は、返されたオブジェクト型インスタンスにスカラーのSQL値を生成します(前を参照)。配列であるフィールド値(前を参照)またはオブジェクトが再帰的に処理されます。

最終的に、これはスカラーのSQLオブジェクト属性の名前と比較されるスカラー値を持つJSONフィールドの名前です。大/小文字が区別され、名前が正確に一致しない場合は、問合せコンパイル時に不一致エラーが発生します。

また、json_valueを使用して、JSONデータで使用する関数ベースのBツリー索引を作成するこ

134

Page 135: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ともできます。JSONデータの索引を参照してください。

ファンクションjson_valueは、2つの必須引数を持ち、オプションのRETURNING句およびエラー句を受け入れます。

json_valueの最初の引数は、スカラーのSQLデータ型またはユーザー定義のSQLオブジェクト型のインスタンスを返すSQL式です。スカラー戻り値のデータ型は、VARCHAR2、BLOBまたはCLOBです。

最初の引数は、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。SQL式の評価の結果は、パス式を評価するためのコンテキスト項目として使用されます。

json_valueの2番目の引数はSQL/JSONパス式であり、オプションでRETURNING句、ONERROR句およびON EMPTY句が付加されます。このパス式では単一のスカラー値を対象とする必要があり、そうでない場合、エラーが発生します。

デフォルトのエラー処理動作はNULL ON ERRORであり、これは、エラーが発生しても値が戻されない、つまり、エラーが発生しないことを意味します。特に、パス式が配列などの非スカラー値を対象としている場合、デフォルトではエラーは発生しません。エラーが発生するようにするには、ERROR ON ERRORを使用します。

ノート: 特定のJSONオブジェクト内のフィールド名は、それぞれが一意である必要はありません。同じフィールド名を繰り返すことができます。Oracle Databaseで行われるストリーム評価では、特定のフィールド名を持つ1つのオブジェクト・メンバーのみが常に使用され、同じフィールド名を持つ他のメンバーは無視されます。このような複数のメンバーのうちどれが使用されるかは指定されていません。JSONオブジェクトの一意フィールドと重複フィールドを参照してください。

関連項目:

json_valueの詳細は、Oracle Database SQL言語リファレンスを参照してください。

SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用JSONには、ブール型の値trueおよびfalseがあります。SQL/JSONファンクションjson_valueがSQL/JSONパス式を評価し、結果がJSON trueまたはfalseの場合、BOOLEAN値としてPL/SQLに戻すことができます。あるいは、VARCHAR2値'true'または'false'としてSQLに戻すこともできます。

JSONのnull値に適用されるSQL/JSONファンクションJSON_VALUESQL/JSONファンクションjson_valueがJSON値nullに適用されると、SQL文字列の'null'ではなく、SQL NULLが戻されます。つまり、特に、json_valueを使用し

135

Page 136: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

てJSON値nullと値が存在しないことの区別はできません。この場合、SQLのNULLは両方の事例を表します。

JSON_VALUEを使用したユーザー定義のオブジェクト型インスタンスのインスタンス化SQL/JSONファンクションjson_valueを使用して、ユーザー定義のSQLオブジェクト型またはコレクション型のインスタンスをインスタンス化できます。これを行うには、パス式にJSONオブジェクトまたは配列を指定し、RETURNING句でオブジェクト型またはコレクション型をそれぞれ指定します。

JSON_TABLEとしてのJSON_VALUESQL/JSONファンクションjson_valueは、ファンクションjson_tableの特別な事例であるとみなすことができます。

関連項目

SQL問合せファンクションで使用されるRETURNING句

SQL問合せファンクションおよび条件で使用されるエラー句

SQL/JSON問合せファンクションで使用される空白フィールド句

親トピック: JSONデータの問合せ

16.1 SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用JSONには、ブール型の値trueおよびfalseがあります。SQL/JSONファンクションjson_valueがSQL/JSONパス式を評価し、結果がJSON trueまたはfalseの場合、BOOLEAN値としてPL/SQLに戻すことができます。あるいは、VARCHAR2値'true'または'false'としてSQLに戻すこともできます。

PL/SQLコードでは、BOOLEANは、組込みのPL/SQLファンクションjson_valueに対する有効なPL/SQL戻り型です。例16-1に、これを示します。

Oracle SQLにはブール・データ型がないため、文字列(VARCHAR2)値を使用して、JSONのブール値を戻します。例16-2に、これを示します。:問合せは文字列'true'を戻します。

SQL/JSONファンクションjson_tableは、json_valueなどの他のSQL/JSON問合せファンクションを一般化します。これを使用してJSONのブール値を投影する場合、json_valueが暗黙的に使用され、生成されるSQL値はVARCHAR2値として戻されます。そのため、投影された列のデータ型はVARCHAR2である必要があります。

例16-1 JSON_VALUE: BOOLEANとしてPL/SQLに戻されるJSONのブール値

また、PL/SQLには例外処理もあります。この例では句ERROR ON ERRORを使用して、エラーがあ

136

Page 137: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

った場合にエラーが発生するようにしています(ユーザー・コードで処理できる)。

DECLARE

b BOOLEAN;

jsonData CLOB;

BEGIN

SELECT po_document INTO jsonData FROM j_purchaseorder WHERE rownum

= 1;

b := json_value(jsonData, '$.AllowPartialShipment'

RETURNING BOOLEAN ERROR ON ERROR);END;

/

例16-2 JSON_VALUE: VARCHAR2としてSQLに戻されるJSONのブール値

SELECT json_value(po_document, '$.AllowPartialShipment')

FROM j_purchaseorder;

関連項目

JSON_TABLEとしてのJSON_VALUE

JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化

親トピック: SQL/JSONファンクションJSON_VALUE

16.2 JSONのnull値に適用されるSQL/JSONファンクションJSON_VALUESQL/JSONファンクションjson_valueがJSON値nullに適用されると、SQL文字列の'null'ではなく、SQL NULLが戻されます。つまり、特に、json_valueを使用してJSON値nullと値が存在しないことの区別はできません。この場合、SQLのNULLは両方の事例を表します。

親トピック: SQL/JSONファンクションJSON_VALUE

16.3 JSON_VALUEを使用したユーザー定義オブジェクト型インスタンスのインスタンス化

コピー

コピー

137

Page 138: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSONファンクションjson_valueを使用して、ユーザー定義のSQLオブジェクト型またはコレクション型のインスタンスをインスタンス化できます。これを行うには、パス式にJSONオブジェクトまたは配列を指定し、RETURNING句でオブジェクト型またはコレクション型をそれぞれ指定します。

対象のJSON配列の要素は、返されたコレクション型インスタンスの要素を提供します。JSON配列要素は、コレクション型要素に1対1で対応している必要があります。対応しない場合は、不一致エラーが発生します。オブジェクトであるJSON配列要素(次を参照)または配列は再帰的に処理されます。

対象のJSONオブジェクトのフィールドは、返されたオブジェクト型インスタンスの属性値を提供します。JSONフィールドは、オブジェクト型属性に1対1で対応している必要があります。対応しない場合は、不一致エラーが発生します。

対象のJSONオブジェクトのフィールド名は、オブジェクト属性のSQL名と比較されます。配列またはオブジェクトであるフィールド値は再帰的に処理されるため、最終的に、これはスカラーのSQLオブジェクト属性の名前と比較されるスカラー値を持つJSONフィールドの名前です。名前が一致しない場合(デフォルトでは大/小文字を区別しない)、不一致エラーが発生します。

すべての名前が一致する場合、対応するデータ型の互換性がチェックされます。型の非互換性がある場合は、不一致エラーが発生します。表16-1には、互換性のあるスカラー・データ型が指定されています。その他の型の組合せには互換性がないため、不一致エラーが発生します。

表16-1 互換性のあるスカラー・データ型: JSONからSQLへの変換

JSON型(ソース) SQL型(宛先) ノート

string VARCHAR2 なし

string CLOB なし

string NUMBER JSON文字列は数値である必要があります。

string DATE JSON文字列は、サポートされているISO8601形式である必要があります。

string TIMESTAMP JSON文字列は、サポートされているISO8601形式である必要があります。

number NUMBER なし

number VARCHAR2 なし

number CLOB なし

138

Page 139: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

boolean VARCHAR2 インスタンス値は、SQL文字列"true"または"false"です。

boolean CLOB インスタンス値は、SQL文字列"true"または"false"です。

null 任意のSQLデータ型。 インスタンス値はSQL NULLです。

次のいずれかに該当する場合、問合せコンパイル時に不一致エラーが発生します。デフォルトでは、不一致エラーは無視されますが、json_valueの起動に1つ以上のON MISMATCH句を含めることで、このエラー処理を変更できます。

対象のJSONオブジェクトのフィールドまたは対象のJSON配列の要素は、指定されたオブジェクト型インスタンスの属性または指定されたコレクション型インスタンスの要素に、数と種類が対応していません。

対象のJSONオブジェクトのフィールドが、指定されたオブジェクト型インスタンスの属性と同じ名前ではありません。デフォルトでは、この照合では大文字/小文字が区別されません。JSON値のJSONおよびSQLスカラー・データ型と対応するオブジェクト属性値またはコレクション要素値には、表16-1によると、互換性がありません。

例16-3 JSON_VALUEを使用したJSONデータからのユーザー定義のオブジェクト・インスタンスのインスタンス化

この例では、SQLオブジェクト型shipping_tおよびaddr_tを定義します。オブジェクト型shipping_tには、それぞれVARCHAR2(30)型およびaddr_t型を持つ属性nameおよびaddressがあります。

オブジェクト型addr_tには、属性streetおよびcityがあります。

この例では、json_valueを使用して、フィールドShippingInstructionsの値であるJSONオブジェクトを選択し、SQLオブジェクト型shipping_tのインスタンスを返します。オブジェクト型属性の名前は、JSONオブジェクト・フィールド名と大/小文字を区別せずに照合されるため、たとえば、SQLオブジェクト型shipping_tの属性address (ADDRESSと同じ)はJSONフィールドaddressと一致します。

(ここでは、わかりやすいように、問合せの出力をフォーマット出力しています。)

CREATE TYPE shipping_t AS OBJECT (name VARCHAR2(30),

address addr_t);

コピー

139

Page 140: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

CREATE TYPE addr_t AS OBJECT (street VARCHAR2(100),

city VARCHAR2(30));

-- Query data to return shipping_t instances:

SELECT json_value(po_document, '$.ShippingInstructions' RETURNING shipping_t) FROM j_purchaseorder;

JSON_VALUE(PO_DOCUMENT,'$.SHIPPINGINSTRUCTIONS'RETURNING

--------------------------------------------------------

SHIPPING_T('Alexis Bull', ADDR_T('200 Sporting Green', 'South San Francisco'))

SHIPPING_T('Sarah Bell', ADDR_T('200 Sporting Green', 'South San Francisco'))

例16-4 JSON_VALUEを使用したJSONデータからのコレクション型インスタンスのインスタンス化

この例では、SQLコレクション型items_tおよびSQLオブジェクト型part_tおよびitem_tを定義します。コレクション型items_tのインスタンスは、item_tインスタンスのVARRAYです。オブジェクト型item_tの属性partは、それ自体のSQLオブジェクト型part_tです。

次に、json_valueを使用してJSONを選択します

(ここでは、わかりやすいように、問合せの出力をフォーマット出力しています。)

CREATE TYPE part_t AS OBJECT (description VARCHAR2(30),

unitprice NUMBER);

CREATE TYPE item_t AS OBJECT (itemnumber NUMBER,

part part_t);

CREATE TYPE items_t AS VARRAY(10) OF item_t;

コピー

140

Page 141: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

-- Query data to return items_t collections of item_t objects

SELECT json_value(po_document, '$.LineItems' RETURNING items_t) FROM j_purchaseorder;

JSON_VALUE(PO_DOCUMENT,'$.LINEITEMS'RETURNINGITEMS_TUSIN

--------------------------------------------------------

ITEMS_T(ITEM_T(1, PART_T('One Magic Christmas', 19.95)), ITEM_T(2, PART_T('Lethal Weapon', 19.95)))ITEMS_T(ITEM_T(1, PART_T('Making the Grade', 20)), ITEM_T(2, PART_T('Nixon', 19.95)), ITEM_T(3, PART_T(NULL, 19.95)))

関連項目

JSON_VALUEのON MISMATCH句

関連項目:

json_valueの詳細は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションJSON_VALUE

16.4 JSON_TABLEとしてのJSON_VALUESQL/JSONファンクションjson_valueは、関数json_tableの特別な事例であるとみなすことができます。

例16-5に、この対応を示します。2つのSELECT文で得られる結果は同じになります。

この対応は、おそらくjson_valueについてより深く理解する手助けとなるのみでなく、どちらの関数を使用しても同じ結果が得られることを意味しているため、実質的に重要な意味を持ちます。

特に、json_valueを複数回使用する場合、またはこれをjson_existsまたはjson_query (これらもjson_tableを使用して表すことができます)と組み合せて使用して同じデータにアクセスする場合、json_tableを1回呼び出す方が、データが解析されるのが1回のみであるという利点があります。

このため、オプティマイザがjson_exists、json_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、より少ないjson_tableの呼出しに自動的にリライトすることがよく起こります。

141

Page 142: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例16-5 JSON_TABLEを使用して表されたJSON_VALUE

SELECT json_value(column, json_path RETURNING data_type error_hander ON ERROR) FROM table;

SELECT jt.column_alias

FROM table,

json_table(column, '$' error_handler ON ERROR COLUMNS ("COLUMN_ALIAS" data_type PATH json_path)) AS "JT";

関連項目

JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化

親トピック: SQL/JSONファンクションJSON_VALUE

コピー

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

142

Page 143: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

17 SQL/JSONファンクションJSON_QUERYSQL/JSONファンクションjson_queryは、1つ以上の値をJSONデータから選択し、JSON値を表す文字列(VARCHAR2、CLOBまたはBLOBインスタンス)を戻します。したがって、json_queryを使用してJSON文書のフラグメントを取得できます。

json_queryの最初の引数は、スカラーのSQLデータ型のインスタンスを戻すSQL式です(つまり、オブジェクト・データ型でもコレクション・データ型でもありません)。これは、データ型VARCHAR2、CLOBまたはBLOBのいずれかになります。これは、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。SQL式の評価の結果は、パス式を評価するためのコンテキスト項目として使用されます。

json_queryの2番目の引数はSQL/JSONパス式であり、オプションでRETURNING句、WRAPPER句、ON ERROR句およびON EMPTY句が付加されます。このパス式は、任意の数のJSON値を対象とすることができます。

RETURNING句で指定できるのは、データ型VARCHAR2、CLOBまたはBLOBです。BLOBの結果はAL32UTF8文字セットです。(VARCHAR2がデフォルトです。)戻り値には、常に整形式のJSONデータが含まれています。これにより、文字列値の非ASCII文字が必要に応じてエスケープされていることが確認されます。たとえば、ASCIIタブ文字(Unicode文字CHARACTERTABULATION、U+0009)は\tとしてエスケープされます。キーワードFORMATJSONは、json_queryに必要(または使用可能)ではありません。JSON形式は戻り値に対して暗黙的です。

ラッパー句により、戻される文字列値の形式が決まります。

json_queryのエラー句ではEMPTY ON ERRORを指定でき、これは、エラーの場合は空の配列([])が戻されることを意味します(エラーは発生しない)。

例17-1は、SQL/JSONファンクションjson_queryとともに配列ラッパーを使用する例を示しています。文書ごとにVARCHAR2値が戻され、この内容は、電話のタイプの要素が不特定の順序で含ま

JSON 4-2 "Office" "Mobile"

143

Page 144: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

れる 配列を表します。例 の文書では、電話のタイプは および であり、戻される配列は["Mobile", "Office"]または["Office", "Mobile"]です。

例17-1でパス式$.ShippingInstructions.Phone.typeが使用されていたとしても、同じ結果が得られるはずであることに注意してください。SQL/JSONのパス式構文の緩和のため、[*].typeは.typeに相当します。

関連項目:

json_queryの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例17-1 JSON_QUERYを使用したJSON値の選択

SELECT json_query(po_document,

'$.ShippingInstructions.Phone[*].type'

WITH WRAPPER)

FROM j_purchaseorder;

JSON_TABLEとしてのJSON_QUERYSQL/JSONファンクションjson_queryは、ファンクションjson_tableの特別な事例であるとみなすことができます。

関連項目

SQL/JSONパス式の構文の緩和

SQL問合せファンクションで使用されるRETURNING句

SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句

SQL問合せファンクションおよび条件で使用されるエラー句

SQL/JSON問合せファンクションで使用される空白フィールド句

親トピック: JSONデータの問合せ

17.1 JSON_TABLEとしてのJSON_QUERYSQL/JSONファンクションjson_queryは、関数json_tableの特別な事例であるとみなすことができます。

例17-2に、この対応を示します。2つのSELECT文で得られる結果は同じになります。

この対応は、おそらくjson_queryについてより深く理解する手助けとなるのみでなく、どちら

コピー

144

Page 145: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

の関数を使用しても同じ結果が得られることを意味しているため、実質的に重要な意味を持ちます。

特に、json_queryを複数回使用する場合、またはこれをjson_existsまたはjson_value (これらもjson_tableを使用して表すことができます)と組み合せて使用して同じデータにアクセスする場合、json_tableを1回呼び出す方が、データが解析されるのが1回のみであるという利点があります。

このため、オプティマイザがjson_exists、json_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、より少ないjson_tableの呼出しに自動的にリライトすることがよく起こります。

例17-2 JSON_TABLEを使用して表されたJSON_QUERY

SELECT json_query(column, json_path RETURNING data_type array_wrapper error_hander ON ERROR) FROM table;

SELECT jt.column_alias

FROM table,

json_table(column, '$' error_handler ON ERROR COLUMNS ("COLUMN_ALIAS" data_type FORMAT JSON array_wrapper PATH json_path)) AS "JT";

関連項目

JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化

親トピック: SQL/JSONファンクションJSON_QUERY

コピー

このページは役に立ちましたか?

145

Page 147: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

18 SQL/JSONファンクションJSON_TABLESQL/JSONファンクションjson_tableは様々なSQLデータ型の列に特定のJSONデータを投影します。これを使用してJSON文書の一部を新規仮想表の行および列にマップしますが、これは、インラインのビューとみなすこともできます。

この仮想表は、既存のデータベース表に挿入でき、またSQLを使用して(join式など)問合せできます。

json_tableの一般的な使用目的は、JSONデータのビューを作成することです。このようなビューは、任意の表またはビューを使用する場合と同じように使用できます。このため、アプリケーション、ツールおよびプログラマは、JSONまたはJSONパス式の構文を考慮せずにJSONデータを操作できます。

JSONデータに対してビューを定義することにより、実質的にある種のスキーマがそのデータにマップされます。このマッピングは、事後に行われます。つまり、基礎となるJSONデータは、スキーマまたは特定の使用パターンを考慮せずに定義および作成できます。データが最初で、スキーマが後です。

このようなスキーマ(マッピング)により、データベースに格納できるJSON文書の種類に(整形式のJSONデータであること以外の)制約が課されることはありません。ビューでは、ビューを定義するマッピング(スキーマ)に準拠するデータのみが公開されます。ビューを再定義するだけでスキーマを変更でき、基礎となるJSONデータを再編成する必要はありません。

json_tableはSQLのFROM句で使用します。これは行ソースです。これにより、行パス式(行パターン)によって選択されたJSON値ごとに仮想表のデータの行が生成されます。生成された各行の列は、COLUMNS句の列パス式によって定義されます。

通常、json_table呼出しは、FROMリスト内のソース表と暗黙的に横方向に結合されます。その行にはそれぞれ、ファンクションへの入力として使用されるJSON文書が含まれています。json_tableでは、入力文書に対して行パス式を評価することにより決定される、0行以上の新規行を生成します。

147

Page 148: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_tableの最初の引数はSQL式です。これは、適切にキャストされた表またはビューの列の値、PL/SQL変数、バインド変数のいずれかになります。式の評価の結果は、行パス式を評価するためのコンテキスト項目として使用されます。

json_tableの2番目の引数はSQL/JSON行パス式であり、行を処理するためのオプションのエラー句と(必須の) COLUMNS句が付加されます。この句により、作成する仮想表の列が定義されます。RETURNING句はありません。

json_tableのエラー処理には2つのレベルがありますが、これらは、パス式の2つのレベルである行と列に対応しています。存在する場合、列のエラー・ハンドラにより、行レベルのエラー処理がオーバーライドされます。両レベルのデフォルトのエラー・ハンドラはNULL ON ERRORです。

コンテキスト項目引数と行パス式を渡すかわりに、単純なドット表記法構文を使用できます。(引き続きエラー句を使用でき、COLUMNS句が必要です。)ドット表記法では、対象のJSONデータへの単純なパスとともに表またはビューの列を指定します。たとえば、この2つの問合せは等価です。

json_table(t.j, '$.ShippingInstructions.Phone[*]' ...)

json_table(t.j.ShippingInstructions.Phone[*] ...)

行パス式が'$'のみで、文書全体を対象とする場合、パスの部分を省略できます。次の問合せは等価です。

json_table(t.j, '$' ...)

json_table(t.j ...)

例18-1に、単純なドット表記法の使用と、より完全で明示的な表記法の使用の違いを示します。

例18-1 等価のJSON_TABLE問合せ: 単純な構文と完全な構文

この例では、2つの等価の問合せにjson_tableを使用します。最初の問合せでは、行および列データを対象とする式に単純なドット表記法構文を使用します。2番目の問合せでは、完全な構文を使用します。

SQL識別子が引用符で囲まれている列Special Instructionsを除いて、実際のSQL列名は大文字です。(識別子Special Instructionsには空白文字が含まれています。)

コピー

コピー

148

Page 149: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

最初の問合せでは、列名の記述は、大/小文字の区別を含め、対象となるオブジェクト・フィールドの名前と完全に同じです。引用符で囲まれるかどうかに関係なく、これらは、デフォルト・パス(明示的なPATH句がない場合に使用されるパス)を設定するために大/小文字を区別して解釈されます。

2番目の問合せには次のものが含まれています。

JSON列式およびSQL/JSON行パス式の別々の引数

VARCHAR2(4000)の明示的な列データ型

投影されるオブジェクト・フィールドを対象とするための、明示的なPATH句およびSQL/JSON列パス式

SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_document

COLUMNS ("Special Instructions", NESTED LineItems[*]

COLUMNS (ItemNumber NUMBER, Description PATH Part.Description))) AS "JT";

SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_document, '$' COLUMNS (

"Special Instructions" VARCHAR2(4000) PATH '$."Special Instructions"', NESTED PATH '$.LineItems[*]' COLUMNS (

ItemNumber NUMBER PATH '$.ItemNumber', Description VARCHAR(4000) PATH '$.Part.Description'))) AS "JT";

関連項目:

json_tableの詳細は、Oracle Database SQL言語リファレンスを参照してください

コピー

コピー

149

Page 150: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSON_TABLEの代替のSQL NESTED句SELECT句で、SQL/JSONファンクションjson_tableのかわりにNESTED句を使用することがよくあります。これにより、問合せ式が単純化されることがあります。これには、JSON列がNULLの場合、NULL以外のリレーショナル列を含む行を含めるという利点もあります。

SQL/JSONファンクションJSON_TABLEのCOLUMNS句SQL/JSONファンクションjson_tableの必須のCOLUMNS句は、このファンクションによって作成される仮想表の列を定義します。

JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化SQL/JSONファンクションjson_tableは、SQL/JSON条件json_existsと、SQL/JSONファンクションjson_valueおよびjson_queryを一般化します。これらの関数を使用して実行できる処理はすべて、json_tableを使用して実行できます。これらによって実行されるジョブについては、これらの関数の構文の方がjson_tableの構文よりも簡単に使用できます。

JSON_TABLEとJSON配列の使用JSON値は、1つの配列にすることも、1つ以上の配列を含めることも可能であり、他のJSON配列またはオブジェクト内の任意の数のレベルにネストしてもかまいません。json_table NESTEDパス句を使用して、配列の特定の要素を投影できます。

JSON_TABLEを使用したJSONデータに対するビューの作成問合せのパフォーマンスを向上させるために、SQL/JSONファンクションjson_tableを使用して、列に投影するJSONデータに対してビューを作成できます。問合せのパフォーマンスをさらに向上させるには、マテリアライズド・ビューを作成し、JSONデータをインメモリーに配置できます。

関連項目

SQL問合せファンクションおよび条件で使用されるエラー句

SQL/JSONファンクションJSON_QUERY

親トピック: JSONデータの問合せ

18.1 JSON_TABLEの代替のSQL NESTED句SELECT句で、SQL/JSONファンクションjson_tableのかわりにNESTED句を使用することがよくあります。これにより、問合せ式が単純化されることがあります。これには、JSON列がNULLの場合、NULL以外のリレーショナル列を含む行を含めるという利点もあります。

150

Page 151: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

NESTED句は、ANSI左外部結合でjson_tableを使用するためのショートカットです。つまり、この2つの問合せは等価です。

SELECT ...

FROM mytable NESTED jcol COLUMNS (...);

SELECT ...

FROM mytable t1 LEFT OUTER JOIN json_table(t1.jcol COLUMNS (...) ON 1=1;

json_tableで左外部結合を使用したり、NESTED句を使用すると、選択結果に対応するJSON列データがない(つまり、JSON列がNULLである)リレーショナル列を含む行を含めることができます。この2つの間の唯一のセマンティックの相違点は、NESTED句を使用する場合、JSON列自体が結果に含まれないことです。

NESTED句は、ネストした列の可能性を含め、json_tableと同じCOLUMNS句を指定します。NESTEDを使用する利点は、is jsonチェック制約(単純なドット表記法を使用するjson_tableに必要)または表の別名を指定する必要がないため、LEFT OUTER JOINを指定する必要がないことです。NESTED句の構文はより単純で、COLUMNS句のすべての柔軟性が実現され、暗黙的な左外部結合が実行されます。

例18-2 等価: SQL NESTEDとLEFT OUTER JOINを指定したJSON_TABLE

次の2つの問合せは同じです。1つは、明示的なLEFT OUTER JOINを指定したでSQL/JSONファンクションjson_tableを使用します。もう1つは、SQLのNESTED句を使用します。

SELECT id, requestor, type, "number"

FROM j_purchaseorder LEFT OUTER JOIN json_table(po_document COLUMNS (Requestor,

NESTED ShippingInstructions.Phone[*]

COLUMNS (type, "number")))

ON 1=1);

SELECT id, requestor, type, "number"

FROM j_purchaseorder NESTED po_document

コピー

コピー

コピー

151

Page 152: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

COLUMNS (Requestor,

NESTED ShippingInstructions.Phone[*]

COLUMNS (type, "number");

出力はどちらの場合でも同じです。

7C3A54B183056369E0536DE05A0A15E4 Alexis Bull Office 909-555-7307

7C3A54B183056369E0536DE05A0A15E4 Alexis Bull Mobile 415-555-1234

7C3A54B183066369E0536DE05A0A15E4 Sarah Bell

表j_purchaseorderに、列idおよびrequestorの値がNULL以外で、列po_documentの値がNULLである行がある場合、その行は両方のケースで表示されます。一方、LEFT OUTERJOINが存在しない場合、json_tableのケースには表示されません。

親トピック: SQL/JSONファンクションJSON_TABLE

18.2 SQL/JSONファンクションJSON_TABLEのCOLUMNS句SQL/JSONファンクションjson_tableの必須のCOLUMNS句は、このファンクションによって作成される仮想表の列を定義します。

これは、キーワードCOLUMNSの後ろに次のエントリをカッコで囲んだ形式で構成されます。オプションのFOR ORDINALITYエントリ以外、COLUMNS句の各エントリは、標準列指定またはネストした列指定です。

COLUMNS句内の多くても1つのエントリは、生成される行数の列(SQLデータ型NUMBER)を指定するキーワードFOR ORDINALITYを列名の後ろに付けた形式にすることができます。これらの数は1から始まります。次に例を示します。

COLUMNS (linenum FOR ORDINALITY, ProductID)

標準列指定は、オプションで列のスカラー・データ型が付いた列名で構成されます。これには、json_valueのRETURNING句と同様に、SQLデータ型VARCHAR2、NUMBER、DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONEまたはSDO_GEOMETRYを使用でき、後ろにオプションの値句およびオプションのPATH句が付けられます。デフォルトのデータ型はVARCHAR2(4000)です。

データ型SDO_GEOMETRYは、Oracle Spatial and Graphデータ向けに使用されます。特に、これは、json_tableをGeoJSONデータで使用できることを意味します。このデータ

コピー

コピー

152

Page 153: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

は、JSONで地理データをエンコーディングするための形式です。OracleではSQL/JSON標準を拡張し、列の戻りデータ型がVARCHAR2(N)の場合は、データ型の直後にオプションのキーワードTRUNCATEを指定できるようにしました。TRUNCATEが存在し、かつ戻り値がNよりも長い場合は、値が切り捨てられ、先頭N文字のみが戻されます。TRUNCATEがない場合、このケースはエラーとして扱われ、エラー句またはデフォルトのエラー処理動作によって通常どおり処理されます。ネストした列指定は、キーワードNESTEDの後ろにオプションのPATHキーワード、SQL/JSON行パス式、およびCOLUMNS句が付いた形式で構成されます。このCOLUMNS句は、ネストしたデータを表す列を指定します。ここで使用される行パス式により、指定したネストした列のコンテキストが洗練されます。ネストした各列のパス式は行パス式を基準にしたものになります。同じ行の列に異なるレベルで配列に存在する投影値に列の句をネストできます。COLUMNS句は(ネストしていてもネストしていなくても)どのレベルでも同じ特性を持ちます。つまり、COLUMNS句は再帰的に定義されます。ネストのレベルごとに(つまり、キーワードNESTEDが使用されるたびに)、ネストしたCOLUMNS句は、ネスト元のCOLUMNS句(その親)の子と呼ばれます。同じ親句を持つ複数のCOLUMNS句は兄弟です。

親子のCOLUMNS句によって定義される仮想表は、外部結合を使用して結合されますが、この場合、親が外部表になります。兄弟のCOLUMNS句によって定義される仮想列は、和結合を使用して結合されます。例18-1および例18-8に、ネストされた列句の使用を示します。

標準列指定に必要なものは、列名のみです。スカラー・データ型、値の処理またはターゲット・パスを指定することによる列の投影の詳細な定義はオプションです。

オプションの値句は、列に投影されたデータを処理する方法、つまり、データをjson_value、json_existsまたはjson_queryと同じように処理するかどうかを指定します。この値処理には、戻りデータ型、戻り形式(prettyまたはASCII)、ラッパー、およびエラーの処理が含まれます。デフォルトでは、投影されたデータはjson_valueによって処理されたかのように処理されます。キーワードEXISTSを使用すると、json_existsによって処理されたかのように処理されます。キーワードFORMAT JSONを使用すると、json_queryによって処理されたかのように処理されます。FORMAT JSONの場合、明示的なラッパー句を追加することにより、デフォルトのラッパー動作をオーバーライドできます。特定のハンドラ(json_value、json_existsまたはjson_query)のデフォルトのエラー処理を、それに適した明示的なエラー句を追加することでオーバーライドできます。オプションのPATH句は、列の内容として使用される行の部分を指定します。キーワー

153

Page 154: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ドPATHに続く列パス式は、仮想行によって提供されるコンテキスト項目と照合されます。この列パス式は、行パス式によって指定されるパスに対して相対的であるため、相対パスの表記にする必要があります。PATH句が存在しない場合、動作は'$.<column-name>'のパスで存在している場合と同様です。ここで、<column-name>は列名です。つまり、対象となるオブジェクト・フィールドの名前が列名として暗黙的に取得されます。対象となるフィールドのみを指定するために、<column-name>に使用されるSQL識別子は、引用符で囲まれていない場合でも大/小文字を区別して解釈されます。列のSQL名は通常のルールに従います。二重引用符(")で囲まれている場合、使用される文字の大/小文字は区別されますが、そうでない場合、区別されません(大文字と同様に処理されます)。たとえば、これらの2つのCOLUMNS句は等価です。SQLの場合、大/小文字が区別されるのは、列Commentsのみです。

COLUMNS(ProductId, quantity NUMBER, "Comments")

COLUMNS(ProductId VARCHAR2(4000) PATH '$.ProductId',

quantity NUMBER PATH '$.quantity',

"Comments" VARCHAR2(4000) PATH '$.Comments')

例18-1に、これを示す等価の問合せを示します。

特定のjson_table列指定のFORMAT JSONを使用する場合、json_queryのセマンティクスは、JSONデータを列に投影する場合に使用されます。列に指定したデータ型は、json_queryが戻すことができるSQLデータ型(VARCHAR2、CLOBまたはBLOB)のいずれかになります。

json_queryセマンティクスは、次のことを示します。

投影されるJSONデータは常に整形式です。これには、文字列値の非ASCII文字が必要に応じてエスケープされていることも含まれます。たとえば、タブ文字(CHARACTERTABULATION、U+0009)は\tとしてエスケープされます。

json_queryエラー処理が適用されます。

ラッパー句を使用して複数のJSON値を配列内の要素として投影できます。

特定のjson_table列指定でFORMAT JSONを使用しない場合、JSONデータを投影すると、json_valueセマンティクスが使用されます。列に指定したデータ型は、json_valueが戻すことができるSQLデータ型(VARCHAR2、NUMBER、DATE、TIMESTAMP、TIMESTAMP WITHTIME ZONE、SDO_GEOMETRYまたはCLOB)のいずれかになります。json_valueエラー処理が適用されます(ラッパー句は使用できません)。

コピー

154

Page 155: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

たとえば、ここで、列FirstNameの値はjson_valueセマンティクスを使用して直接投影されており、列Addressの値はjson_queryセマンティクスを使用してJSON文字列として投影されます。

COLUMNS (FirstName, Address FORMAT JSON)

投影されたデータがJSONオブジェクトまたは配列の場合は通常、FORMAT JSONを使用します。投影されたデータがJSONスカラーの場合は通常、FORMAT JSONは使用しないでください。

関連項目

SQL問合せファンクションで使用されるRETURNING句

SQL/JSON問合せファンクションJSON_QUERYおよびJSON_TABLEで使用されるラッパー句

SQL問合せファンクションおよび条件で使用されるエラー句

SQL/JSON問合せファンクションで使用される空白フィールド句

SQL/JSONファンクションJSON_QUERY

関連項目:

Oracle Database SQL言語リファレンス

Oracle Spatial and Graphデータの使用の詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。GeoJSON.org

親トピック: SQL/JSONファンクションJSON_TABLE

18.3 JSON_TABLEによるSQL/JSON問合せファンクションおよび条件の一般化SQL/JSONファンクションjson_tableは、SQL/JSON条件json_existsと、SQL/JSONファンクションjson_valueおよびjson_queryを一般化します。これらの関数を使用して実行できる処理はすべて、json_tableを使用して実行できます。これらによって実行されるジョブについては、これらの関数の構文の方がjson_tableの構文よりも簡単に使用できます。

json_exists、json_valueまたはjson_queryを複数回使用して、またはこれらを組み合せて使用して同じデータにアクセスする場合、json_tableを1回呼び出す方が、データが解析されるのが1回のみであるという利点があります。

コピー

155

Page 156: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

このため、オプティマイザがjson_exists、json_valueおよびjson_queryの複数の呼出し(任意の組合せ)を、データの解析が1回だけになるように、より少ないjson_tableの呼出しに自動的にリライトすることがよく起こります。

例18-3および例18-4にこれを示します。これらではそれぞれ、列j_purchaseorder.po_document内の各オブジェクトによって使用される要求者および一連の電話を選択しています。ただし、例18-4では、この列を4回ではなく1回のみ解析しています。

例18-4と関連して次の点に注意してください。

JSON値のnullは、SQLに関するかぎりは1つの値であり、SQLで値の欠如(存在しないデータ、不明なデータまたは適用できないデータ)を表すNULLとは異なります。例18-4で、オブジェクト属性zipCodeのJSON値がnullである場合、SQL文字列'true'が戻されます。

json_existsはSQL条件です。これをSQL WHERE句、CASE文、またはチェック制約で使用できます。例18-3では、これをWHERE句で使用しています。ファンクションjson_tableでは、キーワードEXISTSを指定したときに、暗黙的にjson_existsのセマンティクスが使用されます。これは仮想列にSQL値を戻す必要があります。Oracle SQLにはブール・データ型がないため、SQL文字列'true'または'false'を使用してブール値を表します。これは例18-4の事例です。VARCHAR2値は列jt.has_zipに格納されてから、リテラルのSQL文字列'true'と等価かどうかが明示的にテストされています。

JSONフィールドAllowPartialShipmentには、JSONのブール値があります。json_valueはその値に適用される場合、これは文字列として戻されます。例18-4では、データ型VARCHAR2は列のデータ型として使用されています。ファンクションjson_tableは、暗黙的にこの列に対してjson_valueを使用し、VARCHAR2値として値を戻します。これにより、リテラルのSQL文字列'true'と等価かどうかがテストされます。

例18-3 JSONデータに複数回アクセスすることによるデータの抽出

SELECT json_value(po_document, '$.Requestor' RETURNING VARCHAR2(32)),

json_query(po_document, '$.ShippingInstructions.Phone' RETURNING VARCHAR2(100))

FROM j_purchaseorder

WHERE json_exists(po_document, '$.ShippingInstructions.Address.zipCode')

AND json_value(po_document, '$.AllowPartialShipment' RETURNING VARCHAR2(5 CHAR))

= 'true';

コピー

156

Page 157: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例18-4 JSON_TABLEの使用によって複数回の解析が不要なデータの抽出

SELECT jt.requestor, jt.phones

FROM j_purchaseorder,

json_table(po_document, '$'

COLUMNS (requestor VARCHAR2(32 CHAR) PATH '$.Requestor',

phones VARCHAR2(100 CHAR) FORMAT JSON

PATH '$.ShippingInstructions.Phone',

partial VARCHAR2(5 CHAR) PATH '$.AllowPartialShipment',

has_zip VARCHAR2(5 CHAR) EXISTS PATH

'$.ShippingInstructions.Address.zipCode')) jt

WHERE jt.partial = 'true' AND jt.has_zip = 'true';

関連項目

SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用

親トピック: SQL/JSONファンクションJSON_TABLE

18.4 JSON_TABLEとJSON配列の使用JSON値は、1つの配列にすることも、1つ以上の配列を含めることも可能であり、他のJSON配列またはオブジェクト内の任意の数のレベルにネストしてもかまいません。json_table NESTEDパス句を使用して、配列の特定の要素を投影できます。

例18-5では、JSONデータ内の要求者および関連する電話番号を列po_document内に投影しています。JSON配列Phone全体がJSONデータph_arrの列として投影されています。このJSONデータをVARCHAR2列としてフォーマットするには、キーワードFORMAT JSONが必要です。

JSON配列Phone全体ではなく、配列の個別要素のみを投影する場合はどうすればよいでしょうか。例18-6は、これを行う方法の1つを示しており、投影する必要があるデータが配列要素のみである場合、この方法を使用できます。

要求者と関連する電話データの両方を投影する場合、例18-6の行パス式($.Phone[*])は適切ではありません。この式は、配列Phoneの(電話オブジェクト)要素のみを対象としています。

例18-7は、両方を対象とする方法の1つを示しています。ここでは、名前と電話配列全体の両方を対象とする行パス式を使用するとともに、個別電話オブジェクトのフィールドtypeおよ

コピー

157

Page 158: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

びnumberを対象とする列パス式を使用しています。

例18-7では例18-5の場合のようにキーワードFORMAT JSONが必要ですが、これは、生成される列VARCHAR2にJSONデータ(つまり、電話ごとに1つの配列要素という形式による電話のタイプまたは電話番号の配列)が含まれるためです。また、例18-5の事例とは異なり、列phone_typeおよびphone_numにラッパー句が必要ですが、これは、フィールドtypeおよびnumberを持つオブジェクトが配列Phoneに複数含まれるためです。

場合によっては、例18-7の効果が必要ないことがあります。たとえば、電話番号のJSON配列が含まれる列(特定の発注書のすべての番号に対して1つの行)ではなく、単一の電話番号が含まれるリレーショナル列(番号当たり1つの行)が必要な場合があります。

この結果を得るために、配列に対してjson_tableのNESTEDパス句を使用することにより、配列要素を投影するようjson_tableに命令を出す必要があります。NESTEDパス句は実質的に、追加の行ソース(行パターン)として機能します。例18-8に、これを示します。

キーワードNESTEDは1回のjson_tableの呼出しで何回でも使用できます。

例18-8では、外部のCOLUMNS句は、ネストした(内部の) COLUMNS句の親です。定義されている仮想表は外部結合を使用して結合されますが、この場合、親句によって定義される表が結合における外部表になります。

(同じ親の下で直接ネストされた2番目の列の句がある場合、これら2つのネストした句は兄弟のCOLUMNS句になります。)

例18-5 JSON配列全体のJSONデータとしての投影

SELECT jt.*

FROM j_purchaseorder,

json_table(po_document, '$'

COLUMNS (requestor VARCHAR2(32 CHAR) PATH '$.Requestor',

ph_arr VARCHAR2(100 CHAR) FORMAT JSON PATH '$.ShippingInstructions.Phone')) AS "JT";

例18-6 JSON配列の要素の投影

SELECT jt.*

FROM j_purchaseorder,

json_table(po_document, '$.ShippingInstructions.Phone[*]'

コピー

コピー

158

Page 159: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

COLUMNS (phone_type VARCHAR2(10) PATH '$.type',

phone_num VARCHAR2(20) PATH '$.number')) AS "JT";

PHONE_TYPE PHONE_NUM

---------- ---------

Office 909-555-7307

Mobile 415-555-1234

例18-7 JSON配列の要素と他のデータの投影

SELECT jt.*

FROM j_purchaseorder,

json_table(po_document, '$'

COLUMNS (

requestor VARCHAR2(32 CHAR) PATH '$.Requestor',

phone_type VARCHAR2(50 CHAR) FORMAT JSON WITH WRAPPERPATH '$.ShippingInstructions.Phone[*].type',

phone_num VARCHAR2(50 CHAR) FORMAT JSON WITH WRAPPER PATH

'$.ShippingInstructions.Phone[*].number')) AS "JT";

REQUESTOR PHONE_TYPE PHONE_NUM

--------- ---------- ---------

Alexis Bull ["Office", "Mobile"] ["909-555-7307", "415-555-1234"]

例18-8 JSON_TABLE: NESTEDを使用した配列要素の投影

この例では、配列要素を投影する2つの等価の問合せを示しています。最初の問合せでは、行および列データを対象とする式に単純なドット表記法構文を使用します。2番目の問合せでは、完全な構文を使用します。

SQL識別子が引用符で囲まれている列numberを除いて("number")、実際のSQL列名は大文字です。(列numberは小文字です。)

最初の問合せでは、列名の記述は、大/小文字の区別を含め、対象となるフィールド前と完全に同じです。引用符で囲まれるかどうかに関係なく、これらは、適切なパスを設定するために大/小文字を区別して解釈されます。

コピー

159

Page 160: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

2番目の問合せには次のものが含まれています。

JSON列式およびSQL/JSON行パス式の別々の引数

VARCHAR2(4000)の明示的な列データ型

投影されるオブジェクト・フィールドを対象とするための、明示的なPATH句およびSQL/JSON列パス式

SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_documentCOLUMNS (Requestor,

NESTED ShippingInstructions.Phone[*] COLUMNS (type, "number"))) AS "JT";

SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_document, '$'COLUMNS (Requestor VARCHAR2(4000) PATH '$.Requestor',

NESTED PATH '$.ShippingInstructions.Phone[*]'

COLUMNS (type VARCHAR2(4000) PATH '$.type',

"number" VARCHAR2(4000) PATH '$.number'))) AS "JT";

関連項目

JSON_TABLEを使用したJSONデータに対するビューの作成

SQL/JSONファンクションJSON_TABLE

親トピック: SQL/JSONファンクションJSON_TABLE

18.5 JSON_TABLEを使用したJSONデータに対するビューの作成問合せのパフォーマンスを向上させるために、SQL/JSONファンクションjson_tableを使用して、列に投影するJSONデータに対してビューを作成できます。問合せのパフォーマンスをさらに向上させるには、マテリアライズド・ビューを作成し、JSONデータをインメモリーに配置できます。

コピー

コピー

160

Page 161: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例18-9では、JSONデータに対してビューを定義しています。ここでは、NESTEDパス句を使用して配列LineItemsの要素を投影しています。

例18-10では、例18-9と同じデータおよび構造を持つマテリアライズド・ビューを定義します。このようなマテリアライズド・ビューを直接更新することはできません。読取り専用のビューとして扱い、元表を更新することにより間接的に更新する必要があります。ビューを直接変更しようとすると、エラーが発生します。マテリアライズド・ビューはキーワードREFRESHおよびONSTATEMENTを使用して作成されている場合、元表を更新するたびにビューが自動的に更新されます。

例18-9と例18-10の違いは、次にあげるものだけです。

キーワードMATERIALIZEDの使用

BUILD IMMEDIATEの使用

REFRESH FAST ON STATEMENT WITH PRIMARY KEYの使用。

REFRESH FASTの使用は、マテリアライズド・ビューが増分的にリフレッシュされることを意味します。これが発生するようにするには、WITH PRIMARY KEYまたはWITH ROWID(主キーがない場合)を使用する必要があります。表に基づいてマテリアライズド・ビューを作成する際には、JSON列が含まれるベースとなる表に主キーを指定し、WITH PRIMARY KEYを使用することをお薦めします。

ビューの作成にON COMMIT (ON STATEMENTではなく)を使用できます。前者は、表の更新トランザクションがコミットされた場合にのみ、元表を使用してビューを同期します。それまで表の変更はビューに反映されません。ON STATEMENTを使用すると、ビューがDML文ごとにただちに同期されます。これは、ON STATEMENTを使用して作成したビューでは、実行される可能性のあるロールバックを反映することを意味します。(後続のCOMMIT文がトランザクションを終了し、ロールバックを回避します。)

関連項目:

Oracle Databaseデータウェアハウス・ガイド

例18-9 JSONデータに対するビューの作成

CREATE OR REPLACE VIEW j_purchaseorder_detail_view

AS SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_document, '$'

COLUMNS (

po_number NUMBER(10) PATH

コピー

161

Page 162: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

'$.PONumber',

reference VARCHAR2(30 CHAR) PATH

'$.Reference',

requestor VARCHAR2(128 CHAR) PATH

'$.Requestor',

userid VARCHAR2(10 CHAR) PATH '$.User',

costcenter VARCHAR2(16) PATH

'$.CostCenter',

ship_to_name VARCHAR2(20 CHAR)

PATH '$.ShippingInstructions.name',

ship_to_street VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.street',

ship_to_city VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.city',

ship_to_county VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.county',

ship_to_postcode VARCHAR2(10 CHAR)

PATH

'$.ShippingInstructions.Address.postcode',

ship_to_state VARCHAR2(2 CHAR)

PATH

'$.ShippingInstructions.Address.state',

ship_to_zip VARCHAR2(8 CHAR)

PATH

'$.ShippingInstructions.Address.zipCode',

ship_to_country VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.country',

ship_to_phone VARCHAR2(24 CHAR)

PATH

'$.ShippingInstructions.Phone[0].number',

NESTED PATH '$.LineItems[*]'

COLUMNS (

itemno NUMBER(38) PATH

'$.ItemNumber',

description VARCHAR2(256 CHAR) PATH

'$.Part.Description',

upc_code VARCHAR2(14 CHAR) PATH

162

Page 163: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

'$.Part.UPCCode',

quantity NUMBER(12,4) PATH

'$.Quantity',

unitprice NUMBER(14,2) PATH

'$.Part.UnitPrice'))) jt;

例18-10 JSONデータに対するマテリアライズド・ビューの作成

CREATE OR REPLACE MATERIALIZED VIEW j_purchaseorder_materialized_view

BUILD IMMEDIATE REFRESH FAST ON STATEMENT WITH PRIMARY KEY AS SELECT jt.*

FROM j_purchaseorder po,

json_table(po.po_document, '$'

COLUMNS (

po_number NUMBER(10) PATH

'$.PONumber',

reference VARCHAR2(30 CHAR) PATH

'$.Reference',

requestor VARCHAR2(128 CHAR) PATH

'$.Requestor',

userid VARCHAR2(10 CHAR) PATH '$.User',

costcenter VARCHAR2(16) PATH

'$.CostCenter',

ship_to_name VARCHAR2(20 CHAR)

PATH '$.ShippingInstructions.name',

ship_to_street VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.street',

ship_to_city VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.city',

ship_to_county VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.county',

ship_to_postcode VARCHAR2(10 CHAR)

PATH

'$.ShippingInstructions.Address.postcode',

コピー

163

Page 164: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ship_to_state VARCHAR2(2 CHAR)

PATH

'$.ShippingInstructions.Address.state',

ship_to_zip VARCHAR2(8 CHAR)

PATH

'$.ShippingInstructions.Address.zipCode',

ship_to_country VARCHAR2(32 CHAR)

PATH

'$.ShippingInstructions.Address.country',

ship_to_phone VARCHAR2(24 CHAR)

PATH

'$.ShippingInstructions.Phone[0].number',

NESTED PATH '$.LineItems[*]'

COLUMNS (

itemno NUMBER(38) PATH

'$.ItemNumber',

description VARCHAR2(256 CHAR) PATH

'$.Part.Description',

upc_code VARCHAR2(14 CHAR) PATH

'$.Part.UPCCode',

quantity NUMBER(12,4) PATH

'$.Quantity',

unitprice NUMBER(14,2) PATH

'$.Part.UnitPrice'))) jt;

関連項目

JSON_TABLEとJSON配列の使用

GeoJSON地理データの使用

親トピック: SQL/JSONファンクションJSON_TABLE

このページは役に立ちましたか?

164

Page 166: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

19 Oracle SQLファンクションJSON_SERIALIZEOracle SQLファンクションjson_serializeは、入力としてJSONデータ(任意のSQLデータ型、VARCHAR2、CLOBまたはBLOB)を受け取り、そのテキスト表現を返します。

通常、問合せの結果を変換するには、json_serializeを使用します。エラー句およびRETURNING句がサポートされています。結果にフォーマット出力を指定でき、結果を切り捨てて戻り型に適合させることができます。

ファンクションjson_serializeは、常にJSON標準(RFC 4627)に準拠するJSONデータを生成します。返されるデータに使用されるのは、JSON言語の標準のデータ型(オブジェクト、配列、スカラー型の文字列、数値、ブールおよびNull)のみです。

json_serializeを使用すると、バイナリのJSONデータをテキスト形式(CLOBまたはVARCHAR2)に変換することや、フォーマット出力やASCII Unicode以外の文字のエスケープによってテキストのJSONデータを変換することができます。重要なユースケースとして、BLOB列に格納されているJSONデータをシリアライズする場合があげられます。BLOBの結果はAL32UTF8文字セットです。ただし、json_serializeによって返されるデータ型に関係なく、返されるデータはテキストのJSONデータを表します。

関連項目:

Oracle SQLファンクションjson_serializeの詳細は、Oracle Database SQL言語リファレンスを参照してください

例19-1 JSON_SERIALIZEを使用したBLOBデータのフォーマット出力テキストへの変換

この例では、表j_purchaseorderの列po_documentから選択されたフィールドPONumberデータの値として1600を持つJSON発注書をシリアライズしてフォーマット出力します。戻り値のデータ型はVARCHAR2(4000) (デフォルトの戻り型)です。

166

Page 167: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例4-2に、このような発注書のデータをVARCHAR2表に挿入する方法を示します。ただし、json_serializeは、BLOBデータのシリアライズに特に役立ちます。JSONデータのBLOB列を含む表を作成する方法は、例9-1を参照してください。

SELECT json_serialize(po_document, PRETTY) FROM j_purchaseorder;

関連項目

SQL問合せファンクションで使用されるRETURNING句

SQL問合せファンクションおよび条件で使用されるエラー句

親トピック: JSONデータの問合せ

コピー

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

167

Page 168: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

20 JSONデータ・ガイドJSONデータ・ガイドを使用すると、Oracle Databaseに格納されたJSON文書の構造と内容に関する情報を検出できます。

この情報には、次のような用途があります。

JSON文書セットについて記述するJSONスキーマ文書を生成します。

文書内のデータに対してSQL操作を実行するために使用できるビューを作成します。

文書内の追加または変更されたフィールドに対応する仮想列を自動的に追加または更新します。

関連項目:

JSONスキーマ: コア定義と用語json-schema-core

JSONスキーマ: 対話型および非対話型の検証

JSONデータ・ガイドの概要データ・ガイドは、一連のJSON文書に含まれる構造および型情報の概要を示します。これらの文書内で使用されているフィールドに関するメタデータを記録します。

永続的なデータ・ガイド情報: JSON検索索引の一部JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的に保存でき、この情報は新しいJSONコンテンツの追加時に自動的に更新されます。これは、JSON検索索引の作成時のデフォルトの場合です。データ・ガイド情報は、索引インフラストラクチャの一部です。

データ・ガイドの形式およびデータ・ガイドの作成方法データ・ガイドには、フラットと階層の2つの形式があります。どちらもSQLおよびPL/SQLでCLOBデータとして使用できます。データ・ガイドは、JSON検索索引に保存されたデータ・ガイド情報から、またはJSON文書をスキャンすることによって構成できます。

168

Page 169: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONデータ・ガイドのフィールドJSONデータ・ガイドの事前定義済フィールドが記述されます。これらには、JSONスキーマ・フィールド(キーワード)およびOracle固有のフィールドが含まれます。

永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー静的データ・ディクショナリ・ビューを問い合せて、データ・ガイド対応JSON検索索引があるJSON列を含む表を確認し、データ・ガイド対応JSON検索索引に記録されているJSONオブジェクトのフィールド情報を抽出できます。

フィールド列の優先名の指定JSONフィールドは、データベース・ビュー内の列として、またはJSON列を含む同じ表に追加される仮想列として、データから投影されるようにできます。このような列に優先名を指定できます。

データ・ガイド情報に基づくJSONデータのビューの作成データ・ガイド情報に基づいて、JSON文書セットに存在する特定のスカラー・フィールドを投影した列を持つデータベース・ビューを作成できます。階層データ・ガイドを編集するか、SQL/JSONパス式を指定することによって、投影するフィールドを選択でき、フィールド出現の最小頻度を選択できます。

データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールドです。

データ・ガイド対応検索索引の変更トリガーJSONデータが変更されると、データ・ガイド対応のJSON検索索引の一部の情報は自動的に更新されます。これが発生するたびに起動がトリガーされるプロシージャを指定できます。自分のPL/SQLプロシージャをこれに定義でき、事前定義済変更トリガー・プロシージャであるadd_vcを使用することもできます。

文書セットごとの複数のデータ・ガイドデータ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。

データ・ガイドの問合せデータ・ガイドは、一連のJSON文書に関する情報です。Oracle SQLファンクションjson_dataguideまたはPL/SQLファンクションDBMS_JSON.get_index_dataguideのいずれかを使用することで、取得するフラット・データ・ガイドからの情報を問合せられます。後者の場合、データ・ガイド対応JSON検索索引が、JSONデータ上で定義されている必要があります。

169

Page 170: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

発注書の文書のフラット・データ・ガイドサンプル・フラット・データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

発注書の文書の階層データ・ガイドサンプル階層データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

親トピック: JSONデータの問合せ

20.1 JSONデータ・ガイドの概要データ・ガイドは、一連のJSON文書に含まれる構造および型情報の概要を示します。これらの文書内で使用されているフィールドに関するメタデータを記録します。

たとえば、例2-1に示されたJSONオブジェクトの場合、その文書にShippingInstructionsオブジェクトがあり、これがname、Address、Phoneの各フィールドを持ち、それぞれの型が文字列、オブジェクト、配列であることが、その他の事項と一緒にデータ・ガイドに指定されます。同様に、オブジェクトAddressの構造も配列Phone内の要素の型として記録されます。

JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的に保存でき、この情報は新しいJSONコンテンツの追加時に自動的に更新されます。これは、JSON検索索引の作成時のデフォルトの場合です。データ・ガイド情報は、索引インフラストラクチャの一部です。

データ・ガイドは次の用途に使用できます。

データ・マイニング、ビジネス・インテリジェンス、その他のJSON文書の分析が関係するアプリケーションを開発するための基盤として。検索を含む、要求されたJSON情報に関するユーザー支援を提供するための基盤として。

新しいJSON文書を文書セットに追加する前に、確認または操作する(特定のフィールドの検証、型チェック、除外など)目的。

このような目的のために、次の操作を実行できます。

フィールド長や最低特定の頻度で出現するフィールドなど、文書セットに関する情報について直接データ・ガイドに問い合せます。データ・ガイドに従って、関係する特定のJSONフィールドの重要性に基づいて、フィールドを投影するビューを作成するか、仮想列を追加します。

ノート:

ビューよりも仮想列に利点があるのは、仮想列の索引を構築し、オプティマイザ用

170

Page 171: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

に仮想列に関する統計を取得できることです。仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

関連項目

JSONデータ・ガイドのフィールド

JSON検索索引: 非定型の問合せおよび全文検索

データ・ガイドの問合せ

階層データ・ガイドに基づくJSONデータのビューの作成

データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

親トピック: JSONデータ・ガイド

20.2 永続的なデータ・ガイド情報: JSON検索索引の一部JSONデータ・ガイド情報は、JSON検索索引インフラストラクチャの一部として永続的に保存でき、この情報は新しいJSONコンテンツの追加時に自動的に更新されます。これは、JSON検索索引の作成時のデフォルトの場合です。データ・ガイド情報は、索引インフラストラクチャの一部です。

CREATE SEARCH INDEXをキーワードFOR JSONと一緒に使用して、検索索引、データ・ガイド、またはこの両方を同時に作成できます。デフォルトの動作では、両方が作成されます。

JSON検索索引の検索のサポートを有効にせずに、JSON検索索引の一部として永続的データ・ガイド情報を作成するには、SEARCH_ON NONEをPARAMETERS句内でCREATE SEARCH INDEXに対して指定します。ただし、DATAGUIDEの値はON (デフォルト値)のままにします。例20-1に、これを示します。

ALTER INDEX ... REBUILDを使用して、既存のJSON検索索引のデータ・ガイドのサポートを有効または無効にできます。例20-2にこれを示します。ここでは、例26-17でデフォルトで追加されたデータ・ガイド・サポートを無効にします。

ノート: データ・ガイド対応JSON検索索引を作成する、または既存のJSON検索索引をデ

171

Page 172: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ータ・ガイド対応にするには、データベース権限CTXAPPおよびOracle Databaseリリース12c (12.2.0.1)以降が必要です。

ノート: データ・ガイド対応JSON検索索引は、is jsonチェック制約がある列にのみ構築できます。さらに、索引内のデータ・ガイド情報を更新するには、このチェック制約を有効にする必要があります。このチェック制約が何かの理由で無効になった場合、次のようにして索引内のデータ・ガイド情報を再構築してチェック制約を再有効化し、自動データ・ガイド・サポート更新を再開する必要があります。

ALTER INDEX index_name REBUILD ('dataguide off');

ALTER INDEX index_name REBUILD ('dataguide on');

ALTER TABLE table_name ENABLE CONSTRAINT

is_json_check_constraint_name;

具体的には、SQL*Loader (sqlldr)を使用するとis jsonチェック制約は無効になります。

永続的なデータ・ガイド情報は検索索引インフラストラクチャの一部であるため、常にライブです。そのコンテンツは、索引が同期されるときに毎回自動更新されます。索引付けされたデータの変更は、検索索引に反映されます。索引が同期された後にのみ、データ・ガイド情報が含まれます。

さらに、検索索引内のデータ・ガイド情報の更新では、常に情報が追加されます。情報が削除されることはありません。これは、索引が文書セット内のデータを正確に反映しないことがよくあるもう1つの理由です。適用先の文書内での削除は、データ・ガイド情報には反映されません。そのような情報が現在のデータを正確に反映する必要がある場合は、JSON検索索引を削除し、新しく作成します。

検索索引内の永続的データ・ガイド情報には、文書セット内での各JSONフィールドの使用頻度などの統計も含めることができます。統計は、文書セットに関する統計を明示的に収集した場合にのみ存在します(JSON検索索引に関して収集するなど)。自動的には更新されません。統計が最新のものであるようにするには、統計を新たに収集します。例20-3は、JSON検索索引po_search_idxによって索引付けされたJSONデータに関する統計を収集します。この索引は、例26-17で作成されます。

ノート: シャーディング環境でローカル・データ・ガイド対応JSON検索索引が作成されると、個別の各シャードに、そのシャード内に保存されているJSON文書のデータ・ガイド情報が含まれます。この理由から、シャード・カタログ・データベースに対してデー

コピー

172

Page 173: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

タ・ガイド関連操作を起動すると、その操作に効力はありません。

パーティション表のデータ・ガイド対応検索索引に関する考慮事項

パーティション表のローカルなデータ・ガイド対応JSON検索索引のデータ・ガイド情報は、パーティション化されません。すべてのパーティションで共有されます。

索引内のデータ・ガイド情報は加算的なものであるため、パーティションの削除、マージ、分割、切捨ては索引には影響しません。

パーティション表をパーティション化されていない表と交換すると、パーティション表の索引のデータ・ガイド情報が更新されます。ただし、パーティション化されていない表のデータ・ガイド対応索引は再構築する必要があります。

ハッシュ表データをシリアライズする場合は永続的なデータ・ガイド情報を使用しない

Javaハッシュ表または連想配列(JavaScriptにあるものなど)をJSONオブジェクトとしてシリアライズする場合、永続的なデータ・ガイド情報の使用を避けます。

GSONやJacksonなどの一般的なライブラリで提供されるデフォルトのハッシュ表シリアライズでは、ハッシュ表のキー・エントリから取得されたオブジェクト・フィールド名と、対応するJavaハッシュ表の値から取得されたフィールド値を持つテキストのJSONドキュメントが生成されます。単一のJavaハッシュ表エントリをシリアライズすると、新しい一意のJSONフィールドと値が生成されます。

永続的なデータ・ガイド情報は、データの形状を反映し、新しいJSON文書が挿入されると自動的に更新されます。各ハッシュ表のキー値のペアによって、JSON検索索引の個別のエントリが作成されます。そのため、このようなシリアライズによって、索引に保持される情報のサイズが大幅に増える可能性があります。サイズが大きいことに加え、多くの索引が更新されるためにパフォーマンスに悪影響がおよび、DMLが遅くなります。

ハッシュ表をシリアライズする、またはかわりに連想配列をオブジェクトのJSON配列としてシリアライズする場合、それぞれにハッシュ表キー・エントリから導出されたフィールドが含まれ、そのような問題は起きません。

ハッシュ表またはJSONオブジェクトとしての連想配列のデフォルトのシリアライズは、開発者によって割り当てられたフィールド名を持つオブジェクトと区別できません。JSONデータ・ガイドは、メタデータのようなフィールド名のどれが開発者が割り当てたものであり、データのようなフィールド名のどれがハッシュ表または連想配列から導出されたものかを識別できません。すべてのフィールド名は、開発者が指定したのと同様に、基本的にメタデータとして扱われます。

次に例を示します。

173

Page 174: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

animalNameをハッシュ・キーとして持ち、一連の動物プロパティを値として持つハッシュ表を使用してアプリケーション・オブジェクトを構築する場合、デフォルトのシリアライズは、各ハッシュ表エントリについて個別のフィールド("cat"、"mouse"、...)を持ち、対応する動物プロパティを持つオブジェクトになるフィールド値を持つ単一のJSONオブジェクトになります。これは、通常ハッシュ・キーから導出されたフィールド("cat"、"mouse"、...)数が多数になるため、データ・ガイドのサイズとパフォーマンスの面で問題になる可能性があります。かわりに、animal構造体のアプリケーション配列を構築し、それぞれに1つのフィールドanimalName (値"cat"または"mouse"...を持つ)を持たせた場合、シリアライズはオブジェクトのJSON配列となり、それぞれに同じフィールドanimalNameを持ちます。対応するデータ・ガイドにサイズやパフォーマンスの問題はありません。

例20-1 JSONデータ・ガイドの検索用でない永続的サポートの有効化

CREATE SEARCH INDEX po_dg_only_idx ON j_purchaseorder (po_document)

FOR JSON

PARAMETERS ('SEARCH_ON NONE');

例20-2 既存のJSON検索索引のJSONデータ・ガイド・サポートの無効化

ALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE OFF');

例20-3 JSON検索索引を使用したJSONデータに関する統計情報の収集

EXEC DBMS_STATS.gather_index_stats(docuser, po_search_idx, NULL, 99);

関連項目

JSON検索索引: 非定型の問合せおよび全文検索

関連項目:

CREATE SEARCH INDEXのPARAMETERS句の詳細は、Oracle Textリファレンスを参照してください。

コピー

コピー

コピー

174

Page 175: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ALTER INDEX ... REBUILDのPARAMETERS句の詳細は、Oracle Textリファレンスを参照してください。Faster XML / Jackson (Jackson JSONプロセッサの詳細)

google / gson (GSON Javaライブラリの詳細)

親トピック: JSONデータ・ガイド

20.3 データ・ガイドの形式およびデータ・ガイドの作成方法データ・ガイドには、フラットと階層の2つの形式があります。どちらもSQLおよびPL/SQLでCLOBデータとして使用できます。データ・ガイドは、JSON検索索引に保存されたデータ・ガイド情報から、またはJSON文書をスキャンすることによって構成できます。

フラット・データ・ガイドを使用して、フィールド頻度や型などのデータ・ガイド情報を問い合せられます。

フラット・データ・ガイドはJSONでオブジェクトの配列として表され、それぞれが文書セット内の特定のパスのJSONデータを示します。発注書の文書のフラット・データ・ガイドで、例2-1の発注データのフラット・データ・ガイドについて説明しています。

階層データ・ガイドを使用して、データ・ガイド情報に基づいて選択する特定のフィールドを使用することでビューを作成する、または仮想列を追加できます。階層的データ・ガイドは、ネストされたJSONデータを持つオブジェクトとして、JSONで表されます。これは、JSONスキーマ(バージョン4、json-schema-core)で定義されているものと同じ形式です。発注書の文書の階層データ・ガイドで、例2-1の発注データの階層データ・ガイドについて説明しています。

PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用して、JSON検索索引に格納されているデータ・ガイド情報からデータ・ガイドを取得します。

SQL集計関数json_dataguideを使用して、文書セットをスキャンし、データ・ガイド対応検索索引があるかどうかにかかわらず、データ・ガイドを設定して構築することもできます。データ・ガイドは、ファンクションの起動時の文書セットを正確に反映します。

表20-1 データ・ガイドを取得するためのSQLファンクションおよびPL/SQLファンクション

データ・ガイド対応検索索引を使用するかどうか フラット・データ・ガイド 階層データ・ガイド

はい PL/SQLファンクションget_index_dataguide(形式DBMS_JSON.FORMAT_FLAT)

PL/SQLファンクションget_index_dataguide(形式DBMS_JSON.FORMAT_HIERARCHICAL)

175

Page 176: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

いいえ SQLファンクションjson_dataguide (フォーマット引数を指定しないか、フォーマット引数としてDBMS_JSON.FORMAT_FLATを指定)

SQLファンクションjson_dataguide (フォーマット引数としてDBMS_JSON.FORMAT_HIERARCHICALを指定)

データ・ガイド対応JSON検索索引に基づいてデータ・ガイドを取得するメリットの例は次のとおりです。

文書セットに対する加算的な更新は、索引が同期されるたびに永続的なデータ・ガイド情報に自動的に反映されます。このデータ・ガイド情報は永続的であるため、この情報に基づいてデータ・ガイドを取得する(PL/SQLファンクションget_index_dataguideを使用)方法は、文書セットを分析してデータ・ガイドを取得する(SQLファンクションjson_dataguideを使用)方法よりも高速です。文書セットに関する統計情報を収集している場合、これらは格納された情報に含まれ、それから取得されたデータ・ガイドに含まれます。ビューまたは仮想列の作成時に列名の競合が発生すると、自動的に解決されます。

データ・ガイド対応JSON検索索引を使用せずにデータ・ガイドを取得するメリットには、データ・ガイドの正確性を保証できることや、索引のメンテナンスのオーバーヘッドが不要であることなどがあります。さらに、索引から導出されたのでないデータ・ガイドは、次のような特定のユースケースに適しています。

JSONデータが外部表にある場合。外部表に索引を作成することはできません。

JSON列に索引を付けることができても、その索引があまり有用にならない場合。列に種類が異なる文書が含まれている場合などがこれに該当します。このようなときは、JSON列に格納された文書の種類を特定するための列を表に追加すると役立つ場合があります。そうすると、SQL集計関数とGROUP BYを持つデータ・ガイドを使用できるようになります。文書セットごとの複数のデータ・ガイドを参照してください。

関連項目

発注書の文書のフラット・データ・ガイド

発注書の文書の階層データ・ガイド

永続的データ・ガイド情報: JSON検索索引の一部

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

176

Page 177: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

Oracle Database SQL言語リファレンス(PL/SQL定数DBMS_JSON.FORMAT_FLATおよびDBMS_JSON.FORMAT_HIERARCHICALの詳細)

親トピック: JSONデータ・ガイド

20.4 JSONデータ・ガイドのフィールドJSONデータ・ガイドの事前定義済フィールドが記述されます。これらには、JSONスキーマ・フィールド(キーワード)およびOracle固有のフィールドが含まれます。

データ・ガイド内のフィールドの出現箇所は、JSON文書セットのいずれか、または複数の中に存在する1つのフィールドに対応します。

JSONスキーマ・フィールド(キーワード)

JSONスキーマはJSONオブジェクトが格納されたJSON文書であり、それ自体に子オブジェクト(サブスキーマ)を含めることができます。JSONスキーマで定義されているフィールドは、JSONスキーマ・キーワードと呼ばれます。表20-2に、Oracle JSONデータ・ガイド内で使用できるキーワードを示します。キーワードproperties、items、oneOfは階層データ・ガイド内でのみ使用されます(JSONスキーマ)。キーワードtypeはフラットデータ・ガイド内と階層データ・ガイド内の両方で使用されます。

表20-2 JSONスキーマ・フィールド(キーワード)

フィールド(キーワード) 値の説明

properties 1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用されるJSONオブジェクトのプロパティを表します。

items 1つのオブジェクトであり、これに属するメンバーは、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内で使用される配列の要素(項目)を表します。

oneOf 1つの配列であり、これに属する個々の項目は、階層データ・ガイド(JSONスキーマ)によって表されるJSONデータ内のJSONフィールドの1つまたは複数の出現箇所を表します。

type 1つの文字列であり、フラットまたは階層データ・ガイドによって表されるJSONデータのいくつかの型の名前を表します。

177

Page 178: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

可能な値は、"number"、"string"、"boolean"、"null"、"object"、"array"および"GeoJSON"です。

Oracle固有のJSONデータ・ガイド・フィールド

JSONスキーマ・キーワードに加えて、JSONデータ・ガイドはOracleデータ・ガイド固有のフィールドを格納できます。すべてのフィールド名に、接頭辞o:が付きます。これについては表20-3で説明します。

表20-3 Oracle固有のデータ・ガイド・フィールド

フィールド 値の説明

o:path JSON文書からJSONフィールドへのパスを示します。フラット・データ・ガイドでのみ使用されます。値は単純なSQL/JSONパス式(フィルタ式なし)であり、緩和(暗黙的配列ラッピングまたはラッピングなし)およびワイルドカード配列ステップが付くことがあります。これには配列索引または範囲指定含む配列ステップはありません。また、関数ステップもありません。SQL/JSONパス式の構文を参照してください。

o:length JSONフィールド値の最大長をバイト単位で示します。値は常に2の累乗です。たとえば、すべての実際のフィールド値の最大長が5である場合、o:lengthの値は8です(5以上の2の最小のべき乗数)。

o:preferred_column_name 所定のデータ・ガイドに固有の識別子であり、大文字と小文字が区別されます。ビュー列またはデータ・ガイドを使用して作成された仮想列に使用する名前として選択します。

形式パラメータDBMS_JSON.FORMAT_FLATを指定するか、形式パラメータを指定しないで(DBMS_JSON.FORMAT_FLATがデフォルトです)SQLファンクションjson_dataguideを使用してデータ・ガイドが取得された場合、このフィールドはありません。

o:frequency 所定のフィールドを含むJSON文書の割合を示します。同じ配列の下に発生したフィールドの重複は無視されます。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:num_nulls 対象のスカラー・フィールドの値がJSON nullであ

178

Page 179: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

る文書数を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:high_value すべての文書中での対象のスカラー・フィールドの最高値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:low_value すべての文書中での対象のスカラー・フィールドの最低値を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

o:last_analyzed 統計情報が最後に文書セットに関して収集された日時を示します。(統計情報が文書セットに関して収集された場合にのみ、使用できます。)

データ・ガイドがSQLファンクションjson_dataguideを使用して取得された場合、このフィールドは存在しません。

スカラー要素のみを含むJSON配列が含まれる文書のデータ・ガイド情報は、(1)配列と(2)すべての配列要素の両方に対してパスと型を記録します。要素の特徴は次のとおりです。

o:path値は配列のo:path値で、その後に、すべての配列要素を示すワイルドカード([*])を含む配列が続きます。

スカラー型がすべての文書のすべての要素に対して同じでない場合、type値は型stringです。配列のすべてのスカラー要素にすべての文書で配列に同じ型が含まれる場合、その型は記録されます。

たとえば、すべての文書で、オブジェクト・フィールドserial_numbersの配列値のすべての要素がJSONの数値である場合、配列要素のtypeはnumberです。それ以外の場合は、stringです。

フィールドo:preferred_column_name (存在する場合)のデフォルト値は、データ・ガイドがSQLファンクションjson_dataguide(形式DBMS_JSON.FORMAT_HIERARCHICALを指定)を使用して取得されたか、PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用して取得されたかによって異なります。

json_dataguide(階層形式) — 対応するJSONフィールド名と同じです。

179

Page 180: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

get_index_dataguide — 対応するJSONフィールド名と同じです。JSON列名が先頭に付き、その後に$が続きます。非ASCII文字は削除されます。この結果のフィールド名が、同じデータ・ガイド内にすでにある場合、新しい順序番号が末尾に付加された固有の名前が付けられます。列がエスケープされた小文字(たとえば'PO_Column'がpo_columnのかわりに使用されているなど)を使用して定義されているのでないかぎり、列名は大文字です。たとえば、フィールドUserがJSON列po_document内のデータにある場合、このデフォルト値はPO_DOCUMENT$Userです。

PL/SQLプロシージャDBMS_JSON.rename_columnを使用して、所定のフィールドおよび型に対するo:preferred_column_nameの値を設定できます。

フィールドo:preferred_column_nameは、JSON列を格納する表内の新しい仮想列の名前を付けるために使用されます。または、表内のその他の列も格納する新しいビュー内の列の名前を付けるために使用されます。どちらの場合も、o:preferred_column_nameによって指定される名前は、表内の他の列との間で固有である必要があります。さらに、この名前は、文書セット内のすべての型のすべてのJSONフィールド間で固有である必要があります。DBMS_JSON.get_index_dataguideを使用する場合、これらの方法でデフォルトの名前が固有であることが保証されます。

DBMS_JSON.rename_columnを使用して指定する名前によって競合が発生する場合、指定した名前は無視され、そのかわりにシステムが生成した名前が使用されます。

関連項目

フィールド列の優先名の指定

発注書の文書のフラット・データ・ガイド

発注書の文書の階層データ・ガイド

GeoJSON地理データの使用

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

GeoJSONデータとOracle Spatial and Graphを連携して使用する方法の詳細は、Oracle Spatialand Graph開発者ガイドを参照してください。

180

Page 181: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Spatial and GraphとSDO_GEOMETRYオブジェクト型の詳細は、Oracle Spatial andGraph開発者ガイドを参照してください。

GeoJSONの詳細は、GeoJSON.orgを参照してください

親トピック: JSONデータ・ガイド

20.5 永続的なデータ・ガイド情報のためのデータ・ディクショナリ・ビュー静的データ・ディクショナリ・ビューを問い合せて、データ・ガイド対応JSON検索索引があるJSON列を含む表を確認し、データ・ガイド対応JSON検索索引に記録されているJSONオブジェクトのフィールド情報を抽出できます。

データ・ガイド対応の索引を持つJSON列がない表は、ビューに表示されません。

次のビューを使用すると、データ・ガイド対応JSON検索索引を持つ列を見つけることができます。ビューには、列TABLE_NAME (表名)、COLUMN_NAME (JSON列名)、DATAGUIDE (データ・ガイド)があります。

USER_JSON_DATAGUIDES — 現在のユーザーが所有する表

ALL_JSON_DATAGUIDES — 現在のユーザーがアクセス可能な表

DBA_JSON_DATAGUIDES — すべての表

JSON列にデータ・ガイド対応JSON検索索引がある場合、列DATAGUIDEの値はJSON列のデータ・ガイドであり、CLOBインスタンスとしてフラット形式です。データ・ガイド対応の索引がない場合は、ビュー内にその列の行はありません。

次のビューを使用すると、データ・ガイド対応JSON検索索引に記録されているJSONフィールドのパスおよび型情報を抽出できます。ビューには、列TABLE_NAME、COLUMN_NAME、PATH、TYPEおよびLENGTHが含まれています。列PATH、TYPEおよびLENGTHは、データ・ガイド・フィールドo:path、o:typeおよびo:lengthの値にそれぞれ対応しています。

USER_JSON_DATAGUIDE_FIELDS — 現在のユーザーが所有する表

ALL_JSON_DATAGUIDE_FIELDS — 現在のユーザーがアクセス可能な表

DBA_JSON_DATAGUIDE_FIELDS — すべての表

両方のタイプのビューの場合、ビューの名前には接頭辞ALL_またはDBA_が付き、ビューには列OWNER(値は表の所有者)が含まれています。

関連項目:

181

Page 182: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ALL_JSON_DATAGUIDESおよび関連データ・ディクショナリ・ビューの詳細は、『OracleDatabaseリファレンス』を参照してください

ALL_JSON_DATAGUIDE_FIELDSおよび関連データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください

親トピック: JSONデータ・ガイド

20.6 フィールド列の優先名の指定JSONフィールドは、データベース・ビュー内の列として、またはJSON列を含む同じ表に追加される仮想列として、データから投影されるようにできます。このような列に優先名を指定できます。

同じ文書セットから取得されたデータ・ガイドが、この投影を定義するために使用されます。投影された各列の名前は、投影されるJSONデータ・フィールド用にデータ・ガイド・フィールドo:preferred_column_nameから取得されます。優先名を指定すると、このデータ・ガイド・フィールドの値が変更されます。

JSONデータにデータ・ガイド対応の検索索引がある場合、所定のフィールドから投影された列に優先名を指定するためにプロシージャDBMS_JSON.rename_columnを使用できます。例20-4に、これを示します。表20-4に示すように、様々なフィールドから投影された列に優先名を指定します。(フィールドは、プロシージャDBMS_JSON.create_view、DBMS_JSON.create_view_on_pathまたはDBMS_JSON.add_virtual_columnsを使用するときに列として投影されます。)

表20-4 いくつかのJSONフィールド列の優先名

フィールド JSON型 優先列名

PONumber number PONumber

Phone (オブジェクトでなく文字列としての電話で番号)

string Phone

type (電話の型) string PhoneType

number (電話番号) string PhoneNumber

ItemNumber (明細項目番号) number ItemNumber

Description (部品の説明) string PartDescription

182

Page 183: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目:

JSONデータ・ガイドのフィールド(フィールドo:preferred_column_nameのデフォルト値の詳細およびDBMS_JSON.rename_columnを使用するときに発生する可能性がある名前の競合)

JSON列を使用した表の作成(ここで参照されるJSONデータの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_viewに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_view_on_pathに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

例20-4 いくつかのJSONフィールド用の優先列名の指定

BEGIN

DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT', '$.PONumber',

DBMS_JSON.TYPE_NUMBER, 'PONumber'); DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT',

'$.ShippingInstructions.Phone',

DBMS_JSON.TYPE_STRING, 'Phone'); DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT',

'$.ShippingInstructions.Phone.type',

DBMS_JSON.TYPE_STRING, 'PhoneType'); DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT',

'$.ShippingInstructions.Phone.number',

DBMS_JSON.TYPE_STRING, 'PhoneNumber'); DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT', '$.LineItems.ItemNumber',

DBMS_JSON.TYPE_NUMBER, 'ItemNumber'); DBMS_JSON.rename_column(

'J_PURCHASEORDER', 'PO_DOCUMENT',

コピー

183

Page 184: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

'$.LineItems.Part.Description',

DBMS_JSON.TYPE_STRING, 'PartDescription');END;

/

親トピック: JSONデータ・ガイド

20.7 データ・ガイド情報に基づくJSONデータのビューの作成データ・ガイド情報に基づいて、JSON文書セットに存在する特定のスカラー・フィールドを投影した列を持つデータベース・ビューを作成できます。階層データ・ガイドを編集するか、SQL/JSONパス式を指定することによって、投影するフィールドを選択でき、フィールド出現の最小頻度を選択できます。

(同じJSON文書セットに基づいて、異なるフィールドを投影する複数のビューを作成できます。文書セットごとの複数のデータ・ガイドを参照してください。)

SQL/JSONファンクションjson_table — SQL/JSONファンクション(JSON_TABLEを使用したJSONデータに対するビューの作成を参照)を使用してJSONフィールドを投影することで、ビューを作成できます。もう1つの方法は、PL/SQLプロシージャDBMS_JSON.create_viewまたはDBMS_JSON.create_view_on_pathを使用して、使用可能なデータ・ガイド情報に基づいて選択したフィールドを投影し、ビューを作成することです。

この情報は、投影するフィールドのみが含まれた階層データ・ガイド、またはデータ・ガイド対応JSON検索索引のいずれかに基づくことができ、SQL/JSONパス式と最小フィールド頻度をあわせて使用できます。

前者の場合、プロシージャcreate_viewを使用します。(階層)データ・ガイドを編集し、目的のフィールドを指定できます。この場合、データ・ガイド対応検索索引は必要ありません。

後者の場合、プロシージャcreate_view_on_pathを使用します。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。SQL/JSONパス式を指定し、必要に応じて出現の最小頻度を指定します。投影される文書セット内のフィールドには、次の両方が含まれます。

配列下にないすべてのスカラー・フィールド。

指定したSQL/JSONパス式が対象とするデータ内のすべてのレベルのすべてのスカラー・フィールド。

ビューを作成する方法に関係なく、列として投影されるJSONフィールドに加えて、表内のJSON以外の列もビューの列になります。

184

Page 185: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

プロシージャcreate_view_on_pathを使用する場合、指定するPATH引数は、単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップは付かないものである必要があります。SQL/JSONパス式の構文を参照してください。

どのように作成されても、所定のビュー定義の基礎となるデータ・ガイドは静的であり、必ずしも文書セット内の最新のデータを正確に反映しているわけではありません。ビューに投影されるフィールドは、ビューの作成時に決定されます。

具体的には、create_view_on_path (データ・ガイド対応検索索引が必要)を使用する場合、対象となるフィールドは、所定のパス式で指定されたフィールドと、所定の頻度以上のフィールドです(ビュー作成時の索引データに基づく)。

階層データ・ガイドに基づくJSONデータのビューの作成階層的なデータ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。

階層データ・ガイドに基づくJSONデータのビューの作成データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。

関連項目

JSON_TABLEを使用したJSONデータに対するビューの作成

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_viewに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_view_on_pathに関する詳細)

親トピック: JSONデータ・ガイド

20.7.1 階層データ・ガイドに基づくJSONデータのビューの作成階層的なデータ・ガイドを使用して、文書からの指定されたJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されたフィールドは、データ・ガイド内のフィールドです。投影するフィールドのみを含むようにデータ・ガイドを編集できます。

185

Page 186: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

PL/SQLファンクションDBMS_JSON.get_index_dataguideまたはSQLファンクションjson_dataguide (引数DBMS_JSON.FORMAT_HIERARCHICALを指定)を使用して階層データ・ガイドを取得できます。前者の場合、データ・ガイド対応JSON検索索引が、JSONデータの列で定義されている必要があります。

取得したデータ・ガイドを編集することで、特定のフィールドのみを含め、任意の型の長さを変更し、フィールドの名前を変更できます。結果のデータ・ガイドに、ビューの列として投影されるJSONデータのフィールドが指定されます。

PL/SQLプロシージャDBMS_JSON.create_viewを使用してビューを作成します。

例20-5に、DBMS_JSON.get_index_dataguideで取得したデータ・ガイドを使用してこれを示します。例20-6に、json_dataguide (引数DBMS_JSON.FORMAT_HIERARCHICALを指定)で取得したデータ・ガイドを使用してこれを示します。

json_dataguideで取得したデータ・ガイドを使用してビューを作成する場合は、ドキュメントのGeoJSONデータがサポートされます。この場合、GeoJSONデータに対応するビュー列は、SQLデータ型SDO_GEOMETRYになります。そのため、json_dataguideの3つ目の引数として、定数DBMS_JSON.GEOJSONまたはDBMS_JSON.GEOJSON+DBMS_JSON.PRETTYを渡します。

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_viewに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

Oracle Database SQL言語リファレンス(PL/SQL定数DBMS_JSON.FORMAT_HIERARCHICALの詳細)

例20-5 GET_INDEX_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成

この例では、データ・ガイド対応JSON検索索引列po_document(表j_purchaseorder内)から取得した階層データ・ガイド内に存在するすべてのフィールドを投影するビューを作成します。(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

186

Page 187: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

EXEC DBMS_JSON.create_view(

'VIEW1',

'J_PURCHASEORDER',

'PO_DOCUMENT',

DBMS_JSON.get_index_dataguide('J_PURCHASEORDER', 'PO_DOCUMENT',

DBMS_JSON.FORMAT_HIERARCHICAL));

DESCRIBE view1

Name Null? Type

-------------------------------- -------- -------------------------

--

DATE_LOADED TIMESTAMP(6) WITH TIME

ZONE

ID NOT NULL RAW(16)

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

Phone VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

PO_DOCUMENT$UPCCode NUMBER

PO_DOCUMENT$UnitPrice NUMBER

PartDescription VARCHAR2(32)

PO_DOCUMENT$Quantity NUMBER

ItemNumber NUMBER

PhoneType VARCHAR2(8)

PhoneNumber VARCHAR2(16)

例20-6 JSON_DATAGUIDEを使用して取得する階層データ・ガイドを使用したビューの作成

コピー

187

Page 188: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

この例では、po_document (表j_purchaseorder内)のSQLファンクションjson_dataguideを呼び出して取得した階層データ・ガイド内に存在するすべてのフィールドを投影するビューを作成します。json_dataguideに渡される第2引数と第3引数は、それぞれ、データ・ガイドが階層型であることと、フォーマット出力されることを指定するために使用されます。

このビューの列名には接頭辞PO_DOCUMENT$がないことに注意してください。接頭辞は、データ・ガイド対応JSON検索索引内の情報から取得したデータ・ガイドを使用した場合にのみ使用されます。

json_dataguideによって返されるデータ・ガイドには、事前定義されたフィールドとしてo:path、type o:length、o:preferred_column_nameのみが含まれています。フィールドo:preferred_column_nameの値はフィールド名と同じです。(統計情報を保持するフィールドはありません。これは索引にのみ格納できるためです。)

ビュー列名は、DBMS_JSON.create_viewに渡すデータ・ガイドのフィールドo:preferred_column_nameの値から取得されます。したがって、デフォルトではビューの列の名前は投影されたフィールドと同じです。

列の名前はビューで一意である必要があるため、フィールド名が一意であることを確認する必要があります。あるいは、json_dataguideによって返されるデータ・ガイドを編集し、一意性を保証する適切なo:preferred_column_nameエントリを追加する必要があります。列の名前が一意でない場合、DBMS_JSON.create_viewによってエラーが生成されます。

DECLARE

dg CLOB;

BEGIN

SELECT json_dataguide(po_document, FORMAT DBMS_JSON.FORMAT_HIERARCHICAL, DBMS_JSON.PRETTY) INTO dg FROM j_purchaseorder

WHERE extract(YEAR FROM date_loaded) = 2014;

DBMS_JSON.create_view('MYVIEW', 'J_PURCHASEORDER',

'PO_DOCUMENT', dg); END;

/

DESCRIBE myview

Name Null? Type

-------------------- -------- ---------------------------

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

コピー

188

Page 189: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ID NOT NULL RAW(16)

User VARCHAR2(8)

PONumber NUMBER

UPCCode NUMBER

UnitPrice NUMBER

Description VARCHAR2(32)

Quantity NUMBER

ItemNumber NUMBER

Reference VARCHAR2(16)

Requestor VARCHAR2(16)

CostCenter VARCHAR2(4)

AllowPartialShipment VARCHAR2(4)

name VARCHAR2(16)

Phone VARCHAR2(16)

type VARCHAR2(8)

number VARCHAR2(16)

city VARCHAR2(32)

state VARCHAR2(2)

street VARCHAR2(32)

country VARCHAR2(32)

zipCode NUMBER

Special Instructions VARCHAR2(8)

親トピック: データ・ガイド情報に基づくJSONデータのビューの作成

20.7.2 パス式に基づくJSONデータのビューの作成データ・ガイド対応JSON検索索引内の情報を使用して、文書からのJSONフィールドを投影する列を持つデータベース・ビューを作成できます。投影されるフィールドは、配列下にないスカラー・フィールドと、指定したSQL/JSONパス式の対象データ内のスカラー・フィールドです。

たとえば、パス式が$の場合、すべてのスカラー・フィールドが投影されます。これは、文書のルート(最上部)が対象であるためです。例20-7に、これを示します。パスが$.LineItems.Partの場合、$.LineItems.Partの対象データ内にあるすべてのレベルのスカラー・フィールドのみが投影されます(配列下以外のすべての場所のスカラー・フィールドに加えて)。例20-8に、これを示します。

JSON文書セットに関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内に存在するフィールドへの各パスの出現頻度を記録します。ビューを作成するときは、所定の最小出現頻度(割合として)のスカラー・フィールドのみが、ビュー列として投影されることを指定できます。これには、パラメータFREQUENCYの値と

189

Page 190: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

して、プロシージャDBMS_JSON.create_view_on_pathにゼロ以外の値を指定します。

たとえば、パスを$として指定し、最小頻度を50として指定する場合、文書の半分(50%)以上に出現するすべてのスカラー・フィールド($は文書全体を対象とするため、すべてのパス)が投影されます。例20-9に、これを示します。

引数PATHの値は単純なSQL/JSONパス式(フィルタ式なし)であり、リラクゼーション(暗黙的配列ラッピングまたはラッピングなし)が付く場合がありますが、配列ステップやファンクション・ステップが付くことはありません。SQL/JSONパス式の構文を参照してください。

頻度フィルタが発生しないのは、次のどちらの場合も該当します。対象フィールドは、文書内の出現頻度にかかわらず投影されます。

JSON文書セットの統計情報を収集したことがありません。(頻度情報は、データ・ガイド対応JSON検索索引に含まれません。)

FREQUENCY引数(DBMS_JSON.create_view_on_path内)はゼロ(0)です。

ノート: FREQUENCY引数がゼロ以外の場合、文書セットに関する統計情報を収集していても、最後に統計情報を収集した後に追加されたすべての文書の統計情報は、索引には含まれません。これは、統計の収集後に追加されたすべてのフィールドは無視される(投影されない)ことを意味します。

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_view_on_pathに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

例20-7 すべてのスカラー・フィールドを投影するビューの作成

指定されたパスが$であるため、すべてのスカラー・フィールドがビュー内に表れます。

(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。下線の行は、例20-9にはありません。)

EXEC DBMS_JSON.create_view_on_path('VIEW2',

'J_PURCHASEORDER',

'PO_DOCUMENT',

'$');

コピー

190

Page 191: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

DESCRIBE view2;

Name Null? Type

-------------------------------- -------- ------------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

Phone VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

PO_DOCUMENT$UPCCode NUMBER

PO_DOCUMENT$UnitPrice NUMBER

PartDescription VARCHAR2(32)

PO_DOCUMENT$Quantity NUMBER

ItemNumber NUMBER

PhoneType VARCHAR2(8)

PhoneNumber VARCHAR2(16)

例20-8 パス式で対象とされたスカラー・フィールドを投影するビューの作成

フィールドItemnumber、PhoneType、PhoneNumberはビュー内には表れません。投影されるフィールドは、配列下にないスカラー・フィールドに加えて、$.LineItems.Partで対象とされるデータ内のすべてのレベルにあるスカラー・フィールドのみです(つまり、パスが$.LineItems.Partで始まるパスにあるスカラー・フィールド)。(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

SQL> EXEC DBMS_JSON.create_view_on_path('VIEW4',

'J_PURCHASEORDER',

コピー

191

Page 192: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

'PO_DOCUMENT',

'$.LineItems.Part');

SQL> DESCRIBE view4;

Name Null? Type

-------------------------------- -------- ------------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

Phone VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

PO_DOCUMENT$UPCCode NUMBER

PO_DOCUMENT$UnitPrice NUMBER

PartDescription VARCHAR2(32)

例20-9 所定の頻度のスカラー・フィールドを投影するビューの作成

文書のすべて(100%)に出現するすべてのスカラー・フィールドがビュー内に表れます。フィールドAllowPartialShipmentは文書のすべてには出現しないため、列PO_DOCUMENT$AllowPartialShipmentはビュー内にありません。フィールドPhone、PhoneType、PhoneNumberの場合も同様です。

(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

SQL> EXEC DBMS_JSON.create_view_on_path('VIEW3',

'J_PURCHASEORDER',

コピー

192

Page 193: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

'PO_DOCUMENT',

'$',

100);

SQL> DESCRIBE view3;

Name Null? Type

-------------------------------- -------- ------------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

PO_DOCUMENT$UPCCode NUMBER

PO_DOCUMENT$UnitPrice NUMBER

PartDescription VARCHAR2(32)

PO_DOCUMENT$Quantity NUMBER

ItemNumber NUMBER

関連項目

フィールド列の優先名の指定

SQL/JSONパス式

親トピック: データ・ガイド情報に基づくJSONデータのビューの作成

20.8 データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除JSON列のデータ・ガイド情報に基づいて、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。投影されるスカラー・フィールドは、配列下にないフィールド

193

Page 194: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

です。

パフォーマンスを向上する目的で、仮想列を使用して次のすべてを実現できます。

列に索引を構築します。

オプティマイザ用に列の統計を収集します。

インメモリー列ストア(IM列ストア)に列をロードします。

ノート: 仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

PL/SQLプロシージャDBMS_JSON.add_virtual_columnsを使用して、JSON列用にデータ・ガイド情報に基づく仮想列を追加します。仮想列を追加する前に、add_virtual_columnsプロシージャはまず、前に起動されたadd_virtual_columnsまたはデータ・ガイド変更トリガー・プロシージャadd_vcによって、同じJSON列のフィールドから作成された既存の仮想列をすべて削除します(実質上、DBMS_JSON.drop_virtual_columnsプロシージャの動作を実行していることになります)。

プロシージャadd_virtual_columnsに提供するデータ・ガイド情報には、これ以外に次の2つのソースがあります。

引数として渡す階層データ・ガイドからの情報があります。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。

この場合、データ・ガイドが投影するスカラー・フィールド(配列下にないもの)を指定するように編集してから、データ・ガイドを渡すことができます。この場合、データ・ガイド対応検索索引は必要ありません。

データ・ガイド対応JSON検索索引からの情報があります。

この場合、投影されるスカラー・フィールドの最小出現頻度を引数FREQUENCYの値としてプロシージャadd_virtual_columnsに指定できます。この場合、データ・ガイド対応検索索引が必要ですが、データ・ガイドは必要ありません。

また、追加した仮想列を非表示にすることも指定できます。SQL describeコマンドでは、非表示にした列は列挙されません。

階層データ・ガイドをadd_virtual_columnsに渡す場合、特定のスカラー・フィールド(配列下にないもの)の投影を非表示の仮想列として指定できます。これは、データ・ガイドの列の説明に"o:hidden": trueを追加することで行います。

データ・ガイド対応JSON検索索引をadd_virtual_columnsと一緒に使用する場合、PL/SQL TRUEの値を引数HIDDENに指定し、追加されたすべての仮想列が非表示になるようにします。(HIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示

194

Page 195: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

でないことを意味します。)

階層データ・ガイドに基づくJSONフィールドの仮想列の追加階層データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。

データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。

データ・ガイド情報に基づくJSONフィールドの仮想列の削除プロシージャDBMS_JSON.drop_virtual_columnsを使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。

関連項目

インメモリーJSONデータ

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.create_view_on_pathに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.drop_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

親トピック: JSONデータ・ガイド

20.8.1 階層データ・ガイドに基づくJSONフィールドの仮想列の追加階層データ・ガイドを使用して、JSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。データ・ガイド内の配列下にないすべてのスカラー・フィールドは、仮想列として投影されます。データ・ガイド内のその他すべてのフィールドは無視されます(投影されません)。

PL/SQLファンクションDBMS_JSON.get_index_dataguideを使用することで、階層データ・ガ

195

Page 196: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

イドを取得できます。データ・ガイド対応JSON検索索引は、JSONデータの列に定義されている必要があります。

取得したデータ・ガイドを編集することで、特定のスカラー・フィールド(配列下にないもの)のみを含め、フィールドの名前を変更し、フィールドの型の長さを変更できます。結果のデータ・ガイドに、新しい仮想列として投影されるこれらのフィールドが指定されます。配列下にないスカラー・フィールドでないデータ・ガイド内のすべてのフィールドは無視されます(投影されません)。

PL/SQLプロシージャDBMS_JSON.add_virtual_columnsを使用して、投影されたフィールドを含むJSON列を格納する表に仮想列を追加します。まずプロシージャは、以前のadd_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vc(実質的に、このプロシージャの実行内容はプロシージャDBMS_JSON.drop_virtual_columnsと同じ)によって同じJSON列内のフィールドから投影された既存の仮想列を削除します。

例20-10に、これを示します。これは、JSON列po_document内の表j_purchaseorderのデータから配列下にないスカラー・フィールドを投影します。投影されたフィールドは、階層データ・ガイド内で示されるフィールドです。

例20-11に、仮想列としての2つのフィールドの投影を指定するデータ・ガイド引数を渡す方法を示しています。データ・ガイド・フィールドo:hiddenは、これらの列の1つを非表示にするために使用されます。

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.drop_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

Oracle Database SQL言語リファレンス(PL/SQL定数DBMS_JSON.FORMAT_HIERARCHICALの詳細)

例20-10 GET_INDEX_DATAGUIDEを使用して取得されたデータ・ガイドを使用したJSONフィールドを投影する仮想列の追加

この例では、階層データ・ガイドはJSON列po_documentのデータ・ガイド対応JSON検索索引から取得されます。

196

Page 197: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

追加された仮想列は、すべて表j_purchaseorder内の列です。ID、DATE_LOADED、PODOCUMENTは例外です。

(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns(

'J_PURCHASEORDER',

'PO_DOCUMENT',

DBMS_JSON.get_index_dataguide('J_PURCHASEORDER', 'PO_DOCUMENT',

DBMS_JSON.FORMAT_HIERARCHICAL));

DESCRIBE j_purchaseorder;

Name Null? Type

----------------------------------------- -------- ----------------

------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6)

WITH TIME ZONE

PO_DOCUMENT CLOB

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

Phone VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

例20-11 仮想列の非表示および表示での追加

コピー

197

Page 198: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

この例では、PO_NumberとPO_Referenceの2つのフィールドのみが仮想列として投影されます。データ・ガイドは、リテラル文字列としてローカルで定義されます。データ・ガイド・フィールドo:hiddenは、ここでPO_Referenceの仮想列を非表示にするために使用されます。(PO_Numberの場合、o:hidden: falseエントリは必要ありません。これは、falseがデフォルト値であるためです。)

DECLARE

dg CLOB;

BEGIN

dg := '{"type" : "object",

"properties" :

{"PO_Number" : {"type" : "number",

"o:length" : 4,

"o:preferred_column_name" :

"PO_Number",

"o:hidden" : false},

"PO_Reference" : {"type" : "string",

"o:length" : 16,

"o:preferred_column_name" :

"PO_Reference",

"o:hidden" : true}}}'; DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT',

dg);

END;

/

DESCRIBE j_purchaseorder;

Name Null? Type

----------- -------- ---------------------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

PO_DOCUMENT CLOB

PO_Number NUMBER

SELECT column_name FROM user_tab_columns

WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;

COLUMN_NAME

-----------

DATE_LOADED

ID

コピー

198

Page 199: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

PO_DOCUMENT

PO_NumberPO_Reference

5 rows selected.

親トピック: データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

20.8.2 データ・ガイド対応検索索引に基づくJSONフィールドの仮想列の追加JSON列のデータ・ガイド対応検索索引を使用して、そのJSONデータからのスカラー・フィールドを同じ表内の仮想列として投影できます。配列下にないスカラー・フィールドのみが投影されます。投影するフィールドの最小出現頻度を指定できます。

プロシージャDBMS_JSON.add_virtual_columnsを使用して、仮想列を追加します。

例20-12に、これを示します。配列下にないすべてのスカラー・フィールドは、表j_purchaseorderに仮想列として投影されます。

フィールドを投影するJSON列内の文書に関する統計情報を収集する場合、データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、文書セット全体で、文書内の各フィールドの出現頻度を記録します。

仮想列を追加するときは、所定の最小発生頻度のフィールドのみが投影されることを指定できます。

これには、パラメータFREQUENCYの値として、プロシージャadd_virtual_columnsにゼロ以外の値を指定します。ゼロはデフォルト値であるため、引数FREQUENCYを含めないと、すべてのスカラー・フィールド(配列下にないもの)が投影されます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。

例20-13は、文書のすべて(100%)に出現するすべてのスカラー(配列下にないもの)を仮想列として投影します。

追加されたすべての仮想列を非表示にする場合、TRUE値を引数HIDDENに指定します。(パラメータHIDDENのデフォルト値はFALSEであり、これは追加された仮想列が非表示でないことを意味します。)

例20-14は、文書のすべて(100%)に出現するスカラー・フィールド(配列下にないもの)を非表示の仮想列として投影します。

関連項目:

199

Page 200: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

例20-12 配列下にないすべてのスカラー・フィールドの仮想列としての投影

追加された仮想列は、すべて表j_purchaseorder内の列です。ID、DATE_LOADED、PODOCUMENTは例外です。これは、FREQUENCY引数がadd_virtual_columnsに渡されないため、すべてのスカラー・フィールド(配列下にないもの)が投影されます。

(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER',

'PO_DOCUMENT');

DESCRIBE j_purchaseorder;

Name Null? Type

----------------------------------------- -------- ----------------

------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6)

WITH TIME ZONE

PO_DOCUMENT CLOB

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$AllowPartialShipment VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

Phone VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

コピー

200

Page 201: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

例20-13 最小頻度のスカラー・フィールドの仮想列としての投影

文書のすべて(100%)に出現するすべてのスカラー・フィールドが、仮想列として投影されます。この結果は例20-12と同じですが、フィールドAllowPartialShipmentとPhoneが投影されない点が異なります。これは、これらが文書の100%には出現しないためです。

(名前がイタリックでdescribeコマンド出力内に記述された列は、PL/SQLプロシージャDBMS_JSON.rename_columnを使用して名前が変更された列です。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT',

100);

DESCRIBE j_purchaseorder;

Name Null? Type

----------------------------------------- -------- ----------------

------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6)

WITH TIME ZONE

PO_DOCUMENT CLOB

PO_DOCUMENT$User VARCHAR2(8)

PONumber NUMBER

PO_DOCUMENT$Reference VARCHAR2(16)

PO_DOCUMENT$Requestor VARCHAR2(16)

PO_DOCUMENT$CostCenter VARCHAR2(4)

PO_DOCUMENT$name VARCHAR2(16)

PO_DOCUMENT$city VARCHAR2(32)

PO_DOCUMENT$state VARCHAR2(2)

PO_DOCUMENT$street VARCHAR2(32)

PO_DOCUMENT$country VARCHAR2(32)

PO_DOCUMENT$zipCode NUMBER

PO_DOCUMENT$SpecialInstructions VARCHAR2(8)

例20-14 最小頻度のスカラー・フィールドの非表示の仮想列としての投影

この結果は例20-13と同じですが、追加されたすべての仮想列が非表示であることが異なりま

コピー

201

Page 202: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

す。(ビューUSER_TAB_COLUMNSの問合せは、仮想列が実際に追加されたことを示します。)

EXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'PO_DOCUMENT',

100, TRUE);

DESCRIBE j_purchaseorder;

Name Null? Type

----------------------------------------- -------- ----------------

------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6)

WITH TIME ZONE

PO_DOCUMENT CLOB

SELECT column_name FROM user_tab_columns

WHERE table_name = 'J_PURCHASEORDER'

ORDER BY 1;

COLUMN_NAME

-----------

DATE_LOADED

ID

PONumber

PO_DOCUMENT

PO_DOCUMENT$CostCenter

PO_DOCUMENT$Reference

PO_DOCUMENT$Requestor

PO_DOCUMENT$SpecialInstructions

PO_DOCUMENT$User

PO_DOCUMENT$city

PO_DOCUMENT$country

PO_DOCUMENT$name

PO_DOCUMENT$state

PO_DOCUMENT$street

PO_DOCUMENT$zipCode

親トピック: データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

20.8.3 データ・ガイド情報に基づくJSONフィールドの仮想列の削除

コピー

202

Page 203: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

プロシージャDBMS_JSON.drop_virtual_columnsを使用して、JSONフィールド用にJSONデータの列内に追加されたすべての仮想列を削除できます。

プロシージャDBMS_JSON.drop_virtual_columnsは、add_virtual_columnsの起動またはデータ・ガイド変更トリガー・プロシージャadd_vcによって所定のJSON列内のフィールドから投影されたすべての仮想列を削除します。例20-15は、列po_documentの表j_purchaseorderから投影されたフィールドについてのこの状態を示します。

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.drop_virtual_columnsに関する詳細)

例20-15 JSONフィールドから投影された仮想列の削除

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER',

'PO_DOCUMENT');

親トピック: データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

20.9 データ・ガイド対応検索索引の変更トリガーJSONデータが変更されると、データ・ガイド対応のJSON検索索引の一部の情報は自動的に更新されます。これが発生するたびに起動がトリガーされるプロシージャを指定できます。自分のPL/SQLプロシージャをこれに定義でき、事前定義済変更トリガー・プロシージャであるadd_vcを使用することもできます。

データ・ガイド対応JSON検索索引内のデータ・ガイド情報は、構造、型、および場合によってJSON文書セットに関する統計情報を記録します。収集時にのみ更新される統計情報を除いて、文書セット内の関連する変更内容は、索引内に格納されるデータ・ガイド情報に自動的に反映されます。

このような索引の更新によって起動が自動的にトリガーされるPL/SQLプロシージャを定義できます。起動は索引の更新時に発生します。プロシージャの実行中に発生したエラーは無視されます。

事前定義済変更トリガー・プロシージャadd_vcを使用して、文書セットからのJSONフィールド

コピー

203

Page 204: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

を投影する仮想列を自動的に追加する、または必要に応じてこのような既存の列を変更できます。add_vcによって追加された仮想列は、データ・ガイド対応検索索引を持つJSON列用にプロシージャDBMS_JSON.add_virtual_columnsの起動によって追加された列と同じ命名規則に従います。

この場合、プロシージャの実行中に発生したエラーは無視されます。

DBMS_JSON.add_virtual_columnsとは異なり、add_vcは、最初に同じJSON列内のフィールドから投影された既存の仮想列を削除することはありません。add_vcまたはadd_virtual_columnsによって同じJSON列内のフィールドから投影された仮想列を削除するには、プロシージャDBMS_JSON.drop_virtual_columnsを使用します。

データ・ガイドの変更のために、JSON検索索引の作成時または変更時に、キーワードDATAGUIDEON CHANGEをPARAMETERS句内で使用することによって、トリガーを使用することを指定します。索引ごとに、1つの変更トリガーのみが許可されます。トリガーを指定する索引を変更することで、そのための以前の任意トリガーは自動的に置換されます。

例20-16は、既存のJSON検索索引po_search_idxをプロシージャadd_vcを使用するための索引から変更します。

例20-16 変更トリガーADD_VCによる仮想列の自動的な追加

この例では、事前定義済変更トリガーadd_vcをJSON検索索引po_search_idxに追加します。

まず、JSON列po_document内のフィールドから、プロシージャDBMS_JSON.add_virtual_columnsまたは事前定義済add_vc変更トリガーによって同じJSON検索索引用に投影された既存の仮想列を削除します。

次に、検索索引を変更し、変更トリガーadd_vc (すでに存在する場合、これに効力はありません)を追加します。

最後に、データ・ガイドに変更を発生させる新しい文書を挿入します。2つの仮想列が、配列下にない2つのスカラー・フィールド用に表に追加されます。

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER',

'PO_DOCUMENT');

ALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE ON CHANGE add_vc');

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

コピー

204

Page 205: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

to_date('30-JUN-2015'),

'{"PO_Number" : 4230, "PO_Reference" : "JDEER-20140421", "PO_LineItems" : [{"Part_Number" : 230912362345,

"Quantity" : 3.0}]}');

DESCRIBE j_purchaseorder;

Name Null? Type

------------------------- -------- ----------------------------

ID NOT NULL RAW(16)

DATE_LOADED TIMESTAMP(6) WITH TIME ZONE

PO_DOCUMENT CLOB

PO_DOCUMENT$PO_Number NUMBER PO_DOCUMENT$PO_Reference VARCHAR2(16)

ユーザー定義のデータ・ガイド変更トリガー所定のデータ・ガイド対応JSON検索索引が更新されるたびに、自動的に起動がトリガーされるプロシージャを定義できます。プロシージャの実行中に発生したエラーは無視されます。

関連項目

データ・ガイド情報に基づくJSONフィールドの仮想列の追加と削除

関連項目:

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.add_virtual_columnsに関する詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.drop_virtual_columnsに関する詳細)

親トピック: JSONデータ・ガイド

20.9.1 ユーザー定義のデータ・ガイド変更トリガー所定のデータ・ガイド対応JSON検索索引が更新されるたびに、自動的に起動がトリガーされるプロシージャを定義できます。プロシージャの実行中に発生したエラーは無視されます。

例20-17に、これを示します。

キーワードDATAGUIDE ON CHANGEを使用してJSON検索索引PARAMETERS句内に指定されたユー

205

Page 206: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ザー定義のプロシージャは、表20-5で指定されたパラメータを受け入れる必要があります。

表20-5 ユーザー定義のデータ・ガイド変更トリガー・プロシージャのパラメータ

名前 型 説明

table_name VARCHAR2 列column_nameを格納する表の名前です。

column_name VARCHAR2 データ・ガイド対応JSON検索索引を持つJSON列の名前です。

path VARCHAR2 列column_nameのデータ内の特定のフィールドを対象とするSQL/JSONパス式です。このパスは、プロシージャの起動をトリガーする索引の変更の影響を受けます。たとえば、索引の変更は、このパスの追加、または値の型や型の長さの値の変更に関係があります。

new_type NUMBER 指定されたパスの新しい型です。

new_type_length NUMBER 指定されたパスの新しい型の長さです。

例20-17 ユーザー定義の変更トリガーを使用したデータ・ガイド更新のトレース

この例は、まずJSON列po_document内のフィールドから投影された既存の仮想列を削除します。

次に、PL/SQLプロシージャmy_dataguide_traceを定義します。これは、表名とJSON列を追加された仮想列のパス、型、長さの各フィールドと一緒に出力します。次に、JSON検索索引po_search_idxを変更し、このプロシージャが、索引内のデータ・ガイド情報への更新に対する変更トリガーとして起動されることを指定します。

次に、データ・ガイドに変更を発生させる新しい文書を挿入します。これにより、トレース情報の出力がトリガーされます。

プロシージャに対するTYPE引数は、JSON型のDBMS_JSON定数のうちの1つの数値である必要があることに注意してください。このプロシージャは、引数をテストし、数値のかわりにユーザーにわかりやすい文字列を出力します。

EXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER',

'PO_DOCUMENT');

コピー

206

Page 207: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

CREATE OR REPLACE PROCEDURE my_dataguide_trace(tableName VARCHAR2, jcolName VARCHAR2,

path VARCHAR2,

type NUMBER,

tlength NUMBER)

IS

typename VARCHAR2(10);

BEGIN

IF (type = DBMS_JSON.TYPE_NULL) THEN typename := 'null'; ELSIF (type = DBMS_JSON.TYPE_BOOLEAN) THEN typename := 'boolean';

ELSIF (type = DBMS_JSON.TYPE_NUMBER) THEN typename := 'number'; ELSIF (type = DBMS_JSON.TYPE_STRING) THEN typename := 'string'; ELSIF (type = DBMS_JSON.TYPE_OBJECT) THEN typename := 'object'; ELSIF (type = DBMS_JSON.TYPE_ARRAY) THEN typename := 'array'; ELSE typename :=

'unknown';

END IF;

DBMS_OUTPUT.put_line('Updating ' || tableName || '(' || jcolName

|| '): Path = ' || path || ', Type = ' ||

type

|| ', Type Name = ' || typename

|| ', Type Length = ' || tlength);

END;

/

ALTER INDEX po_search_idx REBUILD

PARAMETERS ('DATAGUIDE ON CHANGE my_dataguide_trace');

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

to_date('30-MAR-2016'),

'{"PO_ID" : 4230,

"PO_Ref" : "JDEER-20140421",

"PO_Items" : [{"Part_No" : 98981327234,

"Item_Quantity" : 13}]}');

COMMIT;

Updating J_PURCHASEORDER(PO_DOCUMENT):

Path = $.PO_ID, Type = 3, Type Name = number, Type Length = 4

207

Page 208: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Updating J_PURCHASEORDER(PO_DOCUMENT):

Path = $.PO_Ref, Type = 4, Type Name = string, Type Length = 16Updating J_PURCHASEORDER(PO_DOCUMENT):

Path = $.PO_Items, Type = 6, Type Name = array, Type Length = 64Updating J_PURCHASEORDER(PO_DOCUMENT):

Path = $.PO_Items.Part_No, Type = 3, Type Name = number, Type Length = 16

Updating J_PURCHASEORDER(PO_DOCUMENT):

Path = $.PO_Items.Item_Quantity, Type = 3, Type Name = number, Type Length = 2

Commit complete.

関連項目:

Oracle Database SQL言語リファレンス(PL/SQL定数TYPE_NULL、TYPE_BOOLEAN、TYPE_NUMBER、TYPE_STRING、TYPE_OBJECT、TYPE_ARRAYの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.drop_virtual_columnsに関する詳細)

親トピック: データ・ガイド対応検索索引の変更トリガー

20.10 文書セットごとの複数のデータ・ガイドデータ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。

異なる種類のJSON文書用のデータ・ガイド

JSON文書は、規定のスキーマに従う必要はなく、通常は従うことはありません。これは、所定のアプリケーションで同様に使用される文書の場合も当てはまります。これらは構造的に(形状)異なる可能性があり、フィールド型が異なる可能性があります。

JSONデータ・ガイドは、所定の文書セットの構造的情報と型情報を要約します。一般に、所定のセット内の文書の構造的情報と型情報が類似するほど、結果のデータ・ガイドの有用性は高まります。

208

Page 209: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

データ・ガイドは、JSONデータの所定の列に対して作成されます。列に異なる種類の文書(たとえば発注書と健康記録)が含まれる場合、その列に単一のデータ・ガイドを用意しても、用途が限られると考えられます。

この懸念に対処する1つの方法は、異なるJSON列に異なる種類のJSON文書を配置することです。ただし、その他の事項を考慮した結果、同じ列内に異なる種類の文書を混在させることを選ぶ場合があります。

さらに、同じ列に格納すると決定した同じ一般的な種類の文書が、それにもかかわらず系統的な方法が比較的異なる場合があります。これには、形状や型情報が発展する文書の場合が含まれます。たとえば、税情報の文書の構造が年々変更される可能性があります。

データ・ガイドの作成時に、要約する情報を決定できます。そのため、同じJSON列に異なるデータ・ガイドを作成し、文書セットの異なるサブセットを表現できます。

これに関するもう1つの対処法は、JSONでない個別の列を同じ表内に設け、JSON列内の文書のラベルまたは分類に使用することです。

例に使用されている発注書の文書の場合、構造が年々大幅に変更される可能性があると考えると、形状が類似したサブセットにグループ化するために列date_loadedを表j_purchaseorder内で使用できます。例20-18は2015の発注書の文書を追加し、例20-19は2016の発注書の文書を追加します。(例4-2で追加された2014の文書と比較します。)

複数のデータ・ガイドを作成するためのSQL集計関数の使用

Oracle SQLファンクションjson_dataguideは、実際は集計関数です。集計関数は、単一行ではなく行のグループに基づいて1つの結果行を戻します。通常SELECTリストの中でGROUP BY句を持つ問合せに使用され、問い合せられた表またはビューの行をグループに分割します。集計関数は行の各グループに適用され、各グループの単一の結果行を返します。たとえば、集計関数avgは、値グループの平均値を返します。

ファンクションjson_dataguideはJSONデータを集計し、データの要約または仕様を作成します。これはJSON文書の形式で返されます。言い換えると、適用先のJSON文書の各グループについて、データ・ガイドが返されます。

GROUP BYを省略すると、このファンクションは対象のJSON列内のすべてのJSONデータを要約した単一のデータ・ガイドを返します。

例20-20は、JSON列po_documentのドキュメントを問い合せます。このときにそれらをグループ化し、列date_loadedの各年に1つ、合計3つのデータ・ガイドを生成します。

例20-18 2015発注書の文書の追加

2015発注書形式は、部品番号、参照、明細項目のみ最上位フィールドとして使用し、これらのフ

209

Page 210: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ィールドは接頭辞PO_を使用します。各明細項目に、部品番号と数量のみが含まれます。

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

to_date('30-JUN-2015'), '{"PO_Number" : 4230,

"PO_Reference" : "JDEER-20140421",

"PO_LineItems" : [{"Part_Number" : 230912362345,

"Quantity" : 3.0}]}');

例20-19 2016発注書の文書の追加

2016形式は、PO_IDをPO_Numberのかわりに、PO_RefをPO_Referenceのかわりに、PO_ItemsをPO_LineItemsのかわりに、Part_NoをPart_Numberのかわりに、Item_QuantityをQuantityのかわりに使用します。

INSERT INTO j_purchaseorder

VALUES (

SYS_GUID(),

to_date('30-MAR-2016'), '{"PO_ID" : 4230,

"PO_Ref" : "JDEER-20140421",

"PO_Items" : [{"Part_No" : 98981327234,

"Item_Quantity" : 13}]}');

例20-20 集計ファンクションJSON_DATAGUIDEを使用した複数のデータ・ガイドの作成

この例は、SQL集計関数json_dataguideを使用して、年固有の形式につき1つ、合計3つのフラット ・データ・ガイドを取得します。2014のデータ・ガイドが部分的にのみ示されます。このガイドは、統計フィールドがないことを除き、発注書の文書のフラット・データ・ガイドからのデータ・ガイドと同じです。(ファンクションjson_dataguideによって返されるデータ・ガイドには、統計フィールドは含まれません。

SELECT extract(YEAR FROM date_loaded), json_dataguide(po_document)

FROM j_purchaseorder

GROUP BY extract(YEAR FROM date_loaded)

コピー

コピー

脚注1

コピー

210

Page 211: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ORDER BY extract(YEAR FROM date_loaded) DESC;

EXTRACT(YEARFROMDATE_LOADED)

----------------------------

JSON_DATAGUIDE(PO_DOCUMENT)

---------------------------

2016[

{

"o:path" : "$.PO_ID",

"type" : "number",

"o:length" : 4

},

{

"o:path" : "$.PO_Ref",

"type" : "string",

"o:length" : 16

},

{

"o:path" : "$.PO_Items",

"type" : "array",

"o:length" : 64

},

{

"o:path" : "$.PO_Items.Part_No",

"type" : "number",

"o:length" : 16

},

{

"o:path" : "$.PO_Items.Item_Quantity",

"type" : "number",

"o:length" : 2

}

]

2015[

{

"o:path" : "$.PO_Number",

"type" : "number",

"o:length" : 4

211

Page 212: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

},

{

"o:path" : "$.PO_LineItems",

"type" : "array",

"o:length" : 64

},

{

"o:path" : "$.PO_LineItems.Quantity",

"type" : "number",

"o:length" : 4

},

{

"o:path" : "$.PO_LineItems.Part_Number",

"type" : "number",

"o:length" : 16

},

{

"o:path" : "$.PO_Reference",

"type" : "string",

"o:length" : 16

}

]

2014[

{

"o:path" : "$.User",

"type" : "string",

"o:length" : 8

},

{

"o:path" : "$.PONumber",

"type" : "number",

"o:length" : 4

},

...

{

"o:path" : "$.\"Special Instructions\"",

"type" : "string",

"o:length" : 8

}

212

Page 213: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

]

3 rows selected.

関連項目:

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

親トピック: JSONデータ・ガイド

20.11 データ・ガイドの問合せデータ・ガイドは、一連のJSON文書に関する情報です。Oracle SQLファンクションjson_dataguideまたはPL/SQLファンクションDBMS_JSON.get_index_dataguideのいずれかを使用することで、取得するフラット・データ・ガイドからの情報を問合せられます。後者の場合、データ・ガイド対応JSON検索索引が、JSONデータ上で定義されている必要があります。

関連項目:

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

Oracle Database SQL言語リファレンス(SQL/JSONファンクションjson_tableの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database SQL言語リファレンス(PL/SQL定数DBMS_JSON.FORMAT_FLATの詳細)

例20-21 JSON_DATAGUIDEを使用して取得するデータ・ガイドの問合せ

この例は、SQL/JSONファンクションjson_dataguideを使用して、フラット・データ・ガイドを取得します。次に、SQL/JSONファンクションjson_tableによってフィールドo:path、type、o:lengthから即時に投影された関係する列を問い合せます。投影された列を、作成されたパス列jpathを基準として辞書順に返します。

WITH dg_t AS (SELECT json_dataguide(po_document) dg_doc FROM j_purchaseorder)

SELECT jt.*

FROM dg_t,

json_table(dg_doc, '$[*]' COLUMNS

コピー

213

Page 214: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

jpath VARCHAR2(40) PATH '$."o:path"', type VARCHAR2(10) PATH '$."type"',

tlength NUMBER PATH '$."o:length"') jt ORDER BY jt.jpath;

JPATH TYPE TLENGTH

---------------------------------------- ------------- -------

$."Special Instructions" string 8

$.AllowPartialShipment boolean 4

$.CostCenter string 4

$.LineItems array 512

$.LineItems.ItemNumber number 1

$.LineItems.Part object 128

$.LineItems.Part.Description string 32

$.LineItems.Part.UPCCode number 16

$.LineItems.Part.UnitPrice number 8

$.LineItems.Quantity number 4

$.PONumber number 4

$.PO_LineItems array 64

$.Reference string 16

$.Requestor string 16

$.ShippingInstructions object 256

$.ShippingInstructions.Address object 128

$.ShippingInstructions.Address.city string 32

$.ShippingInstructions.Address.country string 32

$.ShippingInstructions.Address.state string 2

$.ShippingInstructions.Address.street string 32

$.ShippingInstructions.Address.zipCode number 8

$.ShippingInstructions.Phone array 128

$.ShippingInstructions.Phone string 16

$.ShippingInstructions.Phone.number string 16

$.ShippingInstructions.Phone.type string 8

$.ShippingInstructions.name string 16

$.User string 8

例20-22 最小頻度が80%のパスに対する索引データを使用したデータ・ガイドの問合せ

この例では、PL/SQLファンクションDBMS_JSON.get_index_dataguideを形式の値DBMS_JSON.FORMAT_FLATと一緒に使用して、データ・ガイド対応JSON検索索引に格納され

214

Page 215: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ているデータ・ガイド情報からフラット・データ・ガイドを取得します。次に、フィールドo:path、type、o:length、o:frequencyからSQL/JSONファンクションjson_tableによって即時に投影された関係する列を問い合せます。

フィールドo:frequencyの値は、文書セット全体で、文書内の各フィールドの発生頻度を記録する統計情報です。文書セットに関して統計情報が収集された場合にのみ、使用できます。所定のフィールドの頻度は、そのフィールドを含む文書数をJSON列内の合計文書数で割った値が割合で表されます。

WITH dg_t AS (SELECT

DBMS_JSON.get_index_dataguide('J_PURCHASEORDER', 'PO_DOCUMENT',

DBMS_JSON.FORMAT_FLAT) dg_doc FROM DUAL)

SELECT jt.*

FROM dg_t,

json_table(dg_doc, '$[*]' COLUMNS

jpath VARCHAR2(40) PATH '$."o:path"',

type VARCHAR2(10) PATH '$."type"',

tlength NUMBER PATH '$."o:length"',

frequency NUMBER PATH '$."o:frequency"') jt WHERE jt.frequency > 80;

JPATH TYPE TLENGTH

FREQUENCY

---------------------------------------- ------------- -------- ----

-----

$.User string 8

100

$.PONumber number 4

100

$.LineItems array 512

100

$.LineItems.Part object 128

100

$.LineItems.Part.UPCCode number 16

100

$.LineItems.Part.UnitPrice number 8

コピー

215

Page 216: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

100

$.LineItems.Part.Description string 32

100

$.LineItems.Quantity number 4

100

$.LineItems.ItemNumber number 1

100

$.Reference string 16

100

$.Requestor string 16

100

$.CostCenter string 4

100

$.ShippingInstructions object 256

100

$.ShippingInstructions.name string 16

100

$.ShippingInstructions.Address object 128

100

$.ShippingInstructions.Address.city string 32

100

$.ShippingInstructions.Address.state string 2

100

$.ShippingInstructions.Address.street string 32

100

$.ShippingInstructions.Address.country string 32

100

$.ShippingInstructions.Address.zipCode number 8

100

$."Special Instructions" string 8

100

関連項目

JSONデータ・ガイドのフィールド

親トピック: JSONデータ・ガイド

20.12 発注書の文書のフラット・データ・ガイド

216

Page 217: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

サンプル・フラット・データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

フラット・データ・ガイド内で使用されるJSONスキーマ・キーワードはtypeのみです。その他のフィールドは、すべてOracleデータ・ガイド・フィールドであり、接頭辞o:が付いています。

例20-23は、表j_purchaseorder内の発注書の文書のフラット・データ・ガイドを示しています。次の事項に注意してください:

o:preferred_column_nameの値は、接頭辞PO_DOCUMENT$を使用します。この接頭辞は、このデータ・ガイドを取得するためにDBMS_JSON.get_index_dataguideを使用したことに基づきます。たとえば、o:lengthのパス$.Userの値は、フィールド値の実際の長さが5であるにもかかわらず8です。これは、o:lengthの値は、常に2の乗数であるためです。

o:pathのフィールドSpecial Instructionsの値は、中に含まれる空白文字のため、二重引用符で囲まれます("Special Instructions")。

例20-23 発注書のフラット・データ・ガイド

パスは太字で示されます。JSONスキーマ・キーワードはイタリック体で示されます。DBMS_JSON.rename_columnを使用した結果の優先列名もイタリック体で示されます。使用されている形式は、SQL/JSONファンクションjson_dataguide (フォーマット引数DBMS_JSON.FORMAT_FLATおよびDBMS_JSON.PRETTYを指定)を使用して作成された場合と類似しています。

フィールドo:frequency、o:low_value、o:high_value、o:num_nulls、o:last_analyzedがあることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。このデータの統計情報の収集例は、例20-3を参照してください。

[

{

"o:path": "$.User", "type": "string",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$User",

"o:frequency": 100,

"o:low_value": "ABULL",

"o:high_value": "SBELL",

"o:num_nulls": 0,

コピー

217

Page 218: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.PONumber", "type": "number",

"o:length": 4,

"o:preferred_column_name": "PONumber",

"o:frequency": 100,

"o:low_value": "672",

"o:high_value": "1600",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems", "type": "array",

"o:length": 512,

"o:preferred_column_name": "PO_DOCUMENT$LineItems",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems.Part", "type": "object",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Part",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems.Part.UPCCode", "type": "number",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$UPCCode",

"o:frequency": 100,

"o:low_value": "13131092899",

"o:high_value": "717951002396",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

218

Page 219: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:path": "$.LineItems.Part.UnitPrice", "type": "number",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$UnitPrice",

"o:frequency": 100,

"o:low_value": "20",

"o:high_value": "19.95",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems.Part.Description", "type": "string",

"o:length": 32,

"o:preferred_column_name": "PartDescription",

"o:frequency": 100,

"o:low_value": "Nixon",

"o:high_value": "Eric Clapton: Best Of 1981-1999",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems.Quantity", "type": "number",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$Quantity",

"o:frequency": 100,

"o:low_value": "5",

"o:high_value": "9.0",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.LineItems.ItemNumber", "type": "number",

"o:length": 1,

"o:preferred_column_name": "ItemNumber",

"o:frequency": 100,

"o:low_value": "1",

"o:high_value": "3",

"o:num_nulls": 0,

219

Page 220: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.Reference", "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$Reference",

"o:frequency": 100,

"o:low_value": "ABULL-20140421",

"o:high_value": "SBELL-20141017",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.Requestor", "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$Requestor",

"o:frequency": 100,

"o:low_value": "Sarah Bell",

"o:high_value": "Alexis Bull",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.CostCenter", "type": "string",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$CostCenter",

"o:frequency": 100,

"o:low_value": "A50",

"o:high_value": "A50",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.AllowPartialShipment", "type": "boolean",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$AllowPartialShipment",

"o:frequency": 50,

220

Page 221: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:low_value": "true",

"o:high_value": "true",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions", "type": "object",

"o:length": 256,

"o:preferred_column_name": "PO_DOCUMENT$ShippingInstructions",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.name", "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$name",

"o:frequency": 100,

"o:low_value": "Sarah Bell",

"o:high_value": "Alexis Bull",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Phone", "type": "string",

"o:length": 16,

"o:preferred_column_name": "Phone",

"o:frequency": 50,

"o:low_value": "983-555-6509",

"o:high_value": "983-555-6509",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Phone", "type": "array",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Phone_1",

"o:frequency": 50,

221

Page 222: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Phone.type", "type": "string",

"o:length": 8,

"o:preferred_column_name": "PhoneType",

"o:frequency": 50,

"o:low_value": "Mobile",

"o:high_value": "Office",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Phone.number", "type": "string",

"o:length": 16,

"o:preferred_column_name": "PhoneNumber",

"o:frequency": 50,

"o:low_value": "415-555-1234",

"o:high_value": "909-555-7307",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address", "type": "object",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Address",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address.city", "type": "string",

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$city",

"o:frequency": 100,

"o:low_value": "South San Francisco",

"o:high_value": "South San Francisco",

"o:num_nulls": 0,

222

Page 223: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address.state", "type": "string",

"o:length": 2,

"o:preferred_column_name": "PO_DOCUMENT$state",

"o:frequency": 100,

"o:low_value": "CA",

"o:high_value": "CA",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address.street", "type": "string",

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$street",

"o:frequency": 100,

"o:low_value": "200 Sporting Green",

"o:high_value": "200 Sporting Green",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address.country", "type": "string",

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$country",

"o:frequency": 100,

"o:low_value": "United States of America",

"o:high_value": "United States of America",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.ShippingInstructions.Address.zipCode", "type": "number",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$zipCode",

"o:frequency": 100,

223

Page 224: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:low_value": "99236",

"o:high_value": "99236",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"o:path": "$.\"Special Instructions\"", "type": "string",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$SpecialInstructions",

"o:frequency": 100,

"o:low_value": "Courier",

"o:high_value": "Courier",

"o:num_nulls": 1,

"o:last_analyzed": "2016-03-31T12:17:53"

}

]

関連項目

JSONデータ・ガイドのフィールド

フィールド列の優先名の指定

関連項目:

例4-2

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.get_index_dataguideの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

親トピック: JSONデータ・ガイド

20.13 発注書の文書の階層データ・ガイドサンプル階層データ・ガイドのフィールドについて記述されます。これは発注書の文書セットに対応します。

例20-24は、表j_purchaseorder内の発注書の文書の階層データ・ガイドを示しています。

224

Page 225: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例20-24 発注書の階層データ・ガイド

フィールド名は太字で示されます。JSONスキーマ・キーワードはイタリック体で示されます。DBMS_JSON.rename_columnを使用した結果の優先列名もイタリック体で示されます。使用される書式は、書式設定引数DBMS_JSON.FORMAT_HIERARCHICALおよびDBMS_JSON.PRETTYとともにSQL/JSONファンクションjson_dataguideを使用して生成されたものに似ています。

この例に、フィールドo:frequency、o:low_value、o:high_value、o:num_nulls、o:last_analyzedがあることに注意してください。統計情報が文書セットに関して収集された場合にのみ、このようになります。これらの値は、統計情報が最後に収集されたときの状態を反映しています。このデータの統計情報の収集例は、例20-3を参照してください。

{

"type": "object",

"properties": {

"User": { "type": "string",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$User",

"o:frequency": 100,

"o:low_value": "ABULL",

"o:high_value": "SBELL",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"PONumber": { "type": "number",

"o:length": 4,

"o:preferred_column_name": "PONumber",

"o:frequency": 100,

"o:low_value": "672",

"o:high_value": "1600",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"LineItems": { "type": "array",

"o:length": 512,

コピー

225

Page 226: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:preferred_column_name": "PO_DOCUMENT$LineItems",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53",

"items": {

"properties": {

"Part": { "type": "object",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Part",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53",

"properties": {

"UPCCode": { "type": "number",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$UPCCode",

"o:frequency": 100,

"o:low_value": "13131092899",

"o:high_value": "717951002396",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"UnitPrice": { "type": "number",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$UnitPrice",

"o:frequency": 100,

"o:low_value": "20",

"o:high_value": "19.95",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"Description": { "type": "string",

"o:length": 32,

"o:preferred_column_name": "PartDescription",

"o:frequency": 100,

"o:low_value": "Nixon",

"o:high_value": "Eric Clapton: Best Of 1981-1999",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

226

Page 227: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

}

}

},

"Quantity": { "type": "number",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$Quantity",

"o:frequency": 100,

"o:low_value": "5",

"o:high_value": "9.0",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"ItemNumber": { "type": "number",

"o:length": 1,

"o:preferred_column_name": "ItemNumber",

"o:frequency": 100,

"o:low_value": "1",

"o:high_value": "3",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

}

}

}

},

"Reference": { "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$Reference",

"o:frequency": 100,

"o:low_value": "ABULL-20140421",

"o:high_value": "SBELL-20141017",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"Requestor": { "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$Requestor",

"o:frequency": 100,

227

Page 228: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:low_value": "Sarah Bell",

"o:high_value": "Alexis Bull",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"CostCenter": { "type": "string",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$CostCenter",

"o:frequency": 100,

"o:low_value": "A50",

"o:high_value": "A50",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"AllowPartialShipment": { "type": "boolean",

"o:length": 4,

"o:preferred_column_name": "PO_DOCUMENT$AllowPartialShipment",

"o:frequency": 50,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"ShippingInstructions": { "type": "object",

"o:length": 256,

"o:preferred_column_name": "PO_DOCUMENT$ShippingInstructions",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53",

"properties": {

"name": { "type": "string",

"o:length": 16,

"o:preferred_column_name": "PO_DOCUMENT$name",

"o:frequency": 100,

"o:low_value": "Sarah Bell",

"o:high_value": "Alexis Bull",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"Phone": { "oneOf": [

228

Page 229: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

{

"type": "string",

"o:length": 16,

"o:preferred_column_name": "Phone",

"o:frequency": 50,

"o:low_value": "983-555-6509",

"o:high_value": "983-555-6509",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

{

"type": "array",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Phone_1",

"o:frequency": 50,

"o:last_analyzed": "2016-03-31T12:17:53",

"items": {

"properties": {

"type": { "type": "string",

"o:length": 8,

"o:preferred_column_name": "PhoneType",

"o:frequency": 50,

"o:low_value": "Mobile",

"o:high_value": "Office",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"number": { "type": "string",

"o:length": 16,

"o:preferred_column_name": "PhoneNumber",

"o:frequency": 50,

"o:low_value": "415-555-1234",

"o:high_value": "909-555-7307",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

}

}

}

}

229

Page 230: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

]

},

"Address": { "type": "object",

"o:length": 128,

"o:preferred_column_name": "PO_DOCUMENT$Address",

"o:frequency": 100,

"o:last_analyzed": "2016-03-31T12:17:53",

"properties": {

"city": { "type": "string",

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$city",

"o:frequency": 100,

"o:low_value": "South San Francisco",

"o:high_value": "South San Francisco",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"state": { "type": "string",

"o:length": 2,

"o:preferred_column_name": "PO_DOCUMENT$state",

"o:frequency": 100,

"o:low_value": "CA",

"o:high_value": "CA",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"street": { "type": "string",

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$street",

"o:frequency": 100,

"o:low_value": "200 Sporting Green",

"o:high_value": "200 Sporting Green",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"country": { "type": "string",

230

Page 231: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"o:length": 32,

"o:preferred_column_name": "PO_DOCUMENT$country",

"o:frequency": 100,

"o:low_value": "United States of America",

"o:high_value": "United States of America",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

},

"zipCode": { "type": "number",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$zipCode",

"o:frequency": 100,

"o:low_value": "99236",

"o:high_value": "99236",

"o:num_nulls": 0,

"o:last_analyzed": "2016-03-31T12:17:53"

}

}

}

}

},

"Special Instructions": { "type": "string",

"o:length": 8,

"o:preferred_column_name": "PO_DOCUMENT$SpecialInstructions",

"o:frequency": 100,

"o:low_value": "Courier",

"o:high_value": "Courier",

"o:num_nulls": 1,

"o:last_analyzed": "2016-03-31T12:17:53"

}

}

}

関連項目

JSONデータ・ガイドのフィールド

フィールド列の優先名の指定

231

Page 232: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目:

例4-2

Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguideの詳細)

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス(DBMS_JSON.rename_columnに関する詳細)

親トピック: JSONデータ・ガイド

脚注の凡例

脚注1: ファンクションjson_dataguideにオプションの2番目の引数としてDBMS_JSON.FORMAT_HIERARCHICALが渡された場合、結果は3つの階層データ・ガイドとなります。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

232

Page 233: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第V部 JSONデータの生成SQLを使用して、他の種類のデータベース・データからJSONデータをプログラム的に生成できます。このとき、SQL/JSONファンクションjson_object、json_array、json_objectaggおよびjson_arrayaggを使用します。

SQL/JSONファンクションを使用したJSONデータの生成SQL/JSONファンクションのjson_object、json_array、json_objectaggおよびjson_arrayaggについて説明します。

233

Page 235: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

21 SQL/JSONファンクションを使用したJSONデータの生成SQL/JSONファンクションのjson_object、json_array、json_objectaggおよびjson_arrayaggについて説明します。

SQL/JSONの生成関数の概要SQL/JSONファンクションjson_object、json_array、json_objectaggおよびjson_arrayaggを使用して、データベース内の非JSONデータからJSONデータを構成できます。JSONデータは、SQL値として戻されます。

SQL/JSON生成関数の入力値の処理SQL/JSON生成関数は入力としてSQLの値を受け取り、返されるSQL値内のJSON値としてこれらをレンダリングします。入力値をJSONとして表示する方法は、SQLデータ型によって異なります。

SQL/JSONファンクションJSON_OBJECTSQL/JSONファンクションjson_objectは、引数のSQL式を評価した結果からJSONオブジェクトを構成します。

SQL/JSONファンクションJSON_ARRAYSQL/JSONファンクションjson_arrayは、引数のSQL式を評価した結果からJSON配列を構成します。

SQL/JSONファンクションJSON_OBJECTAGGSQL/JSONファンクションjson_objectaggは、グループ化されたSQL問合せの複数行の情報をオブジェクト・メンバーとして集計して、JSONオブジェクトを構成します。

SQL/JSONファンクションJSON_ARRAYAGGSQL/JSONファンクションjson_arrayaggは、グループ化されたSQL問合せの複数行の情報を配列要素として集計して、JSON配列を構成します。配列要素の順序は、デフォルトで

235

Page 236: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

は、問合せ結果の順序に反映されますが、ORDER BY句を使用すると、配列要素の順序を指定できます。

親トピック: JSONデータの生成

21.1 SQL/JSONの生成関数の概要SQL/JSONファンクションjson_object、json_array、json_objectaggおよびjson_arrayaggを使用して、データベース内の非JSONデータからJSONデータを構成できます。JSONデータは、SQL値として戻されます。

これらの生成関数を使用すると、SQL問合せからJSONデータを直接簡単に構成できるようになります。非JSONデータをJSONオブジェクトおよびJSON配列として表すことが可能になります。これらの関数のコールをネストすることで、複雑で構造的なJSON文書を生成できます。ネストされた副問合せは、1対多関係を表すJSONコレクションを生成できます。

非JSONデータからJSONデータを構成するための最適な方法

SQL/JSON生成関数の使用のかわりとなる方法は、エラーが発生しやすかったり、非効率的であることが一般的です。

文字列の連結を使用したJSON文書の生成では、エラーが発生しやすくなります。特に、二重引用符(")などの特殊文字をいつ、どのようにエスケープするかという点について、順守する必要がある複雑なルールが多数あります。これらのルールは、見逃されたり誤って解釈されることが多く、その結果、正しくないJSONデータが生成される可能性が生じます。非JSONの結果セットをデータベースから読み取り、クライアント側のアプリケーション・コードを使用してJSONデータを生成する方法は、特にネットワーク・オーバーヘッドが原因で非常に効率が悪くなることが一般的です。1対多関係をJSONデータとして表す場合は、必要な非JSONデータをすべて収集するために、複数のSELECT操作が必要になることが多くなります。生成する文書で複数のレベルの1対多関係が示される場合は、この方法では必要なコストが増えることが考えられます。

SQL/JSON生成関数では、このような問題が発生しません。非JSONデータベース・データからJSONデータを構成するジョブ向けに設計されています。

これらの関数では、常に整形式のJSON文書が構成されます。

これらの関数でSQL副問合せを使用すると、1つのSQL文を使用してJSON文書一式を生成できるため、生成処理を最適化できます。クライアントに戻されるのは、生成された文書だけなので、ネットワーク・オーバーヘッドは最小化されます。生成される文書当たり、多くても1往復で済みます。

SQL/JSONの生成関数

Foot 1

236

Page 237: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ファンクションjson_objectおよびjson_arrayは、それぞれJSONオブジェクトまたは配列を構成します。最も単純なケースでは、json_objectは引数としてSQL名前/値ペアを受け取り、json_arrayは引数としてSQL値を受け取ります。

関数json_objectaggおよびjson_arrayaggは、集計のSQLファンクションです。これらの関数は、グループ化されたSQL問合せの行に格納された情報を、それぞれ、JSONオブジェクトと配列に変換します。引数の評価によって、オブジェクト・メンバーと配列要素の数が決まります。つまり、結果のサイズは現在の問合せ対象データを反映します。json_objectaggおよびjson_arrayaggの場合、オブジェクト・メンバーと配列要素の順序は、指定されません。json_arrayaggの場合、json_arrayaggの呼出し内でORDERBY句を使用すると、配列要素の順序を制御できます。

SQL/JSON生成関数によって戻される結果

デフォルトでは、生成されたJSONデータは生成関数からSQL VARCHAR2値として戻されます。オプションのRETURNING句を使用して、VARCHAR2サイズを指定するか、かわりにCLOBまたはBLOBの戻り値を指定できます。BLOBが戻り型の場合、文字セットはAL32UTF8です。

SQL/JSON生成関数の入力値の処理

SQL/JSON生成関数は入力としてSQLの値を受け取り、戻されるSQL値内のJSON値としてこれらをレンダリングします。入力値をJSONとして表示する方法は、SQLデータ型によって異なります。

SQL/JSON生成関数のオプションの動作

オプションとして、SQL NULLを処理する句、RETURNING句およびキーワードSTRICTを指定できます。

NULLを処理する句: 入力評価の結果のSQL NULL値をどのように扱うかを決定します。

NULL ON NULL: 入力のSQL NULL値が、出力のJSON nullに変換されます。これは、json_objectとjson_objectaggのデフォルト動作です。

ABSENT ON NULL: 入力のSQL NULL値の結果、対応する出力がない状態になります。これは、json_arrayとjson_arrayaggのデフォルト動作です。

RETURNING句: 関数の戻り値に使用されるSQLデータ型です。デフォルトはVARCHAR2(4000)です。

STRICTキーワード: 指定すると、戻されるJSONデータが整形式になっているかチェックされます。STRICTを指定して戻されたデータが整形式でない場合には、エラーが発生します。

関連項目

237

Page 238: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSON生成関数の入力値の処理

ISO 8601日付および時間のサポート

関連項目:

SQL/JSONファンクションjson_arrayの詳細は、Oracle Database SQL言語リファレンスを参照してください。SQL/JSONファンクションjson_arrayaggの詳細は、Oracle Database SQL言語リファレンスを参照してください。

SQL/JSONファンクションjson_objectの詳細は、Oracle Database SQL言語リファレンスを参照してください。SQL/JSONファンクションjson_objectaggの詳細は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

21.2 SQL/JSON生成関数の入力値の処理SQL/JSON生成関数は入力としてSQLの値を受け取り、戻されるSQL値内のJSON値としてこれらをレンダリングします。入力値をJSONとして表示する方法は、SQLデータ型によって異なります。

デフォルトでは、SQL NUMBER値はJSONの数値として出力に表示され、SQL VARCHAR2値はJSON文字列として表示されます。たとえば、デフォルトではVARCHAR2値'{}'はJSON文字列"{}"として表示されます。

実際に入力値がすでにJSONデータを表していることを認識しているか想定していて、値がそのまま維持されるように、これを生成関数に渡す必要がある場合があります。たとえば、入力が'{}'の場合、JSON文字列の"{}"ではなく、空のJSONオブジェクトの{}として、解釈(表示)させる必要がある場合があります。

入力式の後にキーワードFORMAT JSONを追加してこれを実行すると、そこから生成される値がすでにJSONデータを表しているとみなされることを宣言できます。同様に、キーワードAS JSONとともにSQLファンクションtreatを生成関数の入力値に適用できます。結果は、FORMAT JSONを使用した場合と同じです。

多くの場合、実際に入力値がJSONデータであることは自動的に認識できますが、その場合、入力はその後に明示的なFORMAT JSON宣言が続くかのように扱われます。これは、たとえば、値の式がSQL/JSON生成関数またはファンクションjson_queryを呼び出した場合に当てはまります。

FORMAT JSONを特定の入力値に指定しない場合で、Oracleでも値がJSONデータであることを識

238

Page 239: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

別できない場合には、この値は通常の(非JSONの)SQLデータであるとみなされます。この場合は、次のようにシリアライズされます(その他のSQL値ではエラーが発生します)。

ユーザー定義のSQLオブジェクト型のインスタンスは、フィールド名がオブジェクト属性名から取得され、フィールド値が(JSON生成が再帰的に適用される)オブジェクト属性値から取得されるJSONオブジェクトとしてレンダリングされます。SQLコレクション型のインスタンスは、(JSON生成が再帰的に適用される)コレクション要素の値から要素の値が取得されるJSON配列としてレンダリングされます。VARCHAR2、CLOBまたはNVARCHAR値は、二重引用符(")で囲まれ、JSON標準に準拠するように、必要に応じて文字がエスケープされます。数値(NUMBER、BINARY_DOUBLEまたはBINARY_FLOAT)は、JSONの数値として表示されます。(引用符では囲まれません。)

正の無限大および負の無限大の数値、および数値演算の未定義の結果である値(非数値、つまりNaN)は、JSON数値として表すことができません。これらはかわりにJSON文字列としてレンダリングされます(それぞれ"Inf"、"-Inf"および"Nan")。

RAWまたはBLOB値は、16進のJSON文字列(二重引用符"を使用)として表示されます。

時間に関連した値(DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE TIMESTAMP WITHLOCAL TIME ZONE、INTERVAL YEAR TO MONTHまたはINTERVAL DAY TOSECOND)は、サポートされているISO 8601形式で表示され、その結果は二重引用符(")で囲まれます。BOOLEAN PL/SQL値はJSONのtrueまたはfalseとして表示されます。(引用符では囲まれません。)

NULL値は、NULLデータ型に関係なく、JSONのnullとして表示されます。(引用符では囲まれません。)

ノート: データ型CLOBおよびBLOBの場合、空のインスタンスはNULLと区別され、空のJSON文字列("")として表示されます。ただし、データ型VARCHAR2、NVARCHAR2およびRAWの場合、Oracle SQLでは空の値(長さがゼロ)をNULLとして扱うため、このような値をJSON文字列として表示されると想定しないでください。

入力引数の形式は、関数から返されるデータの形式に影響する可能性があります。特に、入力がJSONの形式であると宣言されるか、自動的に判断された場合は、戻り値の計算時にJSONデータとして扱われます。例21-1に、これを示します。ここでは、FORMAT JSONを明示的に使用して、SQL文字列"true"をJSONのブール値trueに解釈しています。

例21-1 入力値のJSONとしての宣言

この例では、JSONのブール値trueおよびfalseが使用されるようにするために、FORMATJSONをSQL文字列値'true'および'false'に対して指定します。FORMAT JSONを指定しない

239

Page 240: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

と、フィールドhasCommissionの値はJSON文字列値"true"および"false"となり、JSONブール値trueおよびfalseにはなりません。

SELECT json_object('name' VALUE first_name || ' ' ||

last_name,

'hasCommission' VALUE

CASE WHEN commission_pct IS NULL THEN 'false'

ELSE 'true'

END FORMAT JSON) FROM employees WHERE first_name LIKE 'W%';

JSON_OBJECT('NAME'ISFIRST_NAME||''||LAST_NAME,'

-----------------------------------------------

{"name":"William Gietz","hasCommission":false}{"name":"William Smith","hasCommission":true}{"name":"Winston Taylor","hasCommission":false}

関連項目

SQL/JSONの生成関数の概要

SQL/JSONファンクションJSON_OBJECT

SQL/JSONファンクションJSON_ARRAY

関連項目:

https://docs.oracle.com/pls/topic/lookup?ctx=en/database/oracle/oracle-database/19/adjsn&id=SQLRF-GUID-7B72E154-677A-4342-A1EA-C74C1EA928E6#GUID-7B72E154-677A-4342-A1EA-C74C1EA928E6

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

21.3 SQL/JSONファンクションJSON_OBJECTSQL/JSONファンクションjson_objectは、引数のSQL式を評価した結果からJSONオブジェクトを構成します。

任意の数の引数を指定でき、各引数は次のいずれかです。

明示的なフィールド名/値ペア。例: answer : 42。

コピー

240

Page 241: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

名前/値ペア引数は、生成されたJSONオブジェクトのオブジェクト・メンバーを指定します(値式がSQL NULLに評価される場合、およびABSENT ON NULL句が適用される場合を除く)。名前と値はSQL式です。名前式は、SQL文字列に評価される必要があります。値式は、JSON値としてレンダリングできるSQL値に評価される必要があります。名前式と値式は、キーワードVALUEまたはコロン(:)で区切られます。

ノート: 一部のクライアント・ドライバは、問合せをデータベースに送信する前に、問合せテキストのスキャンとバインド変数の特定を試みる場合があります。その場合、バインド変数を導入するときに、json_object内の名前/値セパレータであるコロンが誤解釈されることがあります。この問題を回避するために、キーワードVALUEをセパレータとして使用('Name' VALUE Diderot)するか、単にペアの値部分をカッコで囲みます('Name':(Diderot))。

リレーショナル列名。その前に表名または別名、あるいはビュー名の後にドット(.)が続く場合があります。例: t1.address。

この場合、指定されたデータ行について、列名引数で指定されたJSONオブジェクト・メンバーにフィールド名としての列名とフィールド値としての列値が含まれます。引用符で囲まれているかどうかに関係なく、指定する列名は大/小文字を区別して解釈されます。たとえば、Emailを列名引数として使用する場合、EMAIL列のデータは、フィールド名Email (EMAILではない)を持つオブジェクト・メンバーの生成に使用されます。

表名または別名、あるいはビュー名の後にドットとアスタリスクのワイルドカード(*)。例:t1.*。(名前や別名には、myschema.t1.*のように、データベース・スキーマ名の接頭辞を付けることができます。)

この場合、表またはビューの列はすべて入力として使用されます。それぞれが明示的に指定されたかのように処理されます。特に、列名は大/小文字を区別して解釈されます。

あるいは、json_objectでは、次のいずれかである単一の引数を受け入れます。

ユーザー定義のSQLオブジェクト型のインスタンス。例:json_object(my_sql_object_42)。

この場合、結果のJSONオブジェクト・フィールド名はSQLオブジェクト属性名から付けられ、その値は(JSON生成が再帰的に適用される)SQLオブジェクト属性値から取得されます。アスタリスク・ワイルドカード(*)。例: json_object(*)。

ワイルドカードは、表またはビューのすべての列を明示的に指定してオブジェクト・メンバーを生成するためのショートカットとして機能します。結果のJSONオブジェクト・フィールド名は、大文字の列名です。ワイルドカードは、FROMリストからわかる表、ビューまたは表の別名とともに使用できます。列は任意のSQLデータ型にできます。この場合(json_object(*))と前述の場合(アスタリスクの前に、明示的な表名またはビュ

241

Page 242: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ー名(または表の別名)に続いてドットがある: json_object(t.*))の違いに注意してください。json_object(*)の場合、列名は大/小文字を区別して解釈されません。

アスタリスク・ワイルドカードをjson_objectとともに使用する方法を説明するもう1つの方法は、SQL SELECT一覧でワイルドカードに許可されているものに従っているということです。

SQL/JSON条件is jsonと同様に、キーワードSTRICTおよびWITH UNIQUE KEYSはファンクションjson_objectおよびjson_objectaggとともに使用できます。それぞれの動作はisjsonと同じです。

例21-2 JSON_OBJECTでの名前/値ペアの使用

この例では、表hr.employees (標準のデータベース・スキーマHRから)の従業員のうち、給与が15000を超える従業員それぞれのJSONオブジェクトが構成されます。

明示的な名前/値のペアを渡してJSONオブジェクトのメンバーを指定します。このオブジェクトには、フィールドcontactInfoの値として、フィールドmailとphoneのオブジェクトが含められています。

json_objectの戻り値はJSONデータになるため、フィールドcontactInfoの入力形式に対してFORMAT JSONが推定されていおり、ここで、明示的なFORMAT JSONは必要ありません。

SELECT json_object('id' : employee_id, 'name' : first_name || ' ' || last_name,

'hireDate' : hire_date,

'pay' : salary,

'contactInfo' : json_object('mail' : email, 'phone' :

phone_number

FORMAT JSON))

FROM hr.employees

WHERE salary > 15000;

-- The query returns rows such as this (pretty-printed here for

clarity):

{"id" : 101,

"name" : "Neena Kochhar",

"hireDate" : "21-SEP-05",

"pay" : 17000,

"contactInfo" : {"mail" : "NKOCHHAR",

"phone" : "515.123.4568"}}

コピー

242

Page 243: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例21-3 JSON_OBJECTでの列名の使用

この例では、employee_idが101である従業員のJSONオブジェクトを構成します。生成されるフィールドには列の名前が付けられ、大/小文字が区別されます。

SELECT json_object(last_name, hire_date,

salary,

'contactInfo' : json_object(email, phone_number) FORMAT JSON)

FROM hr.employees

WHERE employee_id = 101;

-- The query returns rows such as this (pretty-printed here for

clarity):

{"last_name" : "Neena Kochhar",

"hire-date" : "21-SEP-05",

"salary" : 17000,

"contactInfo" : {"email" : "NKOCHHAR",

"phone_number" : "515.123.4568"}}

例21-4 JSON_OBJECTでのワイルドカード(*)の使用

この例では、給与が15000を超える従業員ごとにJSONオブジェクトを構成します。従業員表の各列は、そのフィールド名が(大文字)列名である1つのオブジェクト・メンバーの構成に使用されます。SQL NULL値によってJSONフィールド値がnullになることに注意してください。

SELECT json_object(*) FROM hr.employees

WHERE salary > 15000;

-- The query returns rows such as this (pretty-printed here for

clarity):

JSON_OBJECT(*)

コピー

コピー

243

Page 244: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

--------------

{"EMPLOYEE_ID":100,

"FIRST_NAME":"Steven",

"LAST_NAME":"King",

"EMAIL":"SKING",

"PHONE_NUMBER":"515.123.4567",

"HIRE_DATE":"2003-06-17T00:00:00",

"JOB_ID":"AD_PRES",

"SALARY":24000,

"COMMISSION_PCT":null,

"MANAGER_ID":null,

"DEPARTMENT_ID":90}

{"EMPLOYEE_ID":101,

"FIRST_NAME":"Neena",

"LAST_NAME":"Kochhar",

"EMAIL":"NKOCHHAR",

"PHONE_NUMBER":"515.123.4568",

"HIRE_DATE":"2005-09-21T00:00:00",

"JOB_ID":"AD_VP",

"SALARY":17000,

"COMMISSION_PCT":null,

"MANAGER_ID":100,

"DEPARTMENT_ID":90}

{"EMPLOYEE_ID":102,

"FIRST_NAME":"Lex",

"LAST_NAME":"De Haan",

"EMAIL":"LDEHAAN",

"PHONE_NUMBER":"515.123.4569",

"HIRE_DATE":"2001-01-13T00:00:00",

"JOB_ID":"AD_VP",

"SALARY":17000,

"COMMISSION_PCT":null,

"MANAGER_ID":100,

"DEPARTMENT_ID":90}

例21-5 ABSENT ON NULLを指定したJSON_OBJECTの使用

この例では、標準のデータベース・スキーマHRの表hr.locationsに対する問合せを実行して、

244

Page 245: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

フィールドcityとprovinceが含まれるJSONオブジェクトを作成します。

json_objectに対するNULL処理のデフォルト動作は、NULL ON NULLです。

JSON値nullが含まれるフィールドが作成されないようにするために、この例ではABSENT ONNULLを使用します。列cityの値が'Singapore'のときに列state_provinceがSQL値NULLになるということは、その場所に対してprovinceフィールドが作成されていないことを意味します。

SELECT JSON_OBJECT('city' VALUE city,

'province' : state_province ABSENT ON NULL) FROM hr.locations

WHERE city LIKE 'S%';

JSON_OBJECT('CITY'ISCITY,'PROVINCE'ISSTATE_PROVINCEABSENTONNULL)

----------------------------------------------------------------

{"city":"Southlake","province":"Texas"}

{"city":"South San Francisco","province":"California"}

{"city":"South Brunswick","province":"New Jersey"}

{"city":"Seattle","province":"Washington"}

{"city":"Sydney","province":"New South Wales"}

{"city":"Singapore"}{"city":"Stretford","province":"Manchester"}

{"city":"Sao Paulo","province":"Sao Paulo"}

例21-6 JSON_OBJECTでのユーザー定義のオブジェクト型インスタンスの使用

この例では、オブジェクト型がshipping_tの列shippingを使用して表po_shipを作成します。(SQL/JSONファンクションjson_valueを使用してJSONデータからshipping_tインスタンスを構成します。例16-3を参照。)

次に、json_objectを使用して、列po_ship.shippingのSQLオブジェクト型インスタンスからJSONオブジェクトを生成します。

(ここでは、わかりやすいように、問合せの出力をフォーマット出力しています。)

CREATE TABLE po_ship AS SELECT json_value(po_document, '$.ShippingInstructions'

RETURNING shipping_t)

コピー

コピー

245

Page 246: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

shipping FROM j_purchaseorder;

DESCRIBE po_ship;

Name Null? Type

--------- ------- ----------

SHIPPING SHIPPING_T

SELECT json_object(shipping) from po_ship;

JSON_OBJECT(SHIPPING)

---------------------

{"NAME":"Alexis Bull",

"ADDRESS":{"STREET":"200 Sporting Green",

"CITY":"South San Francisco"}}

{"NAME":"Sarah Bell",

"ADDRESS":{"STREET":"200 Sporting Green",

"CITY":"South San Francisco"}}

関連項目

SQL/JSONの生成関数の概要

SQL/JSON生成関数の入力値の処理

関連項目:

select_list構文の詳細は、Oracle Database SQL言語リファレンスを参照してください

SQL/JSONファンクションjson_objectの詳細は、Oracle Database SQL言語リファレンスを参照してください。SQL識別子の構文は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

21.4 SQL/JSONファンクションJSON_ARRAYSQL/JSONファンクションjson_arrayは、引数のSQL式を評価した結果からJSON配列を構成します。

246

Page 247: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

最も単純なケースでは、json_arrayに指定する評価済引数は、JSON配列要素としてJSON値に変換されるSQL値です。結果の配列には、指定する引数ごとに要素が含められます(引数式がSQLNULLに評価される場合と、ABSENT ON NULL句が適用される場合を除く)。配列要素の順序は、引数の順序と同じです。

json_arrayの引数として使用できるSQL値には、スカラー、コレクション・インスタンス、ユーザー定義のオブジェクト型インスタンスなど、いくつかの種類があります。

例21-7 JSON_ARRAYを使用したJSON配列の構成

この例では、データベース表hr.jobs (標準のデータベース・スキーマHRから)に含まれる各従業員の仕事のJSONオブジェクトが構成されます。オブジェクトのフィールドは、役職と給与の範囲です。給与の範囲(フィールドsalaryRange)は、仕事に対する最小給与と最大給与の2つの数値の配列です。これらの値は、SQL列min_salaryおよびmax_salaryから取得されます。

SELECT json_object('title' VALUE job_title,

'salaryRange' VALUE json_array(min_salary, max_salar FROM jobs;

JSON_OBJECT('TITLE'ISJOB_TITLE,'SALARYRANGE'ISJSON_ARRAY(MIN_SALARY,MAX

-----------------------------------------------------------------------

{"title":"President","salaryRange":[20080,40000]}

{"title":"Administration Vice President","salaryRange":[15000,30000]}

{"title":"Administration Assistant","salaryRange":[3000,6000]}

{"title":"Finance Manager","salaryRange":[8200,16000]}

{"title":"Accountant","salaryRange":[4200,9000]}

{"title":"Accounting Manager","salaryRange":[8200,16000]}

{"title":"Public Accountant","salaryRange":[4200,9000]}

{"title":"Sales Manager","salaryRange":[10000,20080]}

{"title":"Sales Representative","salaryRange":[6000,12008]}

{"title":"Purchasing Manager","salaryRange":[8000,15000]}

{"title":"Purchasing Clerk","salaryRange":[2500,5500]}

{"title":"Stock Manager","salaryRange":[5500,8500]}

{"title":"Stock Clerk","salaryRange":[2008,5000]}

{"title":"Shipping Clerk","salaryRange":[2500,5500]}

{"title":"Programmer","salaryRange":[4000,10000]}

{"title":"Marketing Manager","salaryRange":[9000,15000]}

{"title":"Marketing Representative","salaryRange":[4000,9000]}

{"title":"Human Resources Representative","salaryRange":[4000,9000]}

{"title":"Public Relations Representative","salaryRange":[4500,10500]}

コピー

247

Page 248: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目

SQL/JSONの生成関数の概要

SQL/JSON生成関数の入力値の処理

SQL/JSONファンクションJSON_OBJECT

関連項目:

SQL/JSONファンクションjson_arrayの詳細は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

21.5 SQL/JSONファンクションJSON_OBJECTAGGSQL/JSONファンクションjson_objectaggは、グループ化されたSQL問合せの複数行の情報をオブジェクト・メンバーとして集計して、JSONオブジェクトを構成します。

結果のオブジェクトに含まれるメンバーの数が引数の数を直接反映するSQL/JSONファンクションjson_objectの場合とは異なり、json_objectaggでは、結果のオブジェクトのサイズは現在の問合せ対象データを反映します。このように、問合せ対象のデータによって結果のサイズが変わる可能性があります。

例21-8 JSON_OBJECTAGGを使用したJSONオブジェクトの構成

この例では、表hr.departments(標準のデータベース・スキーマHR)から単一のJSONオブジェクトを構成します。その際、列department_nameから取得したフィールド名と列department_idから取得したフィールド値が使用されます。

SELECT json_objectagg(department_name VALUE department_id) FROM departments;

-- The returned object is pretty-printed here for clarity.

-- The order of the object members is arbitrary.

JSON_OBJECTAGG(DEPARTMENT_NAMEISDEPARTMENT_ID)

----------------------------------------------

{"Administration": 10,

"Marketing": 20,

コピー

248

Page 249: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"Purchasing": 30,

"Human Resources": 40,

"Shipping": 50,

"IT": 60,

"Public Relations": 70,

"Sales": 80,

"Executive": 90,

"Finance": 100,

"Accounting": 110,

"Treasury": 120,

"Corporate Tax": 130,

"Control And Credit": 140,

"Shareholder Services": 150,

"Benefits": 160,

"Manufacturing": 170,

"Construction": 180,

"Contracting": 190,

"Operations": 200,

"IT Support": 210,

"NOC": 220,

"IT Helpdesk": 230,

"Government Sales": 240,

"Retail Sales": 250,

"Recruiting": 260,

"Payroll": 270}

関連項目

SQL/JSONの生成関数の概要

関連項目:

SQL/JSONファンクションjson_objectaggの詳細は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

21.6 SQL/JSONファンクションJSON_ARRAYAGGSQL/JSONファンクションjson_arrayaggは、グループ化されたSQL問合せの複数行の情報を配

249

Page 250: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

列要素として集計して、JSON配列を構成します。配列要素の順序は、デフォルトでは、問合せ結果の順序に反映されますが、ORDER BY句を使用すると、配列要素の順序を指定できます。

結果の配列に含まれる要素の数が引数の数を直接反映するSQL/JSONファンクションjson_arrayの場合とは異なり、json_arrayaggでは、結果の配列のサイズは現在の問合せ対象データを反映します。このように、問合せ対象のデータによって結果のサイズが変わる可能性があります。

例21-9 JSON_ARRAYAGGを使用したJSON配列の構成

この例では、表hr.employees(標準のデータベース・スキーマHRから)の従業員のうち、6名以上の従業員を管理するマネージャである従業員それぞれのJSONオブジェクトが構成されます。オブジェクトには、マネージャID番号、マネージャ名、そのマネージャに報告する従業員の数、それらの従業員のID番号用のフィールドがあります。

配列内に含まれる従業員のID番号の順序は、json_arrayaggのORDER BY句で決定されます。ORDER BYのデフォルトの方向はASC (昇順)です。配列要素(数値)は、数値順の昇順に並べられます。

SELECT json_object('id' VALUE mgr.employee_id,

'manager' VALUE (mgr.first_name || ' '|| mgr.last

'numReports' VALUE count(rpt.employee_id),

'reports' VALUE json_arrayagg(rpt.employee_id ORDER BY rpt.employ FROM employees mgr, employees rpt

WHERE mgr.employee_id = rpt.manager_id

GROUP BY mgr.employee_id, mgr.last_name, mgr.first_name HAVING count(rpt.employee_id) > 6;

-- The returned object is pretty-printed here for clarity.

JSON_OBJECT('ID'ISMGR.EMPLOYEE_ID,'MANAGER'VALUE(MGR.FIRST_NAME||''||MG

-----------------------------------------------------------------------

{"id": 100,

"manager": "Steven King",

"numReports": 14,

"reports": [101,102,114,120,121,122,123,124,145,146,147,148,149,201

{"id": 120,

"manager": "Matthew Weiss",

"numReports": 8,

"reports": [125,126,127,128,180,181,182,183]}

コピー

250

Page 251: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

{"id": 121,

"manager": "Adam Fripp",

"numReports": 8,

"reports": [129,130,131,132,184,185,186,187]}

{"id": 122,

"manager": "Payam Kaufling",

"numReports": 8,

"reports": [133,134,135,136,188,189,190,191]}

{"id": 123,

"manager": "Shanta Vollman",

"numReports": 8,

"reports": [137,138,139,140,192,193,194,195]}

{"id": 124,

"manager": "Kevin Mourgos",

"numReports": 8,

"reports": [141,142,143,144,196,197,198,199]}

関連項目

SQL/JSONの生成関数の概要

関連項目:

SQL/JSONファンクションjson_arrayaggの詳細は、Oracle Database SQL言語リファレンスを参照してください。

親トピック: SQL/JSONファンクションを使用したJSONデータの生成

脚注の凡例

脚注1: JSONデータでのSQL/JSON生成関数の動作は、XMLデータのSQL/XML生成関数の動作と似ています。

251

Page 253: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第VI部 JSON用のPL/SQLオブジェクト型JSON用のPL/SQLオブジェクト型を使用して、JSON文書の複数のフィールドに対して読み書きを行えます。これにより、特にデータの解析およびシリアライズを複数回行うことを回避することで、パフォーマンスが向上する可能性があります。

JSON用のPL/SQLオブジェクト型の概要PL/SQLオブジェクト型を使用すると、インメモリーJSONデータをプログラム的に細かく構成および操作できます。テキストのJSONデータに戻って、イントロスペクション、変更およびシリアライズを行えます。

JSON用のPL/SQLオブジェクト型の使用JSON用のPL/SQLオブジェクト型を使用した例についていくつか説明します。

253

Page 255: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

22 JSON用のPL/SQLオブジェクト型の概要PL/SQLオブジェクト型を使用すると、インメモリーJSONデータをプログラム的に細かく構成および操作できます。テキストのJSONデータに戻って、イントロスペクション、変更およびシリアライズを行えます。

主なPL/SQL JSONオブジェクト型には、JSON_ELEMENT_T、JSON_OBJECT_T、JSON_ARRAY_TおよびJSON_SCALAR_Tがあります。この他にも、使用頻度が比較的少ないオブジェクト型としてJSON_KEY_LISTがあります。これは、VARCHAR2(4000)のVARRAYです。オブジェクト型は、抽象データ型(ADT)とも呼ばれます。

これらのJSONオブジェクト型は、データベース内に格納されたJSONデータのインメモリーで(ツリーのような)階層型のプログラム的表現を提供します。

次のことを行うために、オブジェクト型を使用してJSONデータをインメモリーでプログラム的に操作できます。

既存のJSONデータの構造、型または値をチェックします。たとえば、指定したオブジェクト・フィールドの値が特定の条件を満たしているかどうかをチェックします。既存のJSONデータを変換します。たとえば、住所や電話番号の形式を特定の形式に従うように変換します。データが表す特性に一致するプログラミング・ルールを使用して、JSONデータを作成します。たとえば、JSONオブジェクトとして表す製品が可燃性のあるものだった場合に、安全情報を表すフィールドを含めます。

PL/SQLオブジェクト型インスタンスは一時的です。ここに含まれる情報を永続的に格納するには、VARCHAR2またはLOBデータにそれらをシリアル化する必要があります。これらをデータベース表またはJava Database Connectivity (JDBC)などのデータベース・クライアントへのマーシャルに格納できます。

脚注1

255

Page 256: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

インメモリーでのオブジェクト型インスタンスの構成は、JSONテキストを解析することで一括して行うか、空のオブジェクトまたは配列インスタンスから始めてそこにオブジェクト・メンバーまたは配列要素を追加することで段階的に行うかのいずれかの方法で実施します。

使用されていないオブジェクト型インスタンスは自動的なガベージ・コレクションによって処理されるため、必要なくなったインスタンスで使用されたメモリーの解放は行うことができず、その必要もありません。

通常は、PL/SQLオブジェクト型インスタンスを構成し、おそらく様々な方法でプログラム的に利用した後で、VARCHAR2、CLOBまたはBLOBのデータ型のインスタンスにシリアライズします。つまり、インメモリーのJSONデータの一時的な表現を、データベースの永続的な表現に変換します。(または、出力のためのテキストとしてのみシリアライズする場合もあります。)

JSONオブジェクト型の相互関係型JSON_ELEMENT_Tは、他のJSONオブジェクト型のスーパータイプです。各JSONオブジェクト型がサブタイプとしてこれを拡張します。サブタイプJSON_OBJECT_TおよびJSON_ARRAY_Tは、それぞれJSONオブジェクトと配列に対して使用されます。サブタイプJSON_SCALAR_Tは、スカラーJSON値である文字列、数値、ブール値のtrueおよびfalse、値nullで使用されます。

型JSON_ELEMENT_Tのインスタンスは、JSONテキストの解析によってのみ構成できます。解析によって、JSONデータのインメモリー表現である、JSON_ELEMENT_Tインスタンスが作成されます。型がJSON_ELEMENT_Tまたは型JSON_SCALAR_Tの空のインスタンスは構成できません。

型JSON_OBJECT_TとJSON_ARRAY_Tには、型と同じ名前のコンストラクタ関数があり、それぞれJSONオブジェクトまたは配列の空の(インメモリー)表現のインスタンスをその型で構成するために使用できます。その後、PL/SQLオブジェクト型インスタンスとして表されるオブジェクト・メンバーまたは配列要素を追加して、必要に応じてこのオブジェクトまたは配列にデータを入力できます。

PL/SQLファンクションtreatを使用して、JSON_ELEMENT_Tのインスタンスをサブタイプ・インスタンスにキャストできます。たとえば、treat(elt as JSON_OBJECT_T)はインスタンスeltをJSONオブジェクト(JSON_OBJECT_Tのインスタンス)としてキャストします。

解析関数静的関数parseには、引数としてVARCHAR2、CLOBまたはBLOBの型のインスタンスを指定できます。この関数は、各インスタンスをJSONテキストとして解析し、JSON_ELEMENT_T、JSON_OBJECT_TまたはJSON_ARRAY_T型のインスタンスを戻します。

シリアライズ・メソッド

256

Page 257: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

解析では、入力のJSONデータをテキストとして受け入れ、PL/SQL JSONオブジェクト型のインスタンスを戻します。シリアライズでは、基本的に反対のことが行われます。JSONデータのPL/SQLオブジェクト表現にシリアライズを適用すると、そのオブジェクトのテキスト表現が戻されます。シリアライズ・メソッドの名前は、接頭辞to_から始まります。たとえば、メソッドto_string()をJSONオブジェクト型のインスタンスに適用すると、そのインスタンスの文字列(VARCHAR2)表現が戻されます。

ほとんどのシリアライズ・メソッドはメンバ関数です。ただし、CLOBまたはBLOBインスタンスとしてのシリアライズの場合は、メンバ関数とメンバー・プロシージャの2つの形式のメソッドがあります。メンバ関数は、引数を受け入れません。この場合は、シリアライズの宛先として一時的なLOBが作成されます。メンバー・プロシージャはLOB IN OUT引数を受け入れます(メソッドto_clobの場合はCLOBインスタンス、メソッドto_blobの場合はBLOB)。このように、シリアライズされた表現に使用するLOB (空の可能性もある)に渡します。

getterメソッドとsetterメソッド型JSON_OBJECT_TおよびJSON_ARRAY_Tには、getterメソッドとsetterメソッドがあります。これらはそれぞれ、特定のオブジェクト・フィールドの値、または特定の配列要素の位置の値を取得および更新します。

getterメソッドには2つの種類があります。

メソッドget()は、メソッドを適用した元のオブジェクトへの参照を、型JSON_ELEMENT_Tのインスタンスとして戻します。つまり、メソッドの適用対象のオブジェクトは参照渡しされます。その後、戻されたJSON_ELEMENT_Tインスタンスを変更した場合、変更内容はget()を適用した元のオブジェクトに適用されます。

メソッド名に接頭辞get_が付くgetterメソッドは、適用されたオブジェクトまたは配列内で対象となった任意のデータのコピーを戻します。このデータは参照されるのではなく、値によって渡されます。

たとえば、メソッドget_string()をJSON_OBJECT_Tインスタンスに適用した場合、指定されたフィールドを引数として渡すと、そのフィールドの値の文字列のコピーが戻されます。get_string()をJSON_ARRAY_Tインスタンスに適用した場合は、指定した要素の位置を引数として渡すと、配列内のその位置にある文字列のコピーを戻します。

シリアライズ・メソッドと同様に、ほとんどのgetterメソッドはメンバ関数です。ただし、指定したオブジェクト・フィールドの値か、指定した配列の位置にある要素をCLOBまたはBLOBインスタンスとして戻すget_clob()およびget_blob()のメソッドには、(シリアライズ・メソッドto_clob()およびto_blob()のように)メンバ関数とメンバー・プロシージャの2つの形式があります。メンバ関数は、対象となるオブジェクト・フィールドまたは配列の位置以外の引数は受け入れません。一時LOBインスタンスを作成して戻します。メンバー・プロシージャはLOB INOUT引数も受け入れます(get_clobの場合はCLOB、get_blobの場合はBLOB)。このように、メ

257

Page 258: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ンバー・プロシージャを使用する(空の可能性もある)LOBインスタンスに渡すことができます。

setterメソッドは、put()、put_null()および(JSON_ARRAY_Tのみについては)append()です。これらのメソッドは、対象のオブジェクト・フィールドまたは配列要素の値を設定して、適用されたオブジェクトまたは配列のインスタンスを更新します。ノート: setterメソッドは、変更されたインスタンスのコピーを戻すかわりに、既存のインスタンスを変更します。

メソッドappend()は、配列インスタンスの末尾に新しい要素を追加します。メソッドput_null()は、オブジェクト・フィールドまたは配列要素の値をJSON nullに設定します。

メソッドput()では、2つ目の引数に設定する新しい値を指定する必要があります(オブジェクト・フィールド名または配列要素の位置の他に)。配列の場合は、put()は、オプションで3つ目の引数OVERWRITEも受け入れます。これは、BOOLEAN値で(デフォルトはFALSE)、指定された位置にある既存の値を置換するかどうかを示します。

オブジェクトに、同じ名前のフィールドがすでにある場合、put()はその値を置き換えて新しい値にします。配列の指定された位置に要素がすでにあった場合は、デフォルトの動作として、put()はその要素とそれに続くすべての要素を先に移動させ(それらの位置を1つずつインクリメントして)、新しい要素のためのスペースを作成します。これで、新しい要素が指定された位置に配置されます。ただし、オプションの引数OVERWRITEが指定されていてTRUEの場合、指定された位置の既存の要素は、単純に新しい要素で置き換えられます。

イントロスペクション・メソッド型JSON_ELEMENT_Tには、インスタンスがJSONオブジェクト、配列、スカラー、文字列、数値またはブール値かどうか、またはJSON値true、falseまたはnullであるかどうかを判断するために使用できる、イントロスペクション・メソッドがあります。これらのメソッドの名前は、接頭辞is_で始まります。これらは、BOOLEAN値を戻す述語です。

この型には、イントロスペクション・メソッドget_size()もあります。これは、JSON_OBJECT_Tインスタンスのメンバーの数と、JSON_ARRAY_Tインスタンスの要素数を戻します(JSON_SCALAR_Tインスタンスに対して1を戻します)。

型JSON_ELEMENT_Tには、イントロスペクション・メソッドis_date()とis_timestamp()もあります。これらは、インスタンスが日付またはタイムスタンプを表すかどうかをテストします。JSONには、日付またはタイムスタンプのネイティブ・タイプはありません。これらは、通常、JSON文字列を使用して表されています。ただし、JSON_ELEMENT_Tインスタンスが、SQLデータ型DATEまたはTIMESTAMPのSQLデータを使用して構成されている場合、この型情報は、PL/SQLのオブジェクト表現用に保持されます。

日付とタイムスタンプのデータは、PL/SQLオブジェクト型JSON_SCALAR_Tを使用して表されま

258

Page 259: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

す。この型のインスタンスは、直接構成することはできません。ただし、このような値をオブジェクト(フィールド値として追加)または配列(要素として)にメソッドput()を使用して追加できます。メソッドget()を使用してこれを取得すると、JSON_SCALAR_Tインスタンスが戻されます。

型JSON_OBJECT_TおよびJSON_ARRAY_Tには、イントロスペクション・メソッドget_type()があります。これは、対象となるオブジェクト・フィールドまたは配列要素のJSON型を戻します(VARCHAR2インスタンスとして)。また、型JSON_OBJECT_Tには2つのイントロスペクション・メソッドがあります。has()は、オブジェクトに指定された名前のフィールドがすでにある場合はTRUEを戻します。また、get_keys()は、PL/SQLオブジェクト型JSON_KEY_LISTのインスタンスを戻します。これは、VARCHAR2(4000)のVARRAYです。VARRAYには、指定されたJSON_OBJECT_Tインスタンスにあるフィールド の名前が含まれます。

その他のメソッド型JSON_OBJECT_TおよびJSON_ARRAY_Tには、次のメソッドがあります。

remove(): 指定されたフィールドまたは指定された位置の配列要素を持つオブジェクト・メンバーを削除します。clone(): メソッドが適用されるオブジェクトまたは配列の(ディープ)コピーを作成および戻します。このコピーを変更しても、元のオブジェクトまたは配列に影響はありません。

型JSON_OBJECT_Tにはメソッドrename_key()があります。これは、指定されたオブジェクト・フィールドの名前を変更します。 指定された新しい名前が既存のフィールドの名前だった場合は、エラーが発生します。

関連項目:

JSON_ARRAY_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_ELEMENT_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_OBJECT_TおよびJSON_KEY_LISTの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_SCALAR_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

関連項目

JSON用のPL/SQLオブジェクト型の使用

脚注2脚注2

脚注2

259

Page 260: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

親トピック: JSON用のPL/SQLオブジェクト型

脚注の凡例

脚注1: これは、Document Object Model (DOM)を使用してXMLデータで使用可能なものと類似しています。DOMは、言語やプラットフォームに依存しないオブジェクト・モデルおよびAPIで、XMLドキュメントの構造へのアクセス用にWorld Wide Web Consortium (W3C)から推奨されています。脚注2: オブジェクト・フィールドは、オブジェクトの「キー」と呼ばれることもあります。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

260

Page 261: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

23 JSON用のPL/SQLオブジェクト型の使用JSON用のPL/SQLオブジェクト型を使用した例についていくつか説明します。

関連項目:

JSON_ARRAY_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_ELEMENT_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_OBJECT_Tの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

JSON_KEY_LISTの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

例23-1 インメモリーJSONオブジェクトの構成およびシリアライズ

この例では、関数parseを使用して、nameという1つのフィールドを持つJSONオブジェクトを表すJSONデータの文字列を解析し、オブジェクト型JSON_ELEMENT_Tのインスタンスjeを作成します。このインスタンスは、オブジェクトを表すかどうかを確認するために、イントロスペクション・メソッド(述語)is_object()を使用してテストされます。

インスタンスがオブジェクトを表す場合(述語がjeに対してTRUEを戻す)、JSON_OBJECT_Tのインスタンスにキャストされて変数joに割り当てられます。次に、オブジェクト型JSON_OBJECT_Tのメソッドput()を使用して、オブジェクト・フィールドpriceが値149.99で追加されます。

最後に、JSON_ELEMENT_Tインスタンスのje (JSON_OBJECT_Tインスタンスのjoと同じインメ

261

Page 262: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

モリーデータ)は、メソッドto_string()を使用して文字列にシリアライズされ、この文字列がプロシージャDBMS_OUTPUT.put_lineを使用して出力されます。結果の出力には、更新されたオブジェクトが{"name":"Radio-controlled plane","price":149.99}として表されます。

更新された一時オブジェクトjeは、ここで出力のためだけにシリアライズされますが、結果のテキストはデータベースには格納されません。場合によっては、サンプル・コードが実行された後に、オブジェクト型インスタンスjeおよびjoに割り当てられているメモリーは、ガベージ・コレクションによって回収されます。

DECLARE

je JSON_ELEMENT_T; jo JSON_OBJECT_T;BEGIN

je := JSON_ELEMENT_T.parse('{"name":"Radio controlled plane"}'); IF (je.is_Object) THEN jo := treat(je AS JSON_OBJECT_T); jo.put('price', 149.99); END IF;

DBMS_OUTPUT.put_line(je.to_string);END;

/

例23-2 メソッドGET_KEYS()を使用したオブジェクト・フィールドのリストの取得

PL/SQLメソッドget_keys()が、PL/SQLオブジェクト型JSON_OBJECT_Tに対して定義されています。これにより、PL/SQLオブジェクト型JSON_KEY_LISTのインスタンスが返されます。これは、VARCHAR2(4000)のVARRAYです。VARRAYには指定されたJSON_OBJECT_Tインスタンスのフィールド名すべてが格納されています。

この例は、get_keys()によって戻されるフィールドにわたって繰り返し処理し、これらのフィールドをPL/SQLオブジェクト型JSON_ARRAY_Tのインスタンスに追加します。次に、メソッドto_string()を使用して、そのJSON配列をシリアライズして結果の文字列を出力します。

DECLARE

jo JSON_OBJECT_T;

ja JSON_ARRAY_T;

keys JSON_KEY_LIST;

keys_string VARCHAR2(100);

コピー

コピー

262

Page 263: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

BEGIN

ja := new JSON_ARRAY_T;

jo := JSON_OBJECT_T.parse('{"name":"Beda", "jobTitle":"codmonki", "projects":["json", "xml"]}'); keys := jo.get_keys; FOR i IN 1..keys.COUNT LOOP

ja.append(keys(i)); END LOOP;

keys_string := ja.to_string; DBMS_OUTPUT.put_line(keys_string);

END;

/

出力は、["name","jobTitle","projects"]のようになります。

例23-3 メソッドPUT()を使用したJSON文書の部分的な更新

この例では、表j_purchaseorderのJSON列po_documentに含まれる発注書の文書をそれぞれ更新します。各文書内のJSON配列LineItemsにわたって繰り返し処理し(変数li_arr)、明細項目オブジェクトごとに合計金額と数量を計算し(変数li_obj)、メソッドput()を使用してこれらの合計を新しいフィールドtotalQuantityおよびtotalPriceの値としてli_objに追加します。これは、ユーザー定義の関数add_totalsを使用して行われます。

ここでのSELECT文では、更新された文書の1つが選択されます。

CREATE OR REPLACE FUNCTION add_totals(purchaseOrder IN VARCHAR2) RETURN VARCHAR2 IS

po_obj JSON_OBJECT_T;

li_arr JSON_ARRAY_T;

li_item JSON_ELEMENT_T;

li_obj JSON_OBJECT_T;

unitPrice NUMBER;

quantity NUMBER;

totalPrice NUMBER := 0;

totalQuantity NUMBER := 0;

BEGIN

po_obj := JSON_OBJECT_T.parse(purchaseOrder); li_arr := po_obj.get_Array('LineItems');

コピー

263

Page 264: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

FOR i IN 0 .. li_arr.get_size - 1 LOOP li_obj := JSON_OBJECT_T(li_arr.get(i)); quantity := li_obj.get_Number('Quantity'); unitPrice := li_obj.get_Object('Part').get_Number('UnitPrice'); totalPrice := totalPrice + (quantity * unitPrice);

totalQuantity := totalQuantity + quantity;

END LOOP;

po_obj.put('totalQuantity', totalQuantity); po_obj.put('totalPrice', totalPrice); RETURN po_obj.to_string;END;

/

UPDATE j_purchaseorder SET (po_document) = add_totals(po_document);

SELECT po_document FROM j_purchaseorder po WHERE

po.po_document.PONumber = 1600;

この更新された文書が選択されます。

{"PONumber": 1600,

"Reference": "ABULL-20140421",

"Requestor": "Alexis Bull",

"User": "ABULL",

"CostCenter": "A50",

"ShippingInstructions": {"name": "Alexis Bull",

"Address": {"street": "200 Sporting

Green",

"city": "South San Francisco",

"state": "CA",

"zipCode": 99236,

"country": "United States of

America"},

"Phone": [{"type": "Office", "number":

"909-555-7307"},

{"type": "Mobile", "number":

"415-555-1234"}]},

"Special Instructions": null,

"AllowPartialShipment": true,

コピー

264

Page 265: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

"LineItems": [{"ItemNumber": 1,

"Part": {"Description": "One Magic Christmas",

"UnitPrice": 19.95,

"UPCCode": 13131092899},

"Quantity": 9.0},

{"ItemNumber": 2,

"Part": {"Description": "Lethal Weapon",

"UnitPrice": 19.95,

"UPCCode": 85391628927},

"Quantity": 5.0}],

"totalQuantity": 14, "totalPrice": 279.3}

関連項目

JSON用のPL/SQLオブジェクト型の概要

JSONマージ・パッチによるJSONドキュメントの更新

親トピック: JSON用のPL/SQLオブジェクト型

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

265

Page 266: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第VII部 GeoJSON地理データGeoJSONデータは、地理的なJSONデータです。Oracle Spatial and Graphでは、GeoJSONオブジェクトを使用したGeoJSONデータの格納、索引付けおよび管理がサポートされています。

GeoJSON地理データの使用GeoJSONオブジェクトは、地理的データを表すJSONオブジェクトです。GeoJSONデータの作成、索引付けおよび問合せの例を示します。

266

Page 268: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

24 GeoJSON地理データの使用GeoJSONオブジェクトは、地理的データを表すJSONオブジェクトです。GeoJSONデータの作成、索引付けおよび問合せの例を示します。

GeoJSONオブジェクト: ジオメトリ、機能、機能コレクションGeoJSONは、様々なジオメトリ・エンティティを表すJSONオブジェクトやこれらの組合せとユーザー定義のプロパティを一緒に使用します。

位置は、2つ以上の空間(数値)座標の配列で、先頭から3つは、一般的に経度、緯度および標高を表します。

ジオメトリ・オブジェクトには、表24-1に示すように、typeフィールドと(ジオメトリ・コレクション・オブジェクトを除いて) coordinatesフィールドがあります。

ジオメトリ・コレクションは、typeがGeometryCollectionのジオメトリ・オブジェクトです。このオブジェクトには、coordinatesフィールドのかわりにgeometriesフィールドがあります。この値は、GeometryCollectionオブジェクト以外のジオメトリ・オブジェクトの配列です。

表24-1 ジオメトリ・コレクション以外のGeoJSONジオメトリ・オブジェクト

typeフィールド coordinatesフィールド

Point 位置。

MultiPoint 位置の配列。

LineString 2つ以上の位置の配列。

MultiLineString 位置のLineString配列の配列。

Polygon 最初と最後の位置が一致する(同等の)LineStringが配列として含まれ

268

Page 269: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

るMultiLineString。ポリゴンの配列に複数の配列が含まれる場合、最初の配列は外側のポリゴンを表し、その他はその中の穴を表します。

MultiPolygon 位置のPolygon配列の配列。つまり、位置の多次元の配列。

機能オブジェクトには、値がFeatureのtypeフィールドと、値がジオメトリ・オブジェクトのgeometryフィールドと、任意のJSONオブジェクトを値にできるpropertiesフィールドがあります。

機能コレクション・オブジェクトには、値がFeatureCollectionのtypeフィールドと、値が機能オブジェクトの配列のfeaturesフィールドがあります。

例24-1に、features配列に3つの機能が含まれる機能コレクション・オブジェクトを表します。最初の機能のgeometryのタイプはPointで、2つ目のタイプはLineStringで、3つ目のタイプはPolygonです。

GeoJSONデータの問合せおよび索引付けSQL/JSON問合せファンクションおよび条件を使用して、GeoJSONデータを調べたり、その一部を(Oracle Spatial and GraphのSDO_GEOMETRYオブジェクト型インスタンスを含む)非JSONデータとして投影できます。これは例24-2、例24-3、例24-5で説明しています。

問合せのパフォーマンスを向上させるために、GeoJSONデータに適用する関数json_valueで、Oracle Spatial and Graphの索引(型MDSYS.SPATIAL_INDEX)を作成できます。これを、例24-4に示します。

例24-4では、ジオメトリ機能の配列(最初の要素)の特定の1つの要素のみを索引付けします。ファンクションjson_valueのBツリー索引は、スカラー値のみを対象にできます。例24-3のような、任意の数の配列要素を対象とした問合せのパフォーマンスを改善するために、次の操作を実行できます。

ON STATEMENTの、リフレッシュ可能な配列データのマテリアライズド・ビューを作成し、インメモリーにそのビューを配置します。

配列データに対して空間索引を作成します。

例24-6および例24-7を参照してください。

SDO_GEOMETRYオブジェクト型インスタンスと空間操作Oracle Spatial and GraphのSDO_GEOMETRYオブジェクト型インスタンスをGeoJSONオブジェクトに、また、GeoJSONオブジェクトをSDO_GEOMETRYインスタンスに変換できます。

269

Page 270: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Spatial and Graphでの操作を、GeoJSONオブジェクトから取得したSDO_GEOMETRYオブジェクトに対して使用できます。たとえば、PL/SQLパッケージSDO_GEOMで演算子sdo_distanceを使用して、2つのジオメトリ・オブジェクト間の最短距離を計算できます。これは、最も近い2つの地点または2つのセグメント間(各オブジェクトから1つの地点またはセグメントまで)の距離です。これを、例24-5に示します。

JSONデータ・ガイドでサポートされるGeoJSONデータJSONデータ・ガイドは、JSON文書セットに含まれる構造的情報と型情報を要約します。一部の文書にGeoJSONデータが含まれる場合、そのデータは、SQL集計ファンクションjson_dataguideを使用して作成するデータ・ガイドに要約されます。SQLファンクションjson_dataguideを使用してこのようなデータ・ガイドに基づくビューを作成し、フォーマット引数をDBMS_JSON.GEOJSONまたはDBMS_JSON.GEOJSON+DBMS_JSON.PRETTYとして指定する場合、文書セットのGeoJSONデータを投影する列のSQLデータ型はSDO_GEOMETRYになります。

関連項目:

GeoJSONデータとOracle Spatial and Graphを連携して使用する方法の詳細は、Oracle Spatialand Graph開発者ガイドを参照してください。

Oracle Spatial and GraphとSDO_GEOMETRYオブジェクト型の詳細は、Oracle Spatial andGraph開発者ガイドを参照してください。

GeoJSONの詳細は、GeoJSON.orgを参照してください

GeoJSONデータの詳細は、『The GeoJSON Format Specification』を参照してください

例24-1 GeoJSONデータを使用した表

この例では、GeoJSON文書の列geo_docを持つ、表j_geoを作成します。

ここでは、このような文書が1つだけ挿入されます。この文書には、typeFeatureCollectionのGeoJSONオブジェクトと、type Featureのオブジェクトのfeatures配列が1つずつ含まれます。これらのオブジェクトには、それぞれ、typePoint、LineStringおよびPolygonのgeometryがあります。

CREATE TABLE j_geo (id VARCHAR2 (32) NOT NULL,

geo_doc VARCHAR2 (4000) CHECK (geo_doc IS JSON));

INSERT INTO j_geo

コピー

270

Page 271: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

VALUES (1,

'{"type" : "FeatureCollection","features" : [{"type" : "Feature",

"geometry" : {"type" : "Point","coordinates" :

[-122.236111, 37.482778]},

"properties" : {"Name" : Redwood City"}},

{"type" : "Feature","geometry" : {"type" : "LineString",

"coordinates" : [[102.0,

0.0],

[103.0,

1.0],

[104.0,

0.0],

[105.0,

1.0]]},

"properties" : {"prop0" : "value0",

"prop1" : 0.0}},

{"type" : "Feature","geometry" : {"type" : "Polygon",

"coordinates" :

[[[100.0, 0.0],

[101.0, 0.0],

[101.0, 1.0],

[100.0, 1.0],

[100.0, 0.0]]]},

"properties" : {"prop0" : "value0",

"prop1" : {"this" :

"that"}}}]}');

例24-2 GeoJSON機能のgeometryオブジェクトのSDO_GEOMETRYインスタンスとしての選択

この例では、SQL/JSONファンクションjson_valueを使用して、配列featuresの最初の要素からフィールドgeometryの値を選択します。値は、JSONデータとしてではなくOracle Spatial and

271

Page 272: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

データとして、つまり、 文字列や インスタンスではなく オブジェクト型SDO_GEOMETRYとして戻されます。

SELECT json_value(geo_doc, '$.features[0].geometry'RETURNING SDO_GEOMETRY ERROR ON ERROR)

FROM j_geo;

戻される値は、次のようになります。これは、経度および緯度(座標)がそれぞれ122.236111と37.482778の地点を表します。

SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-122.236111, 37.482778, NULL), NULL, NULL)

関連項目:

SQL/JSONファンクションjson_valueの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例24-3 GeoJSON機能の複数のgeometryオブジェクトのSDO_GEOMETRYとしての取得

この例では、SQL/JSONファンクションjson_tableを使用して、配列featuresの各要素にあるフィールドgeometryの値を、仮想表の列sdo_valとして投影します。取得されたデータは、SDO_GEOMETRYとして戻されます。

SELECT jt.*

FROM j_geo,

json_table(geo_doc, '$.features[*]' COLUMNS (sdo_val SDO_GEOMETRY PATH '$.geometry')) jt;

関連項目:

Oracle Database SQL言語リファレンス(SQL/JSONファンクションjson_tableの詳細)

問合せに対して、次の3つの行が戻されます。1つ目の行は、例24-2と同じPointを表します。2つ

コピー

コピー

コピー

Graph SQL LOB PL/SQL

272

Page 273: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

目の行は、LineString配列を表します。3つ目はPolygonを表します。

SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-122.236111, 37.482778,

NULL), NULL, NULL)

SDO_GEOMETRY(2002, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(102, 0, 103, 1, 104, 0, 105, 1))

SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(100, 0, 101, 0, 101, 1, 100, 1, 100, 0))

属性SDO_ELEM_INFO_ARRAYの2つ目と3つ目の要素は、属性SDO_ORDINATE_ARRAYで提供される座標を解釈する方法を指定します。これらは、戻される最初の行が線ストリング(2)で直線セグメント(1)を持ち、2つ目の行がポリゴン(2003)で直線セグメント(1)を持つことを示します。

例24-4 スカラーGeoJSONデータの空間索引の作成

この例では、配列featuresの最初の要素のフィールドgeometryに対して、MDSYS.SPATIAL_INDEX型のjson_value関数ベースの索引を作成します。これにより、その値を取得するためのjson_valueを使用した問合せのパフォーマンスが向上します。

CREATE INDEX geo_first_feature_idx ON j_geo (json_value(geo_doc, '$.features[0].geometry' RETURNING SDO_GEOMETRY)) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

例24-5 GeoJSONジオメトリと空間演算子の使用

この例では、最初のfeatures要素のgeometryフィールドが特定の地点から100キロメートル以内にある文書(この表では1つだけ)を選択します。ここでは、目的の地点はリテラルに表されています(coordinatesが、カリフォルニア州サンフランシスコの経度と緯度)。この地点から各ジオメトリ・オブジェクトまでの距離が計算されます。

問合せは、計算された距離を基準にして、選択した文書の順番を決めます。距離計算に対する許容誤差のメートル数は、この問合せではリテラル引数の100として指定されています。

SELECT id,

コピー

コピー

コピー

273

Page 274: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_value(geo_doc, '$features[0].properties.Name') "Name", SDO_GEOM.sdo_distance( json_value(geo_doc, '$features[0].geometry') RETURNING

SDO_GEOMETRY, SDO_GEOMETRY(2001, 4326,

SDO_POINT_TYPE(-122.416667, 37.783333, NULL), NULL,

NULL),

100, -- Tolerance in meters

'unit=KM') "Distance in kilometers"

FROM j_geo

WHERE sdo_within_distance( json_value(geo_doc, '$.features[0].geometry' RETURNING

SDO_GEOMETRY), SDO_GEOMETRY(2001, 4326,

SDO_POINT_TYPE(-122.416667, 37.783333, NULL), NULL,

NULL),

'distance=100 unit=KM') = 'TRUE';

関連項目:

SQL/JSONファンクションjson_valueの詳細は、Oracle Database SQL言語リファレンスを参照してください。

問合せの結果、次の1行が戻されます。

ID Name Distance in kilometers

----- -------------- ----------------------

1 Redwood City 26.9443035

例24-6 GeoJSONデータに対するマテリアライズド・ビューの作成

CREATE OR REPLACE MATERIALIZED VIEW geo_doc_view BUILD IMMEDIATE

コピー

コピー

274

Page 275: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

REFRESH FAST ON STATEMENT WITH ROWID

AS SELECT g.rowid, jt.*

FROM j_geo g,

json_table(geo_doc, '$.features[*]' COLUMNS (sdo_val SDO_GEOMETRY PATH '$.geometry')) jt;

例24-7 GeoJSONデータに対するマテリアライズド・ビューの空間索引の作成

この例ではまず、いくつかの空間索引メタデータを移入することにより、空間索引の作成の準備を行います。それから、例24-6で作成されたマテリアライズド・ビューgeo_doc_viewのSDO_GEOMETRY列sdo_valに索引を作成します。ビュー名および列名を除き、索引メタデータを移入するためのコードは固定です。マテリアライズド・ビューの空間索引の作成が必要になるたびにそれを使用します。

-- Populate spatial-indexing metadata

INSERT INTO USER_SDO_GEOM_METADATA

VALUES ('GEO_DOC_VIEW', 'SDO_VAL', MDSYS.sdo_dim_array(

MDSYS.sdo_dim_element('Longitude', -180, 180, 0.05),

MDSYS.sdo_dim_element('Latitude', -90, 90, 0.05)),

7

4326);

-- Create spatial index on geometry column of materialized view

CREATE INDEX geo_all_features_idx ON geo_doc_view(sdo_val) INDEXTYPE IS MDSYS.SPATIAL_INDEX V2;

関連項目

JSON_TABLEを使用したJSONデータに対するビューの作成

JSONデータ・ガイドのフィールド

親トピック: GeoJSON地理データ

コピー

275

Page 277: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

第VIII部 JSON用のパフォーマンス・チューニング問合せのパフォーマンスを調整するために、JSONフィールドに対する複数の方法での索引付け、インメモリー列ストアへの(IM列ストア)フィールド値の格納またはマテリアライズド・ビューを使用した非JSONデータとしての公開を行えます。

JSON用のパフォーマンス・チューニングの概要どのパフォーマンス・チューニングのアプローチを取るかは、アプリケーションのニーズによって決まります。ここでは、いくつかのユースケースと推奨されるソリューションについて説明します。

JSONデータの索引JSONデータには、これを格納するために使用する任意のデータ型の場合と同じように索引を付けることができます。また、JSON検索索引を定義できます。これは、非定型の構造的問合せと全文問合せの両方に便利です。

インメモリーJSONデータの概要問合せのパフォーマンスを向上させるために、JSONデータの列をインメモリー列ストア(IM列ストア)に格納できます。

277

Page 279: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

25 JSON用のパフォーマンス・チューニングの概要どのパフォーマンス・チューニングのアプローチを取るかは、アプリケーションのニーズによって決まります。ここでは、いくつかのユースケースと推奨されるソリューションについて説明します。

このユースケースは、2つの種類に分けられます。JSONフィールドの値に基づいたデータに対する検索またはアクセスが、(1)目的の文書で最大で1回実行されるものと、(2)場合によって1回より多く実行されるものの2つです。

特定の文書で最大1回行われる、フィールドの値にアクセスする問合せこのような問合せのパフォーマンスは、非JSONデータの場合と同じ方法で調整できます。どのJSONフィールドで仮想列や索引を定義するか、インメモリー列ストア(IM列ストア)にJSONデータが格納された表を配置するか、フィールドの一部を投影するマテリアライズド・ビューを作成するか、といった選択は、非JSONの場合と類似しています。

しかし、JSONデータの場合には、このようなパフォーマンス・チューニングを少なくとも1つ適用することは、非JSONデータの場合よりも一般的により重要になります。このようなパフォーマンスの調整をせずにJSONフィールドにアクセスすることは、(非JSONの)列データにアクセスするよりも、通常より多くのコストがかかります。これは、目的のデータを特定するために、JSON文書を横断する必要があるためです。

JSONフィールドから仮想列を作成するか、JSONフィールドに索引付けを行います。

シンプルで高度に選択的な検索基準を使用した問合せを、単一のJSONフィールドに対して行う場合は、次のようにします。

フィールドに仮想列を定義します。

多くの場合、IM列ストアに表を配置するか、仮想列に索引を作成することで、パフォーマンスをさらに向上させることができます。

279

Page 280: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ファンクション を使用して、フィールドに関数ベースの索引を作成します。

問合せに複数のフィールドが関連する場合は、次のようにします。

各フィールドに仮想列を定義します。

多くの場合、IM列ストアに表を配置するか、仮想列にコンポジット索引を作成することで、パフォーマンスをさらに向上させることができます。SQL/JSONファンクションjson_valueを(フィールドごとに1回ずつ)複数回起動して、関数ベースのコンポジット索引を各フィールドに作成します。

特定の文書で複数回行われる可能性のある、フィールドの値にアクセスする問合せこれは、配列内に含まれるフィールドにアクセスする場合に特に当てはまります。

このような問合せのパフォーマンスを調整するために使用できる3つの方法があります。

JSONデータが格納された表を、IM列ストアに配置します。

JSON検索索引を使用します。

この方法では、JSON文書内のすべてのフィールドが、配列内に出現するフィールドも含めて、その値と一緒に索引付けされます。索引を使用すると、フィルタや全文演算子を含むパス式を使用した検索も含めて、任意のパスベースの検索を最適化できます。また、索引では、数値に対する範囲ベースの検索もサポートされます。SQL/JSONファンクションjson_tableを使用してJSONフィールド値から投影された非JSON列のマテリアライズド・ビューを使用します。

json_tableでNESTED PATH句を使用して、JSON配列の各メンバーから個別の行を生成できます。

マテリアライズド・ビューは、通常、JSONコンテンツ用のSQLベースのレポートおよび分析を最適化するために使用されます。

親トピック: JSON用のパフォーマンス・チューニング

このページは役に立ちましたか?

SQL/JSON json_value

280

Page 282: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

26 JSONデータの索引JSONデータには、これを格納するために使用する任意のデータ型の場合と同じように索引を付けることができます。また、JSON検索索引を定義できます。これは、非定型の構造的問合せと全文問合せの両方に便利です。

JSONデータの索引付けの概要JSONデータ専用のSQLデータ型はないため、通常の方法でJSONデータに索引を付けられます。さらに、通常と同じ方法で、JSON検索索引を使用して非定型の構造的問合せおよび全文問合せ用に索引付けを行えます。

JSONデータに対して関数ベースの索引が選択されるかどうかを確認する方法特定の問合せで特定の関数ベースの索引が選択されるかどうかを確認するには、問合せの実行計画内で索引名を検索します。

SQL/JSON条件JSON_EXISTSのビットマップ索引の作成json_existsで戻される値に対して、ビットマップ索引を作成できます。条件に対して想定される戻り値が2つ(trueおよびfalse)のみであるため、これはjson_existsでの使用に適した索引です。

JSON_VALUE関数ベースの索引の作成SQL/JSONファンクションjson_valueに対して関数ベースの索引を作成できます。これには標準の構文を使用(json_value)するか、単純なドット表記法構文を使用できます。これらいずれかの方法で作成された索引は、ドット表記法問合せとjson_value問合せのどちらとも一緒に使用できます。

JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用json_tableによって投影された列をWHERE句が参照し、この列を対象とする有効なSQL/JSONパスが索引付きパス式と一致する場合、json_tableが関連する問合せに対して、ERROR ON ERRORが設定されたjson_valueを使用して作成された索引を使用できます。

JSON_VALUE関数ベースの索引とJSON_EXISTS問合せの使用

282

Page 283: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ERROR ON ERRORが設定されたSQL/JSONファンクションjson_valueを使用して作成された索引は、SQL/JSON条件json_existsが関連する問合せに対して使用できます。ただし、問合せのパス式に含まれるフィルタ式に、パス式の比較またはこのような比較が複数個&&で区切られたものだけが含まれる場合に限られます。

JSON_VALUEの索引付けおよび問合せに関するデータ型の考慮事項デフォルトでは、SQL/JSONファンクションjson_valueはVARCHAR2値を戻します。json_valueを使用して関数ベースの索引を作成する場合、RETURNING句を使用して異なる戻りデータ型を指定しないかぎり、非VARCHAR2値を想定する問合せに対してこの索引は選択されません。

コンポジットBツリー索引を使用した複数のJSONフィールドの索引付けJSONオブジェクトの複数のフィールドに索引を付けるには、最初にこれらの仮想列を作成します。次に、仮想列に対してコンポジットBツリー索引を作成します。

JSON検索索引: 非定型の問合せおよび全文検索JSON検索索引は、一般的な索引です。この検索索引によって、(1)非定型の構造的問合せ、つまり、定期的には予測または使用されない可能性のある問合せと、(2)全文検索の両方のパフォーマンスを向上させることができます。これは、JSONデータでの使用に特化して設計されたOracle Text索引です。

親トピック: JSON用のパフォーマンス・チューニング

26.1 JSONデータの索引付けの概要JSONデータ専用のSQLデータ型はないため、通常の方法でJSONデータに索引を付けられます。さらに、通常と同じ方法で、JSON検索索引を使用して非定型の構造的問合せおよび全文問合せ用に索引付けを行えます。

JSONデータには、これを格納するために使用する任意のデータ型の場合と同じように索引を付けることができます。特に、SQL/JSONファンクションjson_valueにBツリー索引やビットマップ索引を、SQL/JSON条件is json、is not jsonおよびjson_existsにビットマップ索引を使用できます。

(より一般的には、想定される関数の数が小さい場合は常にビットマップ索引が適しています。たとえば、値がブールであるか少数の文字列値であると想定される場合、関数json_valueにビットマップ索引を使用できます。)

この場合も、このような関数ベースの索引付けは、特定の関数を対象とする問合せに適していますが、これは、SQL/JSONファンクションのコンテキストでは特定のSQL/JSONパス式を意味します。これは、非定型(つまり、任意)の問合せの場合はあまり役に立ちません。関数ベースの索引を定義するのは、特定のパス式を何度も問い合せることがわかっている場合にしてください。

283

Page 284: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

非定型方式で問い合せる場合は、JSON検索索引を定義してください。これは、一般的索引であり、特定のパス式の対象ではありません。これは、構造問合せ(特定の値を持つJSONフィールドを検索する場合など)や、SQL/JSON条件json_textcontainsを使用した全文問合せ(様々な文字列値間の特定の単語を検索する場合など)に適しています。

同じJSON列に対して関数ベースの索引とJSON検索索引を定義することもできます。

JSON検索索引は、JSONデータでの使用に特化して設計されたOracle Text (全文)索引です。

ノート: データベース文字セットとしてAL32UTF8を使用することをお薦めします。索引の作成または適用時に、文字セットの自動変換が行われる場合があります。このような変換では情報が失われる可能性があります。これは、問合せで戻されることが予測されるデータが、戻されない場合があることを意味します。JSONデータの文字セットおよび文字エンコーディングを参照してください。

関連項目

GeoJSON地理データの使用

JSON検索索引: 非定型の問合せおよび全文検索

親トピック: JSONデータの索引

26.2 JSONデータに対して関数ベースの索引が選択されるかどうかを確認する方法特定の問合せで特定の関数ベースの索引が選択されるかどうかを確認するには、問合せの実行計画内で索引名を検索します。

たとえば、例26-4で定義されている索引が指定された場合、例12-1のjson_value問合せの実行計画では索引po_num_id1を使用して索引スキャンが参照されます。

親トピック: JSONデータの索引

26.3 SQL/JSON条件JSON_EXISTSのビットマップ索引の作成json_existsで戻される値に対して、ビットマップ索引を作成できます。条件に対して想定される戻り値が2つ(trueおよびfalse)のみであるため、これはjson_existsでの使用に適した索引です。

これを、例26-1に示します。

例26-2では、json_valueによって戻される値のビットマップ索引を作成しています。データ内のフィールドCostCenterに対して想定される値が少ない場合、これは使用に適した索引です。

284

Page 285: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例26-1 JSON_EXISTSのビットマップ索引の作成

CREATE BITMAP INDEX has_zipcode_idx

ON j_purchaseorder (json_exists(po_document,

'$.ShippingInstructions.Address.zipCode'));

例26-2 JSON_VALUEのビットマップ索引の作成

CREATE BITMAP INDEX cost_ctr_idx

ON j_purchaseorder (json_value(po_document, '$.CostCenter'));

親トピック: JSONデータの索引

26.4 JSON_VALUE関数ベースの索引の作成SQL/JSONファンクションjson_valueに対して関数ベースの索引を作成できます。これには標準の構文を使用(json_value)するか、単純なドット表記法構文を使用できます。これらいずれかの方法で作成された索引は、ドット表記法問合せとjson_value問合せのどちらとも一緒に使用できます。

例26-4では、表j_purchaseorderの列po_document内にあるオブジェクトのフィールドPONumberに対するjson_valueの関数ベースの索引を作成しています。オブジェクトはパス式のコンテキスト項目として渡されます。

ここでERROR ON ERRORを使用することは、フィールドPONumberがないレコード、複数のPONumberフィールドを持つレコードまたは非数値の値を持つPONumberフィールドがあるレコードがデータに含まれる場合、索引の作成が失敗することを意味します。また、索引が存在する場合、このようなレコードを挿入しようとしても失敗します。

代替方法として、JSONデータに対する単純なドット表記法アクセスで説明されている簡単な構文を使用して索引を作成する方法があります。例26-3はこれを示しています。ここでは、ドット表記法の問合せで戻すことが可能な内容に応じてスカラー結果と非スカラー結果の両方に索引を付けています。

例26-4と例26-3の両方で作成された索引は、ドット表記法構文を使用する問合せとjson_valueを使用する問合せのいずれかに対して選択できます。

コピー

コピー

285

Page 286: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例26-3の索引が問合せjson_valueに対して選択される場合、正しいフィールド値をテストするために、索引の選択後にフィルタリングが適用されます。この索引には非スカラー値を格納でき、ドット表記法の問合せではこのような値を戻すことができますが、json_valueの問合せではできないため、このような値は索引選択後にフィルタで除外されます。

json_value式の対象のフィールドで欠落している可能性のあるデータの索引付けを許可する場合は、NULL ON EMPTY句をERROR ON ERROR句と一緒に使用します。例26-5に、これを示します。

次のいずれかの形式を使用してjson_valueに対して関数ベースの索引を作成することをお薦めします。

ドット表記法構文

索引が付けられる値は、可能な場合は常にJSON値を戻すドット表記法問合せの柔軟な動作に対応します。これには、非スカラーのJSON値(JSONオブジェクトおよび配列)が含まれる場合があります。これらは、json_valueの問合せに加えてドット表記法の問合せと照合できます。索引は、初期セットの一致結果を見つけ出すために使用され、これらの一致結果は問合せの詳細事項に応じてフィルタされます。たとえば、索引が付けられた値のうちJSONスカラーでないものはフィルタで除外されます。RETURNINGデータ型を指定し、ERROR ON ERROR(さらにオプションでNULL ON EMPTY)を使用するjson_value式。

索引が付けられる値は、指定したデータ型の(非nullの)スカラー値のみです。それでもなお、索引は、このようなスカラー結果が生成されるドット表記法問合せで使用できます。

このように、これらいずれかの方法で作成された索引は、ドット表記法問合せとjson_value問合せのどちらとも一緒に使用できます。

例26-3 JSONフィールドに対する関数ベースの索引の作成: ドット表記法

CREATE UNIQUE INDEX po_num_idx2 ON j_purchaseorder po

(po.po_document.PONumber);

例26-4 JSONフィールドに対する関数ベースの索引の作成: JSON_VALUE

CREATE UNIQUE INDEX po_num_idx1

ON j_purchaseorder (json_value(po_document, '$.PONumber' RETURNING NUMBER ERROR ON ERROR));

コピー

コピー

286

Page 287: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例26-5 JSON_VALUE関数ベースの索引に対するNULL ON EMPTYの指定

句NULL ON EMPTYが指定されているため、索引po_ref_idx1は、ReferenceフィールドがないJSON文書にも索引を付けることができます。

CREATE UNIQUE INDEX po_ref_idx1

ON j_purchaseorder (json_value(po_document, '$.Reference'

RETURNING VARCHAR2(200) ERROR ON

ERROR

NULL ON EMPTY));

関連項目

SQL/JSON問合せファンクションで使用される空白フィールド句

GeoJSON地理データの使用

親トピック: JSONデータの索引

26.5 JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用json_tableによって投影された列をWHERE句が参照し、この列を対象とする有効なSQL/JSONパスが索引付きパス式と一致する場合、json_tableが関連する問合せに対して、ERROR ONERRORが設定されたjson_valueを使用して作成された索引を使用できます。

この索引が索引付きパスに対する制約として機能することにより、JSONコレクション内の各項目に対して1つの(非nullの)スカラーのJSON値のみが確実に投影されるようになります。

したがって、例26-6の問合せでは、例26-4で作成された索引を使用しています。

ノート: json_value式またはドット表記法を使用して作成された関数ベースの索引を、問合せでWHERE句が出現するたびに取得できるのは、この発生がSQLの比較条件(>=など)で使用されている場合のみです。特に、これは、条件IS NULLまたはISNOT NULLで使用される存在としては選択されません。SQL比較条件の詳細は、Oracle Database SQL言語リファレンスを参照してください。

例26-6 JSON_VALUE関数ベースの索引とJSON_TABLE問合せの使用

SELECT jt.*

コピー

コピー

287

Page 288: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

FROM j_purchaseorder po,

json_table(po.po_document, '$'

COLUMNS po_number NUMBER(5) PATH '$.PONumber', reference VARCHAR2(30 CHAR) PATH '$.Reference',

requestor VARCHAR2(32 CHAR) PATH '$.Requestor',

userid VARCHAR2(10 CHAR) PATH '$.User',

costcenter VARCHAR2(16 CHAR) PATH '$.CostCenter')

jt

WHERE po_number = 1600;

親トピック: JSONデータの索引

26.6 JSON_VALUE関数ベースの索引とJSON_EXISTS問合せの使用ERROR ON ERRORが設定されたSQL/JSONファンクションjson_valueを使用して作成された索引は、SQL/JSON条件json_existsが関連する問合せに対して使用できます。ただし、問合せのパス式に含まれるフィルタ式に、パス式の比較またはこのような比較が複数個&&で区切られたものだけが含まれる場合に限られます。

問合せの比較のいずれかでjson_value関数ベースの索引が選択されるためには、その比較の型が、索引のSQL戻りデータ型と同じである必要があります。使用されるSQLデータ型は、double()、number()、timestamp()、date()およびstring()の項目メソッドで言及されたデータ型です(「SQL/JSONパス式の項目メソッド」を参照)。

たとえば、索引で数値が戻される場合は、比較の型も数値である必要があります。問合せのフィルタ式に、json_value索引と一致する複数の比較が含まれる場合は、これらの索引の1つがオプティマイザによって選択されます。

比較の型は、次のように決まります。

1. 2つの比較語(比較の両側)のSQLデータ型が異なる場合、比較の型は不明になり、索引は選択されません。両方の型が同じ場合は、その型が比較の型になります。

2. 1つの比較語のSQLデータ型が文字列(テキスト・リテラル)である場合、比較の型は、もう一方の比較語の型になります。

3. 1つの比較語が、項目メソッドによってSQLの一致型が強制される関数ステップを持つパス式の場合、その型も比較語の型になります。SQLの一致型を強制する項目メソッドは、double()、number()、timestamp()、date()およびstring()です。

4. 1つの比較語が、前述のような関数ステップを持たないパス式の場合、その型はSQL文字列(テキスト・リテラル)になります。

288

Page 289: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

例26-4では、フィールドPONumberのjson_valueに対するファンクションベースの索引を作成します。索引の戻り型は、NUMBERです。

例26-7、例26-8および例26-9のそれぞれの問合せでは、json_exists条件を評価するときにこの索引を使用できます。これらの各問合せで、絶対パス式$.PONumberに相対的な単純なパス式に関連する比較が使用されます。それぞれの場合の単純な相対パス式は、カレント・フィルタ項目(@)を対象としますが、例26-9の場合は、照合データをSQLデータ型NUMBERに変換(キャスト)します。

例26-7 リテラル数値と比較したフィールドを対象としたJSON_EXISTS問合せ

この問合せでは、次の理由から索引が利用されます。

1. 1つの比較語が、関数ステップを持たないパス式であるため、その型はSQL文字列(テキスト・リテラル)である。

2. 1つの比較語が文字列型であるため、比較の型はもう一方の語の型になり、その型が数値である(もう一方の語は数字)。

3. (唯一の)比較の型が、索引で戻される型(数値)と同じである。

SELECT count(*) FROM j_purchaseorder

WHERE json_exists(po_document, '$.PONumber?(@ > 1500)');

例26-8 変数値と比較したフィールドを対象としたJSON_EXISTS問合せ

この問合せでは、次の理由から索引を利用できます。

1. 1つの比較語が、関数ステップを持たないパス式であるため、その型はSQL文字列(テキスト・リテラル)である。

2. 1つの比較語が文字列型であるため、比較はもう一方の語の型を持つことになり、この型が数値である(もう一方の語は、数値にバインドされた変数)。

3. (唯一の)比較の型が、索引で戻される型(数値)と同じである。

SELECT count(*) FROM j_purchaseorder

WHERE json_exists(po_document, '$.PONumber?(@ > $d)' PASSING 1500 AS "d");

例26-9 変数値と比較して数値にキャストされるフィールドを対象としたJSON_EXISTS問合せ

コピー

コピー

289

Page 290: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

この問合せでは、次の理由から索引を利用できます。

1. 1つの比較語が、項目メソッド(number())によって照合データが数値に変換される関数ステップを持つパス式であるため、比較語の型はSQL数値である。

2. もう一方の比較語が、SQL型数値を持つ数値である。比較語の型が一致しているため、比較も同じ型である数値になる。

3. (唯一の)比較の型が、索引で戻される型(数値)と同じである。

SELECT count(*) FROM j_purchaseorder

WHERE json_exists(po_document, '$.PONumber?(@.number() > $d)' PASSING 1500 AS "d");

例26-10 フィールド比較の論理積を対象としたJSON_EXISTS問合せ

例26-7と同様に、この問合せではフィールドPONumberの索引を利用できます。json_value索引がフィールドReferenceに対しても定義されている場合、オプティマイザがこの問合せに対してどちらの索引を使用するかを選択します。

SELECT count(*) FROM j_purchaseorder

WHERE json_exists(po_document, '$?(@.PONumber > 1500

&& @.Reference == "ABULL-20140421")');

関連項目

JSON_VALUE関数ベースの索引の作成

SQL/JSONパス式

親トピック: JSONデータの索引

26.7 JSON_VALUEの索引付けおよび問合せに関するデータ型の考慮事項デフォルトでは、SQL/JSONファンクションjson_valueはVARCHAR2値を戻します。json_valueを使用して関数ベースの索引を作成する場合、RETURNING句を使用して異なる戻りデータ型を指定しないかぎり、非VARCHAR2値を想定する問合せに対してこの索引は選択されません。

コピー

コピー

290

Page 291: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

たとえば、例26-11の問合せの場合、json_valueでRETURNING NUMBERが使用されています。この問合せには例26-4で作成された索引を選択できますが、これは、索引が付けられたjson_value式で戻り型としてNUMBERが指定されているためです。

ただし、例26-3で作成された索引にはRETURNING NUMBER (デフォルトでは、戻り型はVARCHAR2(4000)です)が使用されていないため、このような問合せに対して選択することはできません。

ここで、戻される値の型がVARCHAR2になるようにRETURNING句なしでjson_valueを使用している例26-12と例26-13の問合せについて検討してみます。

例26-12では、SQL関数to_numberにより、json_valueによって戻されるVARCHAR2値を数値に明示的に変換しています。同様に、例26-13では、比較条件> (より大きい)により、値を数値に暗黙的に変換しています。

例26-4と例26-3の索引のいずれも、これらの問合せに対して選択されません。これらの問合せでは、いずれの事例でも型キャストのために正しい結果が戻される可能性がありますが、これらの索引を使用してこれらの問合せを評価することはできません。

また、一部のデータを特定のデータ型に変換できない場合に何が起きるかについても検討してください。たとえば、例26-11、例26-12および例26-13の問合せが実行された場合、"alpha"などのPONumber値はどうなるでしょうか。

例26-12および例26-13の場合、値を数値にキャストしようとするために問合せはエラーで停止します。ただし、例26-11の場合、デフォルトのエラー処理動作がNULL ON ERRORであるため、非数値"alpha"は単純にフィルタで除外されます。値には索引が付けられますが、問合せに対しては無視されます。

同様に、たとえばDEFAULT '1000' ON ERRORが問合せで使用されたとすると、つまり、数値のデフォルト値が指定されたとすると、値"alpha"に対してエラーは発生しません。この場合、デフォルト値の1000が使用されます。

例26-11 JSON_VALUE問合せと明示的なRETURNING NUMBER

SELECT count(*) FROM j_purchaseorder po

WHERE json_value(po_document, '$.PONumber' RETURNING NUMBER) > 1500;

例26-12 JSON_VALUE問合せと明示的な数値変換

コピー

291

Page 292: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SELECT count(*) FROM j_purchaseorder po

WHERE to_number(json_value(po_document, '$.PONumber')) > 1500;

例26-13 JSON_VALUE問合せと暗黙的な数値変換

SELECT count(*) FROM j_purchaseorder po

WHERE json_value(po_document, '$.PONumber') > 1500;

親トピック: JSONデータの索引

26.8 コンポジットBツリー索引を使用した複数のJSONフィールドの索引付けJSONオブジェクトの複数のフィールドに索引を付けるには、最初にこれらの仮想列を作成します。次に、仮想列に対してコンポジットBツリー索引を作成します。

例26-14および例26-15に、これを示します。例26-14では、JSONオブジェクト・フィールドUserおよびCostCenterそれぞれに対して仮想列useridおよびcostcenterを作成しています。

例26-15では、例26-14の仮想列に対してコンポジットBツリー索引を作成しています。

仮想列または対応するJSONデータ(オブジェクト・フィールド)を参照するSQL問合せでは、コンポジット索引が選択されます。このことは、例26-16の両方の問合せに当てはまります。

これら2つの問合せの効果は同一であり、パフォーマンスも同一です。ただし、最初の問合せ形式はJSONデータ自体を対象としておらず、このデータに索引を付けるために使用される仮想列を対象としています。

問合せのパフォーマンスを向上させるために実装された索引にデータが論理的に依存することはありません。実装からのこのような独立性がコードに反映されるようにするには、2番目の問合せ形式を使用してください。このようにすることにより、問合せは索引の有無とは関係なく同じ機能を果たすようになります。この場合、索引はパフォーマンスの向上に特化して機能します。

例26-14 JSONオブジェクト・フィールドの仮想列の作成

ALTER TABLE j_purchaseorder ADD (userid VARCHAR2(20) GENERATED ALWAYS AS (json_value(po_document, '$.User' RETURNING VARCHAR2(20))));

ALTER TABLE j_purchaseorder ADD (costcenter VARCHAR2(6)

コピー

コピー

コピー

292

Page 293: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

GENERATED ALWAYS AS (json_value(po_document, '$.CostCenter' RETURNING VARCHAR2(6))));

例26-15 JSONオブジェクト・フィールドのコンポジットBツリー索引の作成

CREATE INDEX user_cost_ctr_idx on j_purchaseorder(userid, costcenter);

例26-16 コンポジット索引を使用して索引が付けられたJSONデータを問い合せる2通りの方法

SELECT po_document FROM j_purchaseorder WHERE userid = 'ABULL' AND costcenter = 'A50';

SELECT po_document

FROM j_purchaseorder WHERE json_value(po_document, '$.User') = 'ABULL'

AND json_value(po_document, '$.CostCenter') = 'A50';

親トピック: JSONデータの索引

26.9 JSON検索索引: 非定型の問合せおよび全文検索JSON検索索引は、一般的な索引です。この検索索引によって、(1)非定型の構造的問合せ、つまり、定期的には予測または使用されない可能性のある問合せと、(2)全文検索の両方のパフォーマンスを向上させることができます。これは、JSONデータでの使用に特化して設計されたOracleText索引です。

ノート: Oracle Database 12cリリース1 (12.1.0.2)を使用してJSON検索索引を作成した場合は、その索引を削除し、以降のリリースで使用するために、ここで説明するCREATESEARCH INDEXを使用して検索索引を新しく作成することをお薦めします。

JSON検索索引の概要

CREATE SEARCH INDEXにキーワードFOR JSONを指定して、JSON検索索引を作成しま

コピー

コピー

293

Page 294: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

す。例26-17に、これを示します。

問合せの実行計画内にJSON検索索引の名前が存在する場合、索引が実際に問合せに対して選択されたことがわかります。例26-18に示すものと似た行が表示されます。

特定の構成可能なオプションのデフォルト設定をオーバーライドする場合は、PARAMETERS句を指定できます。デフォルト(PARAMETERS句なし)では、索引はコミット時に同期化され、テキストと数値の範囲の両方が索引付けされます。

JSON検索索引は、要求に応じて非同期にメンテナンスされます。したがって、索引メンテナンスのコストを遅延し、コミット時のみまたはデータベースの負荷が軽減されている特定の時期に実行できます。これにより、DMLのパフォーマンスを向上させることができます。また、索引の同期化を行う際に、非同期索引行のバルク・ロードを有効にすると、索引メンテナンスのパフォーマンスを向上させることができます。一方、索引の非同期メンテナンスとは、索引が同期化されるまでは、変更されたか新しく挿入されたデータに索引が使用されないことを意味します。

JSON検索索引を利用する問合せで数値の範囲が使用されない場合は、パラメータSEARCH_ONにTEXTを指定すると、メンテナンスの時間とディスク領域をいくらか節約できます。SEARCH_ONのデフォルト値はTEXT_VALUEです。これは、テキストと同様に索引の数値の範囲も意味します。

ノート: JSON検索索引j_s_idxを変更するには、ALTER INDEX j_s_idx REBUILD...(ALTER SEARCH INDEX j_s_idx ...ではない)を使用します。

例26-17 JSON検索索引の作成

CREATE SEARCH INDEX po_search_idx ON j_purchaseorder (po_document) FOR JSON;

例26-18 JSON検索索引が使用されていることを示す実行計画

|* 2| DOMAIN INDEX | PO_SEARCH_IDX | | | 4 (0)

JSONデータの全文検索

SELECT文のCASE式またはWHERE句でSQL/JSON条件json_textcontainsを使用して、VARCHAR2、BLOBまたはCLOB列に格納されているJSONデータの全文検索を実行できます。

コピー

コピー

294

Page 295: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Oracle Textテクノロジは、SQL条件json_textcontainsに基づいています。たとえば、これは、他のテキスト付近にあるテキストを問い合せたり、問合せであいまいパターン一致を使用できるということです。

条件json_textcontainsを使用するためには、まず、JSON検索索引を作成する必要があります。そうしない場合、json_textcontainsを使用するとエラーが発生します。

例26-19は、明細項目の部品の説明にキーワードMagicが含まれる発注書を検索する全文問合せを示しています。

ノート: 強力な全文検索の場合は、Oracle SQLファンクションjson_textcontainsを使用します。この場合、JSON検索索引を作成する必要があります。あまり強力ではない代替方法として、JSON検索索引を作成せず、フィルタ条件に単純な文字列パターン一致のみが必要な場合は、パターン一致比較のいずれかを使用できます(hassubstring、starts with、like、like_regexまたはeq_regex)。

例26-19 JSONデータの全文問合せ

SELECT po_document FROM j_purchaseorder

WHERE json_textcontains(po_document, '$.LineItems.Part.Description', 'Magic');

例26-20 検索パターンをエスケープした、JSONデータの全文問合せ

条件json_textcontainsの3つ目の引数に、Oracle Textの検索で予約されている文字または単語が含まれる場合は、その文字または単語をエスケープする必要があります。

ここに示す問合せでは、部品の説明にMagicとChristmasの両方が含まれる文書を検索します。これらの例では、Oracle Textの検索では予約されている、Oracle Textの問合せ演算子&とandが使用されています。

最初の問合せでは、単一の文字&をバックスラッシュ(\)を使用してエスケープしています。2つ目の問合せでは、予約語のandが含まれているため、検索パターン全体を中カッコ({、})を使用してエスケープしています。(演算子andに含まれる文字だけをエスケープするために、{and}を使用することも考えられます)。

SELECT po_document FROM j_purchaseorder

WHERE json_textcontains(po_document,

'$.LineItems.Part.Description', 'Magic \& Christmas');

コピー

コピー

295

Page 296: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SELECT po_document FROM j_purchaseorder

WHERE json_textcontains(po_document,

'$.LineItems.Part.Description', '{Magic and Christmas}');

JSONデータの非定型問合せ

例26-21は、例26-17で作成したJSON検索索引も使用するJSONデータの非全文問合せを示しています。

例26-21 いくつかの非定型JSON問合せ

この問合せでは、船積み依頼書の住所に国が含まれる文書を選択します。

SELECT po_document FROM j_purchaseorder

WHERE json_exists(po_document,

'$.ShippingInstructions.Address.country');

この問合せでは、ユーザーAKHOOが含まれる文書で、注文された項目が8個より多いものを選択します。ここでは、数値範囲の索引付けが利用されます。

SELECT po_document FROM j_purchaseorder

WHERE json_exists(po_document, '$?(@.User == "AKHOO"

&& @.LineItems.Quantity > 8)');

この問合せでは、ユーザーがAKHOOの文書が選択されます。ここでは、WHERE句で、json_existsのかわりにjson_valueが使用されます。

SELECT po_document FROM j_purchaseorder

WHERE json_value(po_document, '$.User') = 'ABULL';

関連項目

コピー

コピー

コピー

コピー

296

Page 297: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONデータの索引

JSONデータ・ガイド

関連項目:

条件json_textcontainsの詳細は、Oracle Database SQL言語リファレンスを参照してください。CREATE SEARCH INDEXのPARAMETERS句の詳細は、Oracle Textリファレンスを参照してください。ALTER INDEX ... REBUILDのPARAMETERS句の詳細は、Oracle Textリファレンスを参照してください。JSON検索索引の同期化の詳細は、Oracle Textリファレンスを参照してください。

JSON検索索引のパフォーマンスの最適化および調整の詳細は、Oracle Textアプリケーション開発者ガイドを参照してください。

Oracle Text検索で予約されている単語および文字の詳細は、Oracle Textリファレンスを参照してください。また、それらのエスケープ方法は、Oracle Textリファレンスを参照してください。

親トピック: JSONデータの索引

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

297

Page 298: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

27 インメモリーJSONデータ問合せのパフォーマンスを向上させるために、JSONデータの列をインメモリー列ストア(IM列ストア)に格納できます。

関連項目:

『Oracle Database In-Memoryガイド』

インメモリーJSONデータの概要JSONデータの列が格納された表をインメモリー列ストア(IM列ストア)に移動すると、コストがかかる式の結果をキャッシュすることで、これらの式を共有する問合せのパフォーマンスを向上させることができます。これは、小さいJSON文書を大量にスキャンする分析問合せに特に便利です。

JSONデータのインメモリー列ストアへの移入ALTER TABLE INMEMORYを使用して、JSONデータの列が格納された表をインメモリー列ストア(IM列ストア)に移入すると、コストがかかる式の評価結果をキャッシュすることで、これらの式を共有する問合せのパフォーマンスを向上させることができます。

インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレード12.2以降の互換性設定のないデータベースか、max_string_size = extendedが設定されなかったデータベースを使用して作成されたJSON列が含まれる表は、インメモリー列ストア(IM列ストア)に移入する前にアップグレードする必要があります。これを行うには、スクリプトrdbms/admin/utlimcjson.sqlを実行します。

親トピック: JSON用のパフォーマンス・チューニング

27.1 インメモリーJSONデータの概要JSONデータの列が格納された表をインメモリー列ストア(IM列ストア)に移動すると、コストがかかる式の結果をキャッシュすることで、これらの式を共有する問合せのパフォーマンスを向上させることができます。これは、小さいJSON文書を大量にスキャンする分析問合せに特に便利です。

298

Page 299: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

IM列ストアは、32,767バイトより小さいJSON文書に対してのみサポートされます。様々な文書サイズが混在する場合、32,767バイトより大きい文書はインメモリーの最適化が行われずに処理されます。よりよいパフォーマンスを得るために、32,767バイトを超える文書を小さい文書に分割することを検討します。

IM列ストアは任意に入力できるSGAプールです。ここには、迅速にスキャンできるように最適化された特殊な列形式で、表のコピーおよびパーティションが格納されています。IM列ストアはデータベース・バッファ・キャッシュの行ベース記憶域を補完します。IM列ストアとバッファ・キャッシュの両方に同じオブジェクトをロードする必要はありません。2つのキャッシュは、トランザクションの面で一定に保たれます。データベースは、バッファ・キャッシュにオンライン・トランザクション処理(OLTP)問合せ(主キーの検索など)を、IM列ストアに分析およびレポートの問合せを透過的に送信します。

インメモリーのJSONデータを使用することは、SQL/JSONパス・アクセスのパフォーマンス強化と考えられます。SQL/JSONファンクションjson_table、json_queryおよびjson_valueと、SQL条件json_existsは、すべてSQL/JSONパス引数を受け入れ、JSONデータをIM列ストアにロードすることでメリットを得ることができます。(SQL/JSONファンクションjson_textcontainsを使用した全文検索では、IM列ストアを使用するメリットはありません。)JSON文書がメモリーにロードされると、この文書に対して以降に行われるパスベースの操作ではインメモリーの表現が使用されます。これにより、ディスク上で行われる読取りおよび解析に関連するオーバーヘッドが不要になります。

問い合せされたJSONデータがIM列ストアに移入され、そのデータに適用できる関数ベースの索引がある場合、オプティマイザは索引を使用するか、インメモリーのデータをスキャンするかを選択します。一般的に、索引を調べた結果の文書がほとんどない場合には、オプティマイザによって関数索引が選ばれます。これは、実際には、オプティマイザが非常に選択的な問合せやDML文で関数索引を選ぶ可能性があることを意味します。

反対に、索引を調べた結果の文書が多くなる場合、オプティマイザは、関数ベースの索引の式を仮想列の式としてスキャンすることによるインメモリー・データのスキャンを選択する可能性があります。

非定型の問合せ(つまり、特定のSQL/JSONパス式を対象とするために頻繁には使用されない問合せ)では、データのスキャンを迅速に行えるため、JSONデータをIM列ストアに移入することで得られる一般的なメリットを受けられます。頻繁に使用する問合せがいくつかある場合は、次のようにしてそれらのパフォーマンスをさらに向上させることができます。

JSONデータの列から、スカラー値(配列内のものではない)を投影する仮想列を作成し、それらの仮想列をIM列ストアにロードする。頻繁に問い合せられるjson_table式にマテリアライズド・ビューを作成し、そのビューをIM列ストアにロードする。

ただし、関数json_valueを使用してスカラー値を投影する関数ベースの索引がある場合は、そ

299

Page 300: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

れを投影する仮想列を明示的に作成する必要はありません。前述したように、この場合は、関数ベースの索引の式がIM列ストアに仮想列として自動的にロードされます。オプティマイザは、推定されるコストに基づいて、関数ベースの索引を通常の方法でスキャンするか、索引式を仮想列の式としてスキャンするかを選択できます。

ノート:

マテリアライズド・ビューではなく、仮想列を利用する利点は、索引を構築できることと、オプティマイザ用に統計情報を取得できることです。仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

JSONデータをインメモリーで使用するための前提条件

JSONデータでIM列ストアのメリットを利用するためには、次のすべての項目を満たす必要があります。

データベースの互換性が12.2.0.0以上である。

Oracleインスタンスのスタートアップ構成ファイルで、max_string_sizeの値が'extended'に設定されている必要がある。

IM列ストアに対して、十分なSGAメモリーが構成されている必要がある。

JSON列を格納する表領域、表またはマテリアライズド・ビューが、CREATEまたはALTERの文でキーワードINMEMORYを使用してIM列ストアに移入できるように、DBAで指定されている。次のように初期化パラメータが設定されている。

IMMEMORY_EXPRESSIONS_USAGEが、STATIC_ONLYまたはENABLEになっている。

ENABLEをPL/SQLプロシージャDBMS_INMEMORY.ime_capture_expressionsと組み合せて使用すると、動的な式のインメモリー・マテリアライズが可能になります。IMMEMORY_VIRTUAL_COLUMNSがENABLEになっている。これは、IM列ストアがすべての仮想列を移入することを意味します。(デフォルト値はMANUAL。)

JSONデータを格納する列それぞれに、is jsonチェック制約が含まれる必要がある。(つまり、データがJSONデータであることがわかっている必要がある。)

各初期化パラメータの値は、SHOW PARAMETERコマンドを使用して確認できます。(データベース・ユーザーSYSまたはそれと同等のユーザーとしてログインしている必要があります。)次に例を示します。

SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS コピー

300

Page 301: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目

JSONデータのインメモリー列ストアへの移入

親トピック: インメモリーJSONデータ

27.2 JSONデータのインメモリー列ストアへの移入ALTER TABLE INMEMORYを使用して、JSONデータの列が格納された表をインメモリー列ストア(IM列ストア)に移入すると、コストがかかる式の評価結果をキャッシュすることで、これらの式を共有する問合せのパフォーマンスを向上させることができます。

IM列ストアは任意に入力できるSGAプールです。ここには、迅速にスキャンできるように最適化された特殊な列形式で、表のコピーおよびパーティションが格納されています。IM列ストアはデータベース・バッファ・キャッシュの行ベース記憶域を補完します。(バッファ・キャッシュは置き換えられませんが、IM列ストアとバッファ・キャッシュの両方に同じオブジェクトをロードする必要はありません。2つのキャッシュは、トランザクションの面で一定に保たれます。)

特定のJSON列(つまり、is jsonチェック制約が含まれる列)が格納された表をINMEMORYとして設定することで、その表がIM列ストアに移入されるように指定します。例27-1に、これを示します。

IM列ストアは、32,767バイトより小さい文書の問合せに使用されます。これより大きな文書の問合せでは、IM列ストアを利用するメリットがありません。

ノート: IM列ストアに移入する表のJSON列が、12.2以降の互換性設定がないデータベースを使用して作成された場合、またはmax_string_sizeがextendedに設定されていなかった場合(Oracle Database 12c リリース2 (12.2.0.1)より前の場合などに該当)は、まず、スクリプトrdbms/admin/utlimcjson.sqlを実行する必要があります。これは、JSON列が含まれる既存の表すべてで、リリース12.2.0.1で追加されたインメモリーのJSON処理を利用できるように準備します。インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレードを参照してください。

JSON列が含まれる表をINMEMORYにすると、各JSON列についてインメモリーの仮想列がその表に追加されます。対応する仮想列は、特定のJSON列の問合せに使用されます。仮想列には、対応するJSON列と同じJSONデータが含まれますが、その形式はOracleのバイナリ形式OSONになります。

例27-1 JSONデータのIM列ストアへの移入

SELECT COUNT(1) FROM j_purchaseorder コピー

301

Page 302: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

WHERE json_exists(po_document,

'$.ShippingInstructions?(@.Address.zipCode ==

99236)');

-- The execution plan shows: TABLE ACCESS FULL

-- Specify table as INMEMORY, with default PRIORITY setting of NONE,

-- so it is populated only when a full scan is triggered.

ALTER TABLE j_purchaseorder INMEMORY;

-- Query the table again, to populate it into the IM column store.

SELECT COUNT(1) FROM j_purchaseorder

WHERE json_exists(po_document,

'$.ShippingInstructions?(@.Address.zipCode ==

99236)');

-- The execution plan for the query now shows: TABLE ACCESS INMEMORY FULL

関連項目:

『Oracle Database In-Memoryガイド』

親トピック: インメモリーJSONデータ

27.3 インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレード12.2以降の互換性設定のないデータベースか、max_string_size = extendedが設定されなかったデータベースを使用して作成されたJSON列が含まれる表は、インメモリー列ストア(IM列ストア)に移入する前にアップグレードする必要があります。これを行うには、スクリプトrdbms/admin/utlimcjson.sqlを実行します。

スクリプトrdbms/admin/utlimcjson.sqlを実行すると、JSON列が含まれるすべての既存の表が、IM列ストアに移入できるようにアップグレードされます。これを使用するには、次の項目のすべてを満たす必要があります。

データベース・パラメータcompatibleを12.2.0.0以上に設定する必要がある。

302

Page 303: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

データベース・パラメータmax_string_sizeがextendedに設定されている必要がある。

アップグレードするJSON列に、is jsonチェック制約が定義されている必要がある。

関連項目

インメモリーJSONデータの概要

親トピック: インメモリーJSONデータ

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

303

Page 304: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

A Oracle DatabaseのJSONに関する制限事項ここでは、Oracle Database内のJSONデータに対するOracleのサポートに関連する制限事項について説明します。

異なる指定がないかぎり、指定された制限事項が順守されない場合には、エラーが発生します。

全般

JSONオブジェクトまたは配列のネスト・レベルの数: 1000(最大)

JSONフィールド名の長さ: 32767バイト(最大)

SQL/JSONファンクション

戻り値の長さ: 32767バイト(最大)

パスの長さ: 4Kバイト(最大)

パス・ステップ数: 65535(最大)

簡略化されたJSON構文

パスの長さ: 4Kバイト(最大)

パス・コンポーネントの長さ: 128バイト(最大)

JSON検索索引

フィールド名の長さ: 255バイト(最大)文書に255バイトよりも長いフィールド名が含まれている場合、完全に索引付けされない可能性があります。その場合、エラーがデータベース・ビューCTX_USER_INDEX_ERRORSに記録されます。

ノート: 名前が64バイトを超えるオブジェクト・フィールドが含まれるJSONデータを索引付けする場合、Oracle Database 18cより前に作成された任意のJSON検索索引およびOracle Text索引を再構築する必要があります。詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。

304

Page 305: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

関連項目:

『Oracle Textリファレンス』

JSONデータ・ガイド

パスの長さ: 4000バイト(最大)4000バイトよりも長いパスは、データ・ガイドで無視されます。親ノードにある子の数: 1024(最大)子が1024を超えるノードは、データ・ガイドで無視されます。

フィールド値の長さ: 32767バイト32767バイトよりも長い値がJSONフィールドに含まれる場合、データ・ガイドはその長さを32767として報告します。長さが0(ゼロ)のフィールド名: 長さが0(空)のオブジェクトのフィールド名("")は、JSONデータ・ガイドではサポートされません。このような名前が含まれるJSONデータに対しては、データ・ガイドの動作は定義されていません。

OSON

すべてのフィールド名の合計サイズ: 65535バイト(最大)。

(各)フィールド名の長さ: 255バイト(最大)。

重複フィールドの不使用: フィールド名が重複したJSONオブジェクトがOSONを使用して表されている場合、これらのフィールドの1つだけが残されます。

PL/SQL getterメソッドJSON_OBJECT_T.get_keys()は、指定されたJSONオブジェクトに対し、最大32767のフィールド名を返します。32767を超えるフィールドを持つオブジェクトが指定されると、エラーが発生します。

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

305

Page 306: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

B 基本的なSQL/JSONパス式の構文の図基本的なSQL/JSONパス式の構文について、構文図と対応するバッカス・ナウア記法(BNF)の構文説明を示します。

SQL/JSONパス式の基本的な構文は、「基本的なSQL/JSONパス式の構文」で説明されています。このトピックでは、構文図およびBNF説明の形式で情報を要約します。

図B-1 json_basic_path_expression

「図B-1 json_basic_path_expression」の説明

図B-2 json_absolute_path_expression

「図B-2 json_absolute_path_expression」の説明

図B-3 json_nonfunction_steps

「図B-3 json_nonfunction_steps」の説明

図B-4 json_object_step

306

Page 307: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

「図B-4 json_object_step」の説明

図B-5 json_field_name

「図B-5 json_field_name」の説明

図B-6 json_array_step

「図B-6 json_array_step」の説明

ノート:

配列索引付けは、0(ゼロ)を基準として行われます。そのため、integerはマイナスの整数ではありません(0, 1, 2, 3,...)。範囲(integer to integer)の最初のintegerは、2つ目より小さくする必要があります。配列要素の指定には、昇順で重複のない索引を使用する必要があります。

これらの構文ルールのいずれかが違反されると、コンパイル時エラーが発生します。

図B-7 json_function_step

「図B-7 json_function_step」の説明

図B-8 json_item_method

307

Page 308: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

「図B-8 json_item_method」の説明

図B-9 json_filter_expr

「図B-9 json_filter_expr」の説明

図B-10 json_cond

308

Page 309: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

「図B-10 json_cond」の説明

図B-11 json_conjunction

「図B-11 json_conjunction」の説明

図B-12 json_comparison

「図B-12 json_comparison」の説明

図B-13 json_relative_path-expr

「図B-13 json_relative_path-expr」の説明

図B-14 json_compare_pred

「図B-14 json_compare_pred」の説明

図B-15 json_var

「図B-15 json_var」の説明

図B-16 json_scalar

309

Page 310: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

「図B-16 json_scalar」の説明

ノート: json_numberは、JSONの数値です。10進数の数値で、符号が付いている場合や10進数指数が含まれる場合があります。

関連項目:

Oracleの構文図の詳細は、Oracle Database SQL言語リファレンスを参照してください

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

310

Page 311: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

Release 19

JSON開発者ガイド

索引記号 A B C D E F G H I J K L M N O P Q R S T U V W X

記号!=比較フィルタ述語, SQL/JSONパス式 13.2.1

!フィルタ述語, SQL/JSONパス式 13.2.1

$, SQL/JSONパス式SQL/JSON変数用 13.2.1

コンテキスト項目用 13.2.1

&&フィルタ述語, SQL/JSONパス式 13.2.1

<=比較フィルタ述語, SQL/JSONパス式 13.2.1

<>比較フィルタ述語, SQL/JSONパス式 13.2.1

<比較フィルタ述語, SQL/JSONパス式 13.2.1

==比較フィルタ述語, SQL/JSONパス式 13.2.1

>=比較フィルタ述語, SQL/JSONパス式 13.2.1

>比較フィルタ述語, SQL/JSONパス式 13.2.1

||フィルタ述語, SQL/JSONパス式 13.2.1

Aabs()項目メソッド, SQL/JSONパス式 13.3

ABSENT ON NULL, SQL/JSON生成関数 21.1

絶対パス式 13.2.1

311

Page 312: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

構文 B

add_vcトリガー・プロシージャ 20.9

add_virtual_columns, DBMS_JSON PL/SQLプロシージャ 20.8, 20.8.1, 20.8.2

JSONフィールドの仮想列の追加 20.8

データ・ガイド対応検索索引に基づく 20.8.2

階層データ・ガイドに基づく 20.8.1

JSONデータの非定型検索 26.9

ALL_JSON_COLUMNSビュー 4.1

ALL_JSON_DATAGUIDE_FIELDSビュー 20.5

ALL_JSON_DATAGUIDESビュー 20.5

配列, JSON 2.2

配列要素, JSON 2.2

配列索引 13.2.1

配列範囲指定 13.2.1

配列ステップ, SQL/JSONパス式 13.2.1

構文 B

ASCIIキーワード, SQLファンクション 14.1

B基本的なSQL/JSONパス式 13.2.1

BNF説明 B

図 B

BLOB記憶域, JSONデータに使用 3

BNF構文説明, 基本的なSQL/JSONパス式B

boolean()項目メソッド, SQL/JSONパス式 13.3

booleanOnly()項目メソッド, SQL/JSONパス式 13.3

CJSONの数値の正準な形式 14.1

312

Page 313: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

大/小文字区別データ・ガイド・フィールド:preferred_column_name 20.4

問合せのドット表記法 12

SQL/JSONパス式 13.2, 13.2.1

JSONおよびSQL

厳密なJSON構文と緩慢なJSON構文 5.2

ceiling()項目メソッド, SQL/JSONパス式 13.3

変更トリガー, データ・ガイド 20.9

ユーザー定義 20.9.1

文字セット 6

確実に整形式のJSONデータにするために使用されるチェック制約 4

子COLUMNS句, json_table SQL/JSONファンクション 18.2

クライアント, JSONデータの取得に使用 3

CLOB記憶域, JSONデータに使用 3

COLUMNS句, json_table SQL/JSONファンクション 18.2

JSONデータの列 1.1

compare述語, SQL/JSONパス式構文 B

比較, SQL/JSONパス式構文 B

比較フィルタ述語, SQL/JSONパス式 13.2.1

SQL/JSONパス式での比較, 型 13.5

データ型の互換性, 項目メソッド 13.3

条件, SQL/JSONパス式構文 B

条件, Oracle SQL

json_equal IV

条件, SQL/JSON

is json 5

およびJSON null 2.2

313

Page 314: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

is not json 5

およびJSON null 2.2

json_exists 15

索引付け 26.3

json_textcontains 26.9

論理積, SQL/JSONパス式構文 B

コンテキスト項目, SQL/JSONパス式 13.2.1

create_view_on_path, DBMS_JSON PL/SQLプロシージャ 20.7, 20.7.2

create_view, DBMS_JSON PL/SQLプロシージャ 20.7, 20.7.1

Dデータ・ガイド

変更トリガー 20.9

ユーザー定義 20.9.1

フィールド 20.4

フラット 20.12

階層 20.13

同一JSON列に対して複数 20.10

概要 20.1

JSON列のデータ型 3

date()項目メソッド, SQL/JSONパス式 13.3

日付および時刻の形式, ISO 8601 13.4

DBA_JSON_COLUMNSビュー 4.1

DBA_JSON_DATAGUIDE_FIELDSビュー 20.5

DBA_JSON_DATAGUIDESビュー 20.5

DBMS_JSON.add_virtual_columns PL/SQLプロシージャ 20.8, 20.8.1, 20.8.2

DBMS_JSON.create_view_on_path PL/SQLプロシージャ 20.7, 20.7.2

DBMS_JSON.create_view PL/SQLプロシージャ 20.7, 20.7.1

DBMS_JSON.drop_virtual_columns PL/SQLプロシージャ 20.8, 20.8.3

314

Page 315: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

DBMS_JSON.FORMAT_FLAT 20.3, 20.4, 20.12

DBMS_JSON.FORMAT_HIERARCHICAL 20.3, 20.7.1, 20.8.1, 20.13

DBMS_JSON.get_index_dataguide PL/SQLファンクション 20.3, 20.4, 20.7.1, 20.8.1

DBMS_JSON.PRETTY 20.7.1, 20.12, 20.13

DBMS_JSON.rename_column PL/SQLプロシージャ 20.4

子孫ステップ, SQL/JSONパス式 13.2.1

図, 基本的なSQL/JSONパス式の構文 B

論理和, SQL/JSONパス式構文 B

Document Object Model 22

JSONデータのDOMに類似した操作 22

JSONデータへのドット表記法アクセス 12

json_table SQL/JSONファンクションとの使用 18

double()項目メソッド, SQL/JSONパス式 13.3

drop_virtual_columns, DBMS_JSON PL/SQLプロシージャ 20.8, 20.8.3

JSONフィールドの仮想列の削除 20.8, 20.8.3

JSONオブジェクトの重複フィールド名 5.1

EJSON配列の要素 2.2

eq_regexフィルタ述語, SQL/JSONパス式 13.2.1

エラー句, SQL問合せファンクションおよび条件 14.3

ERROR ON MISMATCH句, json_value 14.5

existsフィルタ述語, SQL/JSONパス式 13.2.1

EXISTSキーワード, json_table SQL/JSONファンクション 18

EXTRA DATA句, ON MISMATCH句, json_value 14.5

Fフィールド, JSONオブジェクト 2.2

315

Page 316: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

フィールド名, SQL/JSONパス式構文 B

フィルタ, SQL/JSONパス式構文 B

フィルタ条件, SQL/JSONパス式 13.2.1

フィルタ式, SQL/JSONパス式 13.2.1

floor()項目メソッド, SQL/JSONパス式 13.3

FORMAT_FLAT, パッケージDBMS_JSON 20.3, 20.4, 20.12

FORMAT_HIERARCHICAL, パッケージDBMS_JSON 20.3, 20.7.1, 20.8.1, 20.13

FORMAT JSONキーワードjson_table SQL/JSONファンクション 18.2

SQL/JSON生成関数 21.1, 21.2

FOR ORDINALITYキーワード, json_table SQL/JSONファンクション 18

JSONデータの全文検索 26.9

ファンクション, Oracle SQL

json_serialize 19

関数, SQL

json_dataguide 20.3, 20.4

集計関数として 20.10

階層形式 20.13

フォーマット出力形式 20.13

json_mergepatch 9

関数, SQL/JSON

json_array 21.4

json_arrayagg 21.6

json_object 21.3

json_objectagg 21.5

json_query 17

json_table 18

json_value 16

316

Page 317: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

ファンクションベースの索引付け 26.4

地理データへの索引付け 24

null JSON値 16.2

オブジェクト型インスタンスを返す 16.3

関数ステップ, SQL/JSONパス式 13.2.1

構文 B

GSQLを使用したJSONデータの生成 21, 21.1

入力SQL値 21.2

地理的なJSONデータ 24

GeoJSON 24

JSONのジオメトリ機能 24

get_index_dataguide, DBMS_JSON PL/SQLファンクション 20.3, 20.4, 20.7.1, 20.8.1

get()メソッド, PL/SQLオブジェクト型 22

Hサブ文字列フィルタ述語がある, SQL/JSONパス式 13.2.1

JSONデータから投影される非表示の仮想列 20.8

IIGNORE ON MISMATCH句, json_value 14.5

IM列ストア 27.1

索引, 配列 13.2.1

JSONデータの索引付け 26

複数フィールド用のコンポジットBツリー索引 26.8

json_exists問合せ 26.6

json_table問合せ 26.5

検索 26.9

317

Page 318: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

全文および数値範囲 26.9

ファンクションベース 26.4

地理データ 24

GeoJSON 24

is (not) json SQL/JSON条件 26.1

json_exists SQL/JSON条件 26.3

json_value SQL/JSONファンクション 26.4

データ型に関する考慮事項 26.7

地理データ 24

json_exists問合せ 26.6

json_table問合せ 26.5

空間 24

インメモリー列ストア 27.1

JSONの移入 27.2

JSONデータを使用した表のアップグレード 27.3

JSONデータの列への挿入 9

PL/SQLオブジェクト型のイントロスペクション 22

is json SQL/JSON条件 5

およびJSON null 2.2

索引付け 26.1

STRICTキーワード 5.3

is not json SQL/JSON条件 5

およびJSON null 2.2

索引付け 26.1

STRICTキーワード 5.3

ISO 8601日付と時刻の形式 13.4

項目メソッド, SQL/JSONパス式 13.2.1 13.3

データ型の互換性 13.3

構文 B

itemsデータ・ガイド・フィールド(JSONスキーマ・キーワード) 20.4

318

Page 319: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JJavaScript配列 2.2

JavaScript表記法とJSONの比較 2.1

JavaScriptオブジェクト 2.2

JavaScriptオブジェクト・リテラル 2.2

JavaScript Object Notation(JSON) 2.1

JSON 2.1

文字エンコーディング 6

文字セット変換 6

JavaScript表記法との比較 2.1

XMLとの比較 2.3

概要 1 2

Oracle Databaseによるサポート, 制限事項 A

構文 1, 2, 2.2

基本的なパス式 13.2.1, B

厳密および緩慢 5.2

JSON_ARRAY_T PL/SQLオブジェクト型 22

json_arrayagg SQL/JSONファンクション 21.6

json_array SQL/JSONファンクション 21.4

json_dataguide SQLファンクション 20.3, 20.4

集計関数として 20.10

階層形式 20.13

フォーマット出力形式 20.13

JSON_ELEMENT_T PL/SQLオブジェクト型 22

json_equal Oracle SQL条件 IV

json_exists SQL/JSON条件 15

json_table 15.2

索引付け 26.1, 26.3, 26.6

JSON_KEY_LIST PL/SQLオブジェクト型 22

319

Page 320: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

json_mergepatch() PL/SQLオブジェクト型メソッド 9

json_mergepatch SQLファンクション 9

JSON_OBJECT_T PL/SQLオブジェクト型 22

json_objectagg SQL/JSONファンクション 21.5

json_object SQL/JSONファンクション 21.3

json_query SQL/JSONファンクション 17

json_table 17.1

JSON_SCALAR_T PL/SQLオブジェクト型 22

json_serialize Oracle SQLファンクション 19

json_table SQL/JSONファンクション 18

EXISTSキーワード 18

FORMAT JSONキーワード 18.2

その他のSQL/JSONファンクションおよび条件の一般化 18.3

問合せ用の索引付け 26.5

NESTED PATH句 18.4

PATH句 18

json_textcontains SQL/JSON条件 26.9

json_value SQL/JSONファンクション 16

as json_table 16.4

索引付けのデータ型の考慮事項 26.7

ファンクションベースの索引付け 26.4

地理データ 24

json_exists問合せ用の索引付け 26.6

json_table問合せ用の索引付け 26.5

null JSON値 16.2

オブジェクト型インスタンスを返す 16.3

JSON列 1.1

JSONデータ・ガイド 20

概要 20.1

JSON生成関数 21

320

Page 321: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONオブジェクト型, PL/SQL

概要 22

JSONスキーマ 20

キーワード 20.4

JSON検索索引 26.9

Kキー, JSONオブジェクト

参照: フィールド, JSONオブジェクト

キーワードJSONスキーマ 20.4

L緩慢なJSON構文 5.2

指定 5.3

length()項目メソッド, SQL/JSONパス式 13.3

like_regexフィルタ述語, SQL/JSONパス式 13.2.1

likeフィルタ述語, SQL/JSONパス式 13.2.1

制限事項, Oracle DatabaseのJSONサポート A

JSONデータのデータベースへのロード 9

LOB記憶域, JSONデータに使用 3

lower()項目メソッド, SQL/JSONパス式 13.3

MJSONデータのマテリアライズド・ビュー 18.5

MISSING DATA句, ON MISMATCH句, json_value 14.5

同一JSON列に対する複数のデータ・ガイド 20.10

321

Page 322: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

NNESTED句, json_tableの代替 18.1

NESTED PATH句, json_table 18.4

NoSQLデータベース 1.1

nullの処理, SQL/JSON生成関数 21.1, 21.2

NULLを処理する句, SQL/JSON生成関数 21.1

NULL ON EMPTY句, SQL/JSON問合せファンクション 14.4

NULL ON MISMATCH句, json_value 14.5

NULL ON NULL, SQL/JSON生成関数 21.1

number()項目メソッド, SQL/JSONパス式 13.3

numberOnly()項目メソッド, SQL/JSONパス式 13.3

数値範囲の索引付け 26.9

Oo:frequencyデータ・ガイド・フィールド 20.4

o:hiddenデータ・ガイド・フィールド 20.8

o:high_valueデータ・ガイド・フィールド 20.4

o:last_analyzedデータ・ガイド・フィールド 20.4

o:lengthデータ・ガイド・フィールド 20.4

o:low_valueデータ・ガイド・フィールド 20.4

o:num_nullsデータ・ガイド・フィールド 20.4

o:pathデータ・ガイド・フィールド 20.4

o:preferred_column_nameデータ・ガイド・フィールド 20.4

オブジェクト, JavascriptおよびJSON 2.2

オブジェクト・リテラル, Javascript 2.2

オブジェクト・メンバー, JSON 2.2

オブジェクト・ステップ, SQL/JSONパス式 13.2.1

構文 B

ON EMPTY句, SQL/JSON問合せファンクション 14.4

322

Page 323: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

oneOfデータ・ガイド・フィールド(JSONスキーマ・キーワード) 20.4

ON MISMATCH句, json_value 14.5

Oracle SQL条件 IV

「SQL/JSON条件」も参照

json_equal IV

Oracle SQLファンクションjson_dataguide 20.3, 20.4

集計関数として 20.10

階層形式 20.13

フォーマット出力形式 20.13

json_mergepatch 9

json_serialize 19

データベース内のJSONに対するOracleのサポート A

P親COLUMNS句, json_table SQL/JSONファンクション 18.2

JSONデータのPL/SQLオブジェクト型への解析 22

PASSING句, json_exists 15

PATH句, json_table 18

パス式, SQL/JSON 13, 13.1

比較, 型 13.5

項目メソッド 13.3

構文 13.2, B

パフォーマンス・チューニング 25

PL/SQL関数DBMS_JSON.get_index_dataguide 20.3, 20.4, 20.7.1, 20.8.1

PL/SQLオブジェクト型メソッド 22

json_mergepatch() 9

PL/SQLオブジェクト型概要 22

323

Page 324: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

PL/SQLプロシージャDBMS_JSON.add_virtual_columns 20.8, 20.8.1, 20.8.2

DBMS_JSON.create_view 20.7, 20.7.1

DBMS_JSON.create_view_on_path 20.7, 20.7.2

DBMS_JSON.drop_virtual_columns 20.8, 20.8.3

DBMS_JSON.rename_column 20.4

PRETTY, パッケージDBMS_JSON 20.7.1, 20.12, 20.13

PRETTYキーワード, SQLファンクション 14.1

フォーマット出力

マニュアルの例JSONフィールドの仮想列の投影 20.8

propertiesデータ・ガイド・フィールド(JSONスキーマ・キーワード) 20.4

プロパティ, JSONオブジェクト参照: フィールド, JSONオブジェクト

put()メソッド, PL/SQLオブジェクト型 22

Q問合せ, ドット表記法 12

json_table SQL/JSONファンクションとの使用 18

R範囲指定, 配列 13.2.1

rawtohex SQLファンクション, BLOB JSON列での挿入または更新用 3

JSONデータを含むリレーショナル・データベース 1.1

相対パス式 13.2.1

構文 B

rename_column, DBMS_JSON PL/SQLプロシージャ 20.4

JSONデータのレンダリング 14.1

制限事項, Oracle DatabaseのJSONサポート A

324

Page 325: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

RETURNING句SQL/JSON生成関数 21.1

SQL問合せファンクション 14.1

行ソース, JSON

定義 18

Sスカラー, SQL/JSONパス式

構文 B

スカラー値, JSON 2.2

スキーマ, JSON 20

スキーマレス・データベース・データ 1.1

SDO_GEOMETRY 24

JSONデータの検索 26.9

SELECT文, json_tableの代替のNESTED句 18.1

シリアライズ問合せのJSONデータ 14.1

PL/SQLオブジェクト型のJSONデータ 22

JSONデータのシリアライズ 19

PL/SQLオブジェクト型の値の設定 22

シャーディング, 索引のデータ・ガイド情報 20.2

兄弟COLUMNS句, json_table SQL/JSONファンクション 18.2

JSONデータに対する単純なドット表記法アクセス 12

json_table SQL/JSONファンクションとの使用 18

Simple Oracle Document Access (SODA) 1

簡略化された構文「JSONデータに対する単純なドット表記法アクセス」を参照

size()項目メソッド, SQL/JSONパス式 13.3

SODA 1

空間のJSONデータ 24

325

Page 326: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

SQL/JSON条件 IV

「Oracle SQL条件」も参照

is (not) json 5

is json

およびJSON null 2.2

索引付け 26.1

is not json

およびJSON null 2.2

索引付け 26.1

json_exists 15

json_table 15.2

索引付け 26.1, 26.3

json_textcontains 26.9

SQL/JSONファンクションJSONの生成 21

json_array 21.4

json_arrayagg 21.6

json_object 21.3

json_objectagg 21.5

json_query 17

json_table 17.1

json_table 18

json_value 16

as json_table 16.4

ファンクションベースの索引付け 24, 26.4

null JSON値 16.2

オブジェクト型インスタンスを返す 16.3

SQL/JSON生成関数 21, 21.1

入力SQL値 21.2

SQL/JSONパス式 13, 13.1

326

Page 327: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

比較, 型 13.5

項目メソッド 13.3

構文 13.2

配列ステップ B

基本 13.2.1, B

compare述語 B

比較 B

条件 B

論理積 B

論理和 B

フィールド名 B

フィルタ B

ファンクション・ステップ B

項目メソッド B

オブジェクト・ステップ B

緩和 13.2.2

スカラー B

変数 B

SQL/JSON問合せファンクションWITH WRAPPERキーワード 14.2

SQL/JSON変数 13.2.1

SQLファンクションjson_dataguide 20.3, 20.4

集計関数として 20.10

階層形式 20.13

フォーマット出力形式 20.13

json_mergepatch 9

SQL NESTED句, json_tableの代替 18.1

フィルタ述語で始まる, SQL/JSONパス式 13.2.1

ステップ, SQL/JSONパス式 13.2.1

327

Page 328: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

JSONデータの格納および管理, 概要 3

厳密なJSON構文 5.2

指定 5.3

STRICTキーワードis (not) json SQL/JSON条件 5.3

SQL/JSON生成関数 21.1

string()項目メソッド, SQL/JSONパス式 13.3

stringOnly()項目メソッド, SQL/JSONパス式 13.3

JSONのサポート, Oracle Database A

構文図, 基本的なSQL/JSONパス式の構文 B

TJSONデータを含む表 1.1

時刻と日付の形式, ISO 8601 13.4

timestamp()項目メソッド, SQL/JSONパス式 13.3

JSONデータのツリーのような表現 22

データ・ガイドの変更のトリガー 20.9

TRUNCATEキーワード, SQL/JSON VARCHAR2戻り値に対するOracleの拡張機能 18

TRUNCATEキーワード, SQL VARCHAR2戻り値に対するOracleの拡張機能 14.1

type()項目メソッド, SQL/JSONパス式 13.3

typeデータ・ガイド・フィールド(JSONスキーマ・キーワード) 20.4

TYPE ERROR句, ON MISMATCH句, json_value 14.5

UUNCONDITIONALキーワード, SQL/JSON問合せファンクション 14.2

JSONオブジェクトの一意のフィールド名 5.1

JSONデータの更新 9

upper()項目メソッド, SQL/JSONパス式 13.3

USER_JSON_COLUMNSビュー 4.1

328

Page 329: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

USER_JSON_DATAGUIDE_FIELDSビュー 20.5

USER_JSON_DATAGUIDESビュー 20.5

ユーザー定義のデータ・ガイドの変更のトリガー 20.9.1

V値, JSON 2.2

変数, SQL/JSONパス式 13.2.1

構文 B

ビューデータ・ガイドに基づいた作成 20.7.1

データ・ガイド対応索引およびパスに基づいた作成 20.7.2

SQL/JSONファンクションjson_tableを使用した作成 18.5

ビューALL_JSON_COLUMNS 4.1

ALL_JSON_DATAGUIDE_FIELDS 20.5

ALL_JSON_DATAGUIDES 20.5

DBA_JSON_COLUMNS 4.1

DBA_JSON_DATAGUIDE_FIELDS 20.5

DBA_JSON_DATAGUIDES 20.5

USER_JSON_COLUMNS 4.1

USER_JSON_DATAGUIDE_FIELDS 20.5

USER_JSON_DATAGUIDES 20.5

JSONフィールドの仮想列, 追加 20.8

データ・ガイド対応検索索引に基づく 20.8.2

階層データ・ガイドに基づく 20.8.1

W整形式のJSONデータ 5

整形式のJSONデータ

329

Page 330: Release 19 JSON開発者ガイドRelease 19 JSON開発者ガイド 目次 例一覧 図一覧 表一覧 タイトルおよび著作権情報 はじめに 対象読者 ドキュメントのアクセシビリティについて

確認 3

WITHOUT UNIQUE KEYSキーワード, JSON条件is json 5.1

WITH UNIQUE KEYSキーワード, JSON条件is json 5.1

WITH WRAPPERキーワード, SQL/JSON問合せファンクション 14.2

ラッパー句, SQL/JSON問合せファンクション 14.2

WRAPPERキーワード, SQL/JSON問合せファンクション 14.2

XXML

JSONとの比較 2.3

DOM 22

About Oracle Contact Us Products A-Z Terms of Use & Privacy Ad Choices

このページは役に立ちましたか?

330