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リレーショナル二面性ビューの概要」

図2-1 JSONデータ: ユースケースおよび格納/生成のオプション

図2-1の説明が続きます
「図2-1 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データ型(JSONVARCHAR2CLOBまたは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型(VARCHAR2CLOBまたはBLOB)を使用する場合、JSONデータはテキストと呼ばれます。これは、解析対象外の文字データです(BLOBインスタンスとして格納されている場合でも対象外)。

JSONデータ型を使用することをお薦めしますが、次のユースケースではテキストJSONを使用してもかまいません:

  • JSON型が存在しなかったリリース(21cより前のリリース)から、なんらかの理由でJSON型に変換しないレガシー・データの場合。

  • なんらかの理由で初期化パラメータcompatible20より小さい必要があるため、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データからスカラー値を抽出するときには、次のことが起こる可能性があります:

  1. 入力JSONデータ自体が(SQL) NULLであるため値が選択されない。これは、たとえば、データの行がNULLである場合です。

  2. 入力JSONデータは(SQL) NULLではないが問合せ(パス式など)でスカラー値が選択されない — ターゲット値がない

  3. 問合せでJSONのnull値が選択される。

事例3の動作は、データベースでJSONデータ型がサポートされているかどうか、つまり初期化パラメータcompatibleの値が20以上かどうかで異なります。

表2-1でのすべてのデータはSQLデータです。大文字のNULLは、SQLのNULL値を示します。示されているJSONデータは、JSONデータを含むことができるSQL型(VARCHAR2JSONなど)の内容です。JSON言語のnull値は小文字で記述されています。

表2-1 JSON型データの入力がSQLのNULLの場合、ない場合およびJSONのnullの場合のその扱い

事例 JSON入力データ ドット表記法.a JSON_VALUE('$.a') JSON_QUERY('$.a')

事例1: 入力データがNULL

NULL

NULL

NULL

NULL

事例2: 対象となるデータがない

{}

NULL

NULL

NULL

事例3、JSON型のサポートあり: JSONのnull値が選択されている

{"a":null}

  • JSON型の入力の場合: JSON型のnull値(json_scalar('null')で返されるものと同じ)

  • それ以外の場合: NULL

NULL

  • JSON型の入力またはRETURNING JSONの場合: JSON型のnull値(json_scalar('null')で返されるものと同じ)

  • それ以外の場合: RETURNINGまたは入力の型の、テキストJSONのnull値(json_serialize(json_scalar('null'))で返されるものと同じ)

事例3、JSON型のサポートなし: JSONのnull値が選択されている

{"a":null}

NULL

NULL

NULL

ノート:

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記憶域(VARCHAR2CLOBまたはBLOB)を使用する場合は、is jsonチェック制約を使用して、列値が有効なJSONインスタンスであることを確認することをお薦めします(例4-2を参照)。

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

JSONまたはBLOBデータ型を使用して格納されたデータは、文字セットから独立しており、データの処理時に変換されません。

2.1.4 JSONデータでのSQLの使用

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

  • SQL/JSON問合せファンクションjson_valuejson_queryおよびjson_table

    これらは、SQL/JSONパス式をJSONデータに対して評価し、SQL値を生成します。

  • Oracle SQL条件json_textcontains、およびSQL/JSON条件json_existsis jsonis not json

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

    json_existsおよびjson_textcontainsでは、SQL/JSONパス式と一致するデータがチェックされます。

  • 問合せファンクションjson_valuejson_queryを組み合せたような動作の単純なドット表記法

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

  • SQL/JSONの生成関数であるjson_objectjson_arrayjson_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;

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

JSONデータ型インスタンスは、PL/SQLサブプログラムで使用できます。

SQLコードまたはPL/SQLオブジェクト型を使用して、PL/SQLコード内でJSONデータを操作できます。

一般に、SQLコードは、JSONデータにアクセスするSQLコードも含めて、PL/SQLコード内で使用できます。

次のSQLファンクションおよび条件は、組込みPL/SQLファンクションとしても使用できます: json_valuejson_queryjson_objectjson_arrayjson_scalarjson_serializejson_existsis jsonis 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_existsis jsonis not jsonおよびjson_equalは、ブール関数です。

  • json_valueは、BOOLEAN値を返すことができます。json_valueセマンティクスのjson_table列は、BOOLEAN型にすることができます。

  • json_scalarは、引数としてBOOLEAN値を受け取ることができ、その場合、ブール型のJSON型インスタンス(trueまたはfalse)を返します。

  • json_objectjson_objectaggjson_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を参照してください

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ストアド・サブプログラムを使用します。サブプログラムの引数(INOUTINOUT)および戻り値は、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