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

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

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

VARCHAR2列およびラージ・オブジェクト(LOB)列の挿入または更新に使用される通常のデータベースAPIはすべて、JSON列に使用できます。

SQL条件is jsonをチェック制約として使用することにより、JSON列に整形式のJSONデータのみを格納する必要があることを指定できます。

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

JSONドキュメントのJSON列への挿入またはこのような列でのデータの更新は、その列のデータ型がVARCHAR2CLOBまたはBLOBの場合には簡単です。例4-2を参照してください。このような列の更新についても同じです。JDBC for Java、Oracle Call Interface for CまたはC++などのクライアントを使用してこれを行うこともできます。

ノート:

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

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による更新はピース単位です。変更するドキュメント・ピースのみ、およびその方法を指定します。クライアントは、変更する場所(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を使用して、外部表のデータを通常でのデータベース表にコピーすることを検討します。例13-4を参照してください。JSONデータが通常の表のJSON列にロードされたら、その内容に索引を付け、反復的かつ選択的な方法で、データの問合せを効率的に行うことができるようになります。

関連項目: