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

データベースAPIを使用して、Oracle DatabaseでのJSONデータの挿入および変更を行うことができます。Oracle SQLファンクションjson_transformまたはjson_mergepatchを使用すると、JSON文書を更新できます。ファイルシステムのファイルに含まれるJSONデータをデータベースに公開する外部表を作成することで、このようなデータを直接処理できます。

JSONデータの挿入または更新での標準データベースAPIの使用

VARCHAR2列およびラージ・オブジェクト(LOB)列の挿入または更新に使用される通常のデータベースAPIはすべて、JSON列に使用できます。JSON列のデータ型がJSON (推奨)の場合、入力したテキスト・データは、自動的にJSON型に変換されます。

JSON型をサポートするクライアント(JDBC for JavaまたはOracle Call Interface for CおよびC++)を使用してJSON列に挿入または更新を行う場合は、クライアント・データをJSON型インスタンスに直接バインドできます。テキストからJSON型への変換は不要です。

JSONデータ型の列は、常に整形式のJSONデータです。別のデータ型を使用してJSONデータを格納する場合は、SQL条件is jsonをチェック制約として使用して、JSON列に整形式のJSONデータのみを格納するように指定します。

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

JSON型のデータの場合、条件is jsonは適切ではありませんが、キーワードDISALLOW SCALARS (最上位レベルのスカラーを含むJSON文書を禁止します)を使用する場合は例外です。is jsonの他のキーワードをJSON型のデータに使用すると、エラーが発生します。

JSON文書のJSON列への挿入は、その列のデータ型がJSONVARCHAR2またはCLOBの場合には簡単です。SQLを使用してこれを行う例については、例4-3を参照してください。JDBC for Java、Oracle Call Interface for CまたはC++などのクライアントを使用してこれを行うこともできます。JSONデータ型をサポートまたは認識しない古いクライアントを使用して、JSONデータをJSON型の列に挿入することもできます。データはJSON型に暗黙的に変換されます。

しかし、データ型がBLOBのJSON列にデータを挿入したり、そのようなデータを更新したりするために、SQL*Plusなどのコマンドライン・ツールを使用する場合は、データを適切にBLOBに変換する必要があります。例9-1に、部分的な例を示します。

注意:

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

関連項目:

SQLファンクションto_blobの詳細は、Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド明示的な変換ファンクションを参照してください。

例9-1 BLOB列へのテキストのJSONデータの挿入

この例では、次のことを想定しています。

  • my_tableには、BLOB記憶域を使用するJSON列json_docがあります。

  • 挿入されるデータは、変数my_json_clobの値であるCLOBインスタンスで、その文字はAL32UTF8ではないデータベース・キャラクタ・セット(たとえばWE8MSWIN1252)にあります。

SQLファンクションto_blobは、CLOBデータをキャラクタ・セットAL32UTF8を使用するテキストのBLOBインスタンスに変換します。ファンクションto_blobの2番目の引数は、キャラクタ・セットID番号です。

INSERT INTO my_table (json_doc) VALUES to_blob(my_json_clob, nls_charset_id('AL32UTF8'));

JSON変換またはJSONマージ・パッチを使用したJSON文書の更新

Oracle SQLファンクションjson_transformまたはjson_mergepatchを使用して、JSON文書の特定の部分を変更できます。これらのファンクションの用途は、格納されているJSONデータを更新することのみではありません。これらを使用してJSONデータを即時に変更し、問合せでさらに使用することもできます。変更されたデータを反映するためにデータベースを更新する必要はありません。

各ファンクションに入力JSONデータを指定することに加えて、次のデータを指定します。

  • json_transformの場合は、データの一部に対して実行される変更操作の順序。各操作は、操作名(REMOVEなど)とそれに続く(1)一部のデータを変更対象とするSQL/JSONパス式、および(2)そのデータに対して実行する更新操作で構成されます。操作は、指定された順序で入力データに適用されます。各操作は前の操作が適用された結果に対して作用します。

  • json_mergepatchの場合、所与のJSON文書に加える変更を指定するJSON文書であるJSONマージ・パッチ・ドキュメント。JSONマージ・パッチはIETF標準です。

json_transformは、json_mergepatchで実行できる内容のスーパーセットです。

json_transformでディスク上のJSON文書を更新するとき、通常、データがJSON型の場合は操作はピース単位で実行されます。文書全体を置き換える必要はありません。他の更新方法では、文書全体が置換される場合があります。そのような方法を使用すると、JSON文書に細かい修正を指定できますが、変更をディスクに保存するためには、更新した文書全体を書き込む必要があります。

json_transformを使用する更新(データ型に関係なく)も、別の意味ではピース単位です。変更するドキュメント・ピースのみ、およびその方法を指定します。クライアントは、変更する場所(SQL/JSONパス式を使用)と実行する更新操作のみを送信する必要があります。これは、変更される文書全体を送信し、変更された文書全体を受け取ることと対照的です。

一方、json_mergepatchは、一部のコンテキストで使用しやすいファンクションであり、文書の2つのバージョンを比較することによってパッチ・ドキュメントが生成されます。特定の変更場所および操作に関して指定または考慮する必要はありません。生成されるパッチは変更する場所を認識し、変更内容は暗黙的です。たとえば、データベースはJSON文書の一部をクライアントに渡し、クライアントはなんらかの方法でそれを変更して、文書フラグメントに更新パッチを渡すことができます。データベースでは、json_mergepatchを使用して、格納されている文書にこのパッチを適用できます。

関連項目:

PL/SQLオブジェクト型を使用したJSON文書の更新

Oracle SQLファンクションjson_transformおよびjson_mergepatchを使用すると、宣言的な方法でJSONデータを変更できます。json_transformの場合、変更する場所と変更内容を指定しますが、実行方法について詳細に説明します。json_mergepatchの場合は、ドキュメント・バージョンの相違点(パッチ)を指定します。

これらのSQLファンクションで簡単に処理できない複雑なユースケースの場合は、PL/SQLコード(特にJSON PL/SQLオブジェクト型のメソッド(remove()など))を使用して、JSONデータを手続き的に変更できます。PL/SQLで実行できる変更の種類には、制限はありません(チューリング完全なプログラミング言語です)。JSONデータをオブジェクト型JSON_ELEMENT_Tのインスタンスに解析し、変更を加えてシリアライズし(テキストのJSONデータが必要な場合)、データベースに格納しなおすことができます。

ファイルシステム・ファイルのJSONデータを処理するための外部表の使用

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

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