2.1 Oracle DatabaseにおけるJSONの概要
Oracle Databaseは、トランザクション、索引付け、宣言的問合せおよびビューを含むリレーショナル・データベースの機能を使用してJSONデータをネイティブにサポートしています。JSONデータは、データを定義するスキーマを必要とせずに、データベースへの格納、索引付けおよび問合せを行うことができます。オプションで、JSONデータがJSONスキーマを順守するように要求できます。
JSONデータ自体はスキーマレスにできますが、データベースに格納されるときに、データベース・スキーマを使用して格納先の表および列が定義されます。データベース・スキーマではJSONデータ自体の構造は指定されていません。
オプションで指定のJSONデータを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データをリレーショナルに投影できるため、JSONデータはリレーショナルなプロセスおよびツールで使用できるようになります。さらに、Oracle Databaseの外部で外部表に格納されたJSONデータをデータベース内で問い合せることもできます。
データベースに格納されたJSONデータには、Oracle Call Interface (OCI)、Java Database Connectivity (JDBC)などの、他のデータベース・データへのアクセスと同じ方法でアクセスできます。
ネイティブ・バイナリJSON形式(OSON)を使用して、Oracleでは、JSON標準に含まれていないdateやdoubleなどのスカラー型を追加することでJSON言語を拡張します。Oracle SQLデータ型JSON
ではOSON形式が使用されます。
JSONデータを格納するだけでなく、格納されたリレーショナル・データから生成できます。「JSONデータの生成」を参照してください。また、同じデータをリレーショナルに使用することも、JSON文書セットとして使用することもどちらもできます。『JSONリレーショナル二面性開発者ガイド』の「JSONリレーショナル二面性ビューの概要」を参照してください。
JSONデータの格納または生成には、複数の方法でアプローチできます。ユースケースによっては、特定のアプローチが他のアプローチよりも有益な場合があります。ドキュメント中心のユースケースでは、アプリケーションはデータをJSON (オブジェクト)文書として格納します。ハイブリッド・ユースケースでは、アプリケーションはJSONデータをリレーショナル・データとともに使用します。ドキュメント中心のアプリケーションは、多くの場合、ドキュメントAPIまたはRESTを使用しますが、Oracle DatabaseではSQLを同様に使用できます。
次の内訳は、特定のユースケースに対してどのアプローチを取るかを決定するのに役立ちます(図2-1は、同じ情報を図で表しています)。
-
ユースケースがハイブリッドで、主にドキュメント中心ではない場合は、
JSON
型列およびリレーショナル列を持つ通常のデータベース表を使用します。 -
それ以外(ドキュメント中心のアプリケーション)の場合は、JSONコレクションを使用します。
-
JSON文書をリレーショナル・データにマップしない場合は、データをSQLと共有し、JSONコレクション表を使用します。
-
それ以外(SQLと共有されているJSONデータ)の場合は、JSONビューを使用します。
-
文書を直接更新できるようにする場合は、JSONリレーショナル二面性ビューを使用します。
- それ以外の場合は、JSONコレクション・ビューを使用します。
-
-
関連項目:
『JSONリレーショナル二面性開発者ガイド』の「JSONリレーショナル二面性ビューの概要」
_________________________________________________________
- JSONデータのデータ型
SQLデータ型JSON
は、高速問合せおよび更新のためのOracleのバイナリJSON形式です。標準のJSONスカラー型(数値、文字列、ブールおよびnull
)が拡張され、SQLスカラー型に対応する型が追加されます。これにより、JSONとSQLの間のスカラー・データの変換が単純で無損失になります。 - JSONのnullとSQLのNULL
SQLコードとJSONコードの両方が関与する場合は、"null"が関わるとコードとその説明がわかりにくくなることがあります。JSON言語のnull
値とSQLのNULL
値の区別には、場合によっては、よく注意を払う必要があります。また、SQLNULL
自体が混乱を招く可能性があります。 - データベース表のJSON列
Oracle Databaseでは、JSON文書の格納に使用される表に制限はありません。JSON文書が含まれる列は、他のどんな種類のデータベース・データとも共存させることができます。1つの表に、JSON文書が含まれる複数の列を含めることも可能です。 - JSONデータでのSQLの使用
SQLでは、JSON
データ型のコンストラクタJSON
、特化された関数と条件、または単純なドット表記を使用して、OracleデータベースにJSONデータを作成したり、アクセスできます。ほとんどのSQLファンクションおよび条件はSQL/JSONの標準に属していますが、一部はOracleに固有のものです。 - JSONデータでのPL/SQLの使用
JSON
データ型インスタンスは、PL/SQLサブプログラムで使用できます。 - JSONデータとのJavaScriptの使用
Oracle Database Multilingual Engine (MLE)を使用すると、PL/SQLまたはSQLコードと、データベース・サーバーで実行されているJavaScriptコードとの間で、JSONデータを交換できます。node-oracledbドライバを使用すると、データベース・クライアントでJavaScriptコードを実行できます。
関連トピック
親トピック: Oracle DatabaseのJSON
2.1.1 JSONデータのデータ型
SQLデータ型JSON
は、高速問合せおよび更新のためのOracleのバイナリJSON形式です。標準のJSONスカラー型(数値、文字列、ブールおよびnull
)が拡張され、SQLスカラー型に対応する型が追加されます。これにより、JSONとSQLの間のスカラー・データの変換が単純で無損失になります。
標準JSONは、言語または表記法として、オブジェクト、配列、数値、文字列、ブールおよびnull
のデータ型が事前定義されています。オブジェクトと配列を除くすべてのJSON言語型はスカラー型です。
標準では、JSONデータはテキスト形式で定義されます。標準構文ではUnicode文字で構成されます。
実際のJSONデータがプログラミング言語で使用されているか、なんらかの方法で格納されている場合、その特定の言語または記憶域形式のデータ型を使用して実現されます。たとえば、JDBCクライアント・アプリケーションでJSONデータを使用してJava文字列を作成したり、SQLデータ型を使用してデータベース列にJSONデータを格納する場合があります。
これらの2種類のデータ型に留意することが重要です。たとえば、JSON値"abc"
のJSON言語型は文字列ですが、いくつかのSQLデータ型(JSON
、VARCHAR2
、CLOB
またはBLOB
)の値を使用して、この値を表現または実現できます。
SQL型JSON
は、JSONデータ専用に設計されています。Oracle Databaseで使用する場合は、JSONデータにJSON
型を使用することをお薦めします。
JSON
データではバイナリ形式OSONが使用されます。これは、Oracle DatabaseサーバーとOracle Databaseクライアントの両方で問合せおよび更新を迅速に行うための、Oracleによる最適化されたバイナリJSON形式です。JSON
型は、データベース初期化パラメータcompatible
が少なくとも20
である場合にのみ使用できます。
ノート:
わかりやすいように、このドキュメントでは通常は、JSON言語での型をJSON言語型と呼び、SQLデータ型JSON
を"JSON
型"と呼びます。この呼び方によく注意を払うと、特定のコンテキストでのJSONの"型"の意味を区別しやすくなります。
JSONデータを使用するSQLコードには、両方の言語(SQLとJSON)の式を含めることができます。SQLコード内では、リテラルJSONコードは、通常は一重引用符文字('
)で囲みます。この'
...'
という言語境界に注意を払うと、理解しやすくなります。
JSONデータにJSON
以外のSQL型(VARCHAR2
、CLOB
またはBLOB
)を使用する場合、JSONデータはテキストと呼ばれます。これは、解析対象外の文字データです(BLOB
インスタンスとして格納されている場合でも対象外)。
JSON
データ型を使用することをお薦めしますが、次のユースケースではテキストJSONを使用してもかまいません:
-
JSON
型が存在しなかったリリース(21cより前のリリース)から、なんらかの理由でJSON
型に変換しないレガシー・データの場合。 -
なんらかの理由で初期化パラメータ
compatible
が20
より小さい必要があるため、JSON
型がサポートされていないデータベースで使用する場合。 -
JSON
型の32 MBの記憶域制限を超えるJSONデータの場合。 -
アーカイブまたは法的理由のために、変更なしでテキストで格納する必要があるJSONデータの場合。
データベース内の既存のテキストJSONデータをJSON
型のデータに移行できるため、そのようにすることをお薦めします。「テキストJSONデータからJSONデータ型への移行」を参照してください。
ノート:
デフォルトでは、単純なドット表記法問合せまたはSQL演算子(json_query
など)によって返されるJSON値は、入力データがJSON
型の場合はJSON
データ型として返され、それ以外の場合はVARCHAR2(4000)
型として返されます。
テキストで格納されたJSONデータをJSON
型の記憶域に移行する場合、デフォルトの戻り型におけるこの違いに注意してください。デフォルトの戻り型をオーバーライドするには、SQL演算子にRETURNING VARCHAR2(4000)
を指定するか、項目メソッドstring()
を使用して前の動作を取得します。「SQLファンクションで使用されるRETURNING句」および「SQL/JSONパス式の項目メソッド」を参照してください。
テキストJSONデータは、標準のJSON言語スカラー型(数値、文字列、ブールおよびnull)のみをサポートします。ただし、JSONデータのSQL型がJSON
の場合、Oracle DatabaseではSQLスカラー・データ型に直接対応する型が追加されます。これにより、JSON言語が拡張され、JSON言語とSQLの間でスカラー・データの変換が簡単になり、データ損失がなくなります。Oracle固有のJSON言語スカラー型は次のとおりです:
-
binary - SQLの
RAW
またはBLOB
に対応しています。 -
date — SQLの
DATE
に対応しています。 -
day-second interval — SQLの
INTERVAL DAY TO SECOND
に対応しています。 -
double — SQLの
BINARY_DOUBLE
に対応しています。 -
float — SQLの
BINARY_FLOAT
に対応しています。 -
timestamp — SQLの
TIMESTAMP
に対応しています。 -
timestamp with time zoneは、SQL
TIMESTAMP WITH TIME ZONE
に対応します。 -
vector — SQLの
VECTOR
に対応しています。 -
year-month interval — SQLの
INTERVAL YEAR TO MONTH
に対応しています。
ノート:
JSONパス式項目メソッドtype()
を使用して、JSONスカラー値のJSON言語型を決定できます。
"binary"
、"boolean"
、"date"
、"daysecondInterval"
、"double"
、"float"
、"number"
、"null"
、"string"
、"timestamp"
、"timestamp with time zone"
、"vector"
、 "yearmonthInterval"
のいずれかのJSON文字列として、型名が返されます。たとえば、対象となるスカラーJSON値がtimestamp with time zone型の場合、type()
は文字列"timestamp with time zone"
を返します。参照:
ノート:
使用するツールによっては、JSON言語型を適切に区別する方法でJSON
型の値を出力しないものがあります。たとえば、JSON文字列は、二重引用符("
)デリミタなし(たとえば、"42"
ではなく42
)で出力される場合があり、値がJSON数値42
なのか、JSON文字列"42"
なのかは示されません。同様に、JSON
型の日付値は、JSON文字列値と区別できない"2025-11-01"
として出力される場合があります。
その他のツールでは、JSON
型がまったく理解されず、JSON
型の値を出力しようとすると単にエラーが発生する場合があります。
JSON値の型は、次の方法で判別できます:
-
項目メソッド
type()
を使用して、JSON値の型を返します。 -
SQL/JSONファンクション
json_serialize
を使用して、JSON
型の値(問合せから返される値など)をテキストJSON (デフォルトではVARCHAR2(4000)
)に変換します。キーワード
EXTENDED
を指定してファンクションjson_serialize
を使用すると、Oracle固有のJSON言語型のJSONスカラーは、Oracle JSONスカラー値を明確かつ完全に表すテキストJSONオブジェクトとしてシリアライズされます。たとえば、オブジェクト{"$numberDecimal":31}
は、非標準型の10進数のJSONスカラー値を表します。
JSON
型として格納されているJSONデータのそのようなOracle固有のJSON言語型のJSONスカラー値を取得するには、次のいくつかの方法があります。
-
キーワード
RETURNING JSON
を指定してSQL/JSON生成関数を使用します。配列の要素またはオブジェクトのフィールド値の生成に使用されるスカラーSQL値は、対応するJSON型のJSONスカラー値になります。たとえば、BINARY_FLOAT
のSQL値はfloatのJSON値になります。「SQLを使用したJSONデータの生成」を参照してください。 -
SQL/JSONファンクション
json_scalar
を使用します。たとえば、BINARY_FLOAT
のSQL値に適用すると、floatのJSON値になります。「SQL/JSONファンクションJSON_SCALAR」を参照してください。 -
クライアント側のエンコーディングを持つデータベース・クライアントを使用し、Oracle固有のJSON値を
JSON
型として作成してから、データベースに送信します。 -
Oracle固有のJSONスカラー型を持つJSONデータを使用して、JSONのPL/SQLオブジェクト型をインスタンス化します。これには、既存のそのようなオブジェクト型インスタンスの更新も含まれます。「JSON用のPL/SQLオブジェクト型」を参照してください。
-
PL/SQL DOMインスタンス(
JSON_ELEMENT_T
インスタンス)ではPL/SQLメソッドto_json()
を使用します。
Oracle固有のJSON言語型のJSONスカラー値を使用するには、次のいくつかの方法があります。
-
SQL/JSON条件
json_exists
を使用して、SQLバインド変数の値を、Oracle固有のJSONスカラー型に対応する項目メソッドを適用した結果と比較します。「SQL/JSON条件JSON_EXISTS」を参照してください。 -
Oracle固有のJSONスカラー型に対応するSQL型を返す、
RETURNING
句を指定したSQL/JSONファンクションjson_value
を使用します。「SQLファンクションで使用されるRETURNING句」を参照してください。
2.1.2 JSONのnullとSQLのNULL
SQLコードとJSONコードの両方が関与する場合は、"null"が関わるとコードとその説明がわかりにくくなることがあります。JSON言語のnull
値とSQLのNULL
値の区別には、場合によっては、よく注意を払う必要があります。また、SQL NULL
自体が混乱を招く可能性があります。
-
JSON言語では、
null
は、(JSON言語)型の値と名前の両方です。型nullに指定できる値はnull
のみです。 -
SQLでは、各データ型に
NULL
値があります。型VARCHAR2
にはNULL
値があり、型NUMBER
にもあり、その他も同様であり、型JSON
(JSONデータ用のOracleによるネイティブ・バイナリ形式)にもあります。
SQLでのNULL
は、通常は、値がないことを表します(欠落、不明または適用不可のデータ)。ただし、SQLでは、値がないことと、(SQL) NULL
値があることとが区別されません。
SQL値ではJSON言語のスカラー値を保持でき、JSONのnull
はそのような値の1つです。この場合のSQL値は、NULL
ではありません(JSONデータの保持に使用されているSQL型は問わない)。
JSON
型のインスタンス(たとえば、JSON
型の列の行)にSQL値NULL
がある場合、通常は、そのインスタンスにJSONデータがないことを意味します。
JSON値null
は、SQLに関するかぎりは、NULL
でない値であり、それはSQL値NULL
ではありません。具体的に述べると、SQL条件IS NULL
では、JSONのnull
値の場合はfalseが返され、SQL条件IS NOT NULL
ではtrueが返されます。また、SQL/JSON条件json_exists
では、それによる存在確認対象の値がJSONのnull
である場合は、trueが返されます。
SQL/JSONファンクションjson_value
では、その入力JSONデータからSQLスカラー値が抽出されます。抽出する値がJSONのnull
である場合、json_value
では、デフォルトで、SQLのNULL
が返されます。(ON ERROR
処理句またはON EMPTY
処理句を使用することで、json_value
の特定の使用についてこの動作をオーバーライドできます。)
ただし、SQL/JSONファンクションjson_query
の場合や単純なドット表記法の問合せの場合は異なります。それらではJSONデータが返されます。データベースでJSON
データ型がサポートされており、抽出する値がJSONのnull
である場合は、どちらでも、既存のJSON null
値がそのまま返されます(つまり、それらによって、json_scalar('null')
で返される内容が返される)。
json_value
の目的は、JSONデータから抽出するJSONスカラー値に対応する、SQLスカラー値を返すことであると覚えておいてください。たとえばSQLの値TRUE
がJSONのtrue
に対応し、SQLの数値42
がJSONの数値42
に対応しているというような、JSONのnull
に対応するSQLスカラー値はありません。OracleのJSON
データ型にはnull
スカラー値がありますが、SQLには同等のスカラー値はありません。
Q: JSON値null
のSQL型はどれですか。
A: コード/コンテキストによって異なります。JSONデータの格納に使用可能などのSQL型にもできます。「JSONデータのデータ型」を参照してください。
Q: 問合せ結果セットにJSONのnull
値とSQLのNULL
値が両方とも存在する場合、それらの順序はどのように決まりますか。
A: 返された行にSQLのNULL
値が含まれている場合、デフォルトでは、その行は、昇順でソートすると順序内で最後になり、降順でソートすると最初になります。キーワードNULLS FIRST
またはNULLS LAST
を使用すると、このデフォルト動作をオーバーライドできます。『Oracle Database SQL言語リファレンス』のSELECTを参照してください。
JSONデータからスカラー値を抽出するときには、次のことが起こる可能性があります:
-
入力JSONデータ自体が(SQL)
NULL
であるため値が選択されない。これは、たとえば、データの行がNULL
である場合です。 -
入力JSONデータは(SQL)
NULL
ではないが問合せ(パス式など)でスカラー値が選択されない — ターゲット値がない。 -
問合せでJSONの
null
値が選択される。
事例3の動作は、データベースでJSON
データ型がサポートされているかどうか、つまり初期化パラメータcompatible
の値が20以上かどうかで異なります。
表2-1でのすべてのデータはSQLデータです。大文字のNULL
は、SQLのNULL
値を示します。示されているJSONデータは、JSONデータを含むことができるSQL型(VARCHAR2
やJSON
など)の内容です。JSON言語のnull
値は小文字で記述されています。
表2-1 JSON型データの入力がSQLのNULLの場合、ない場合およびJSONのnullの場合のその扱い
事例 | JSON入力データ | ドット表記法.a | JSON_VALUE('$.a') | JSON_QUERY('$.a') |
---|---|---|---|---|
事例1: 入力データが |
|
|
|
|
事例2: 対象となるデータがない |
|
|
|
|
事例3、 |
|
|
|
|
事例3、 |
|
|
|
|
ノート:
SQL NULL
自体が少し混乱を招く可能性があります。ラージ・オブジェクト(LOB)のデータ型(BLOB
、(N
)CLOB
およびBFILE
)を除き、長さ0の値を持つことができるOracle SQL型は、長さ0の値とNULL
値を区別しません。このような型には、RAW
および(N
)VARCHAR
(2
)や(N
)CHAR
などの文字型が含まれます。これは実際には、このような型の「空の文字列」値が、その型のNULL
値と変わらないことを意味します。
2.1.3 データベース表のJSON列
Oracle Databaseでは、JSON文書の格納に使用される表に制限はありません。JSON文書が含まれる列は、他のどんな種類のデータベース・データとも共存させることができます。1つの表に、JSON文書が含まれる複数の列を含めることも可能です。
Oracle DatabaseをJSONのドキュメント・ストアとして使用する場合、JSON列が含まれる表には、通常、JSON以外のハウスキーピング列がいくつか含められます。これらは、通常JSON文書に関するメタデータをトラッキングします。
JSONデータを使用して、主にリレーショナル・アプリケーションに柔軟性を追加する場合、いくつかの表にはJSON文書用の列も作成されることが考えられます。これらの列は、リレーショナル・モデルに直接マッピングされないアプリケーション・データの管理のために使用されます。
JSON列にはJSON
データ型を使用することをお薦めします。かわりにテキストのJSON記憶域(VARCHAR2
、CLOB
またはBLOB
)を使用する場合は、is json
チェック制約を使用して、列値が有効なJSONインスタンスであることを確認することをお薦めします(例4-2を参照)。
定義上、テキストのJSONデータは、Unicodeエンコーディング(UTF-8またはUTF-16)を使用してエンコードされます。非Unicode文字セットで格納されたVARCHAR2
またはCLOB
のデータはJSONデータであるかのように使用できますが、この場合、この文字セットはデータの処理時に自動的にUTF-8に変換されます。
JSON
またはBLOB
データ型を使用して格納されたデータは、文字セットから独立しており、データの処理時に変換されません。
親トピック: Oracle DatabaseにおけるJSONの概要
2.1.4 JSONデータでのSQLの使用
SQLでは、JSON
データ型のコンストラクタJSON
、特化された関数と条件、または単純なドット表記法を使用して、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
、is json
、is not 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データを集めます。
-
SQL/JSONファンクション
json_serialize
およびjson_scalar
とOracle SQL条件json_equal
。ファンクション
json_serialize
は、JSONデータのテキスト表現を返します。json_scalar
は、指定されたSQLスカラー値に対応するJSON
型のスカラー値を返します。json_equal
は、2つのJSON値が同じかどうかをテストします。 -
JSON
データ型のコンストラクタJSON
。これは、テキストのJSONデータを解析して、SQLデータ型
JSON
のインスタンスを作成します。 -
Oracle SQL集計関数
json_dataguide
。これにより、データ・ガイドであるJSONデータが生成され、これを使用してデータベース内の他のJSONデータの構造およびコンテンツに関する情報を検出できます。
問合せのシンプルな例として、表j_purchaseorder
(ここでは、po
という別名を使用)のJSON列data
に格納されている文書の、ドット表記法の問合せを次に示します。これは、すべての発注書の要求者を取得します(JSONフィールドRequestor
)。
SELECT po.data.Requestor FROM j_purchaseorder po;
親トピック: Oracle DatabaseにおけるJSONの概要
2.1.5 JSONデータでのPL/SQLの使用
JSON
データ型インスタンスは、PL/SQLサブプログラムで使用できます。
SQLコードまたはPL/SQLオブジェクト型を使用して、PL/SQLコード内でJSONデータを操作できます。
一般に、SQLコードは、JSONデータにアクセスするSQLコードも含めて、PL/SQLコード内で使用できます。
次のSQLファンクションおよび条件は、組込みPL/SQLファンクションとしても使用できます: json_value
、json_query
、json_object
、json_array
、json_scalar
、json_serialize
、json_exists
、is json
、is not json
およびjson_equal
。
JSON向けのPL/SQLオブジェクト型もあり、インメモリーJSONデータの細かい構成および操作に使用できます。オブジェクト型のデータを構築し、イントロスペクトし、修正し、比較し、ソートし、テキスト形式のJSONデータにシリアライズして戻すことができます。
JSON
データ型のインスタンスは、PL/SQLサブプログラムの入力および出力として使用できます。JSON
型のデータは、JSON_OBJECT_T
などのJSONオブジェクト型をインスタンス化することによって、PL/SQLで操作できます。
リリース23aiより前のOracle Databaseには、BOOLEAN
データ型がありません。ただし、すべてのOracle DatabaseリリースのPL/SQLには、BOOLEAN
があります。PL/SQLの場合(およびSQLの場合、リリース23ai以降):
-
json_exists
、is json
、is not json
およびjson_equal
は、ブール関数です。 -
json_value
は、BOOLEAN
値を返すことができます。json_value
セマンティクスのjson_table
列は、BOOLEAN
型にすることができます。 -
json_scalar
は、引数としてBOOLEAN
値を受け取ることができ、その場合、ブール型のJSON
型インスタンス(true
またはfalse
)を返します。 -
json_object
、json_objectagg
、json_array
およびjson_arrayagg
は、PL/SQL値のTRUE
およびFALSE
に対応する値のtrue
およびfalse
が含まれたJSONオブジェクトおよび配列を生成できます。同様に、
json_transform
にSQLのTRUE
またはFALSE
を渡すと、それらが変換結果に含まれている場合はJSONのtrue
およびfalse
にマップされます。 -
json_exists
およびjson_transform
には、BOOLEAN
バインド変数を使用できます。
PL/SQLを使用すると、JSONスキーマをリレーショナル・データまたはオブジェクト・リレーショナル・データから作成できます。
PL/SQLは、JSONスキーマを使用するためのサブプログラムもDBMS_JSON_SCHEMA
パッケージで提供しています。
-
PL/SQLファンクションまたはプロシージャの
DBMS_JSON_SCHEMA.is_valid()
を使用して、JSONスキーマに対してJSONデータを検証できます。このファンクションは、有効な場合に1
を返し、無効な場合に0
を返します(無効なデータはオプションでエラーを発生させることができます)。このプロシージャは、OUT
パラメータの値として、有効な場合にTRUE
を返し、無効な場合にFALSE
を返します。 -
PL/SQLファンクション
DBMS_JSON_SCHEMA.validate_report
は、妥当性チェック・エラー・レポートの読取りに使用できます。 -
PL/SQLファンクション
DBMS_JSON_SCHEMA.is_schema_valid
は、JSONスキーマ標準に従って特定のJSONスキーマ自体が有効であるかどうかを確認するために使用できます。 -
PL/SQLファンクション
DBMS_JSON_SCHEMA.describe
を使用すると、表、ビュー、オブジェクト型またはコレクション型や、それらのいずれかに解決されるシノニムからJSONスキーマを生成できます。
関連項目:
JSONスキーマの詳細は、json-schema.orgを参照してください
親トピック: Oracle DatabaseにおけるJSONの概要
2.1.6 JSONデータとのJavaScriptの使用
Oracle Database Multilingual Engine (MLE)を使用すると、PL/SQLまたはSQLコードと、データベース・サーバーで実行されているJavaScriptコードとの間で、JSONデータを交換できます。node-oracledbドライバを使用すると、データベース・クライアントでJavaScriptコードを実行できます。
MLEでは、(1) PL/SQLパッケージDBMS_MLE
および(2)データベース内に存在するMLEモジュールを使用して動的にJavaScriptコードが実行されます。通常、MLEモジュールを使用すると、柔軟性が向上し、より適切な方法でJavaScriptコードをPL/SQLコードから分離できます。MLEモジュールはPL/SQLパッケージに似ていますが、その違いは、コードがPL/SQLではなくJavaScriptであることです。
次の方法で、データベース・サーバーで実行されているJavaScriptコードとデータベース記憶域との間でJSONデータを交換できます。
- サーバー側のMLE JavaScriptドライバであるmle-js-oracledbを使用します。
- MLEモジュールを参照するJavaScriptストアド・サブプログラムを使用します。サブプログラムの引数(
IN
、OUT
、INOUT
)および戻り値は、JSON
データ型にできます。 - PL/SQLコードとJavaScriptコードの間でJSON値を交換するには、PL/SQLパッケージ
DBMS_MLE
内のプロシージャを使用します。
JSON値(オブジェクト、配列およびスカラー)とJavaScript値の間での、サーバー側のMLE JavaScriptドライバであるmle-js-oracledbによって使用されるデータ型マッピングは、通常は、クライアント側のJavaScriptドライバであるnode-oracledbによって使用されるマッピングと一致します。ただし、スカラー値間のマッピングはいくつかの点で異なります - MLEの型変換を参照してください。
PL/SQLプロシージャDBMS_MLE.export_to_mle
を使用すると、JSONデータをPL/SQLから動的MLE実行コンテキストにエクスポートし、そこでそれをJavaScriptコードとともに使用できます。その逆で、PL/SQLプロシージャDBMS_MLE.import_from_mle
の使用により、MLE JavaScriptコードからPL/SQLにオブジェクトをインポートし、PL/SQLでそれらをJSONオブジェクトとして使用することもできます。
以前にPL/SQLプロシージャDBMS_MLE.export_to_mle
を使用してJavaScript変数名とともにエクスポートした値を、現在の動的MLE実行コンテキストにインポートするには、組込みモジュールmle-js-bindings
にあるJavaScript関数importValue()
を使用します。関数importValue()
は、引数としてその変数名を取り、そのJSONデータのすべてのスカラー値を、対応するネイティブJavaScript型に変換して、JavaScript値を返します。
同様に、JavaScript関数exportValue()
を使用して、現在の動的MLE実行コンテキストから値をエクスポートします。
関連項目:
-
『Oracle Database JavaScript開発者ガイド』の動的MLE実行の概要
-
『Oracle Database JavaScript開発者ガイド』のMLEのJavaScript関数
-
JavaScriptとPL/SQLまたはSQLとの間のデータ型変換(SQLデータ型
JSON
で表されるJSON言語型との間の変換を含む)については、『Oracle Database JavaScript開発者ガイド』のMLEの型変換。 -
mle-js-oracledbおよびmle-js-bindingsについては、GitHubでMLEモジュール
-
GitHubにあるNode.js node-oracledb
親トピック: Oracle DatabaseにおけるJSONの概要