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
チェック制約を他のチェック制約と同じように扱って、列の内容に関するルールを適用します。このように、データ型がVARCHAR2
、BLOB
またはCLOB
のJSON文書が格納された列の処理は、同じ型の他の列と同じように扱われます。
JSON
型のデータの場合、条件is json
は適切ではありませんが、キーワードDISALLOW SCALARS
(最上位レベルのスカラーを含むJSON文書を禁止します)を使用する場合は例外です。is json
の他のキーワードをJSON
型のデータに使用すると、エラーが発生します。
JSON文書のJSON列への挿入は、その列のデータ型がJSON
、VARCHAR2
または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データの更新の詳細は、JSON用のPL/SQLオブジェクト型を参照してください。
-
SQLファンクション
rawtohex
の詳細は、Oracle Database SQL言語リファレンスを参照してください。 -
Oracle SQLファンクション
json_transform
の詳細は、『Oracle Database SQL言語リファレンス』 -
Oracle Database SQL言語リファレンス(SQLファンクション
json_mergepatch
の詳細) -
IETF RFC7396 (JSONマージ・パッチの定義)
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列にロードされたら、その内容に索引を付け、反復的かつ選択的な方法で、データの問合せを効率的に行うことができるようになります。