保存先がリレーショナル表の場合は、APEXの標準コンポーネントを使うことができます。今回はJSON形式のデータをJSONコレクション表に保存し、JSONのまま操作します。JSONのまま操作するために、Uwe Simonさんが作成されたJSON Regionプラグインを使用します。
Oracle APEXでは共有コンポーネントとしてJSONソースがあります。JSONソースを作成することにより、JSONコレクション表からAPEXのデータ・ソースを定義できます。ただし、JSONソースはデータ・プロファイル(JSONの属性を列として見せる定義)が静的に定義されています。JSONデータの属性の追加や削除に対応するには、データ・プロファイルを更新する必要があります。この作業はアプリケーションの開発者が実施し、APEXアプリケーションの更新を伴います。
リージョン・プラグインのJSON Regionは、JSONデータとJSONスキーマの定義から、動的にフォームを生成します。フォームに表示するアイテムやレイアウトは、JSONスキーマによって決まります。これは、アプリケーションに静的に記述したり、JSONデータから動的に生成したり、SELECT文を実行してデータベースから取り出したり、色々な方法で決めることができます。フォームのアイテムやレイアウトの自由度には制限がありますが、表示するデータに依存したフォームの生成が可能です。
作成するAPEXアプリケーションは以下のように動作します。アプリケーションの動作や見かけは、データソースがリレーショナル表のときと違いはありません。
以下よりAPEXアプリケーションの作成手順を紹介します。
最初に東京都の子育て支援制度をJSONのまま保存する、JSONコレクション表TOKYO_KOSODATESHIENSEIDOを作成します。
create json collection table tokyo_kosodateshienseido with etag;
APEXのSQLコマンドから実行します。
東京都オープンデータカタログサイトの東京都こどもDX_子育て支援制度レジストリのページを開き、JSON形式のデータのURLを確認します。本記事では2025年8月20日時点のデータを参照しています。
SQLコマンドで以下のコードを実行し、JSONデータのダウンロードとJSONコレクション表への投入を実施します。
実行結果には1行が挿入されました。と表示されています。PL/SQLブロックを実行したときは、このように表示されます。表に挿入された行数ではありません。
空のAPEXアプリケーションを作成します。名前は東京都子育て支援制度とします。
APEXアプリケーションが作成されます。JSON Regionプラグインの導入から始めます。
APEX Worldのサイトを開き、Plug-insのタブを選択します。Plug-in typeにRegionを選択し、Search KeywordにJSONを入れてプラグインを検索します。
JSON-Region 0.9.8.0(バージョンは変わるかもしれません)が見つかるので、それを開きます。
Downloadをクリックし、プラグインやサンプル・アプリケーションを含むZIPファイルをダウンロードします。
2025年11月20日時点では、simonuwe-oracle-apex-json-region-rel-0.9.8.0-0-g67958cf.zipというファイル名で、ファイルがダウンロードされました。
このファイルを解凍しておきます。
APEXに戻り、共有コンポーネントのプラグインを開きます。
インポートをクリックします。
インポートするファイルとして、ダウンロードしたZIPファイルに含まれているplug-in/region_type_plugin_json_region_uwesimon_selfhost_e.sqlを選択します。ファイル・タイプはプラグインです。
次へ進みます。
ファイルのインポートが完了しました。次へ進みます。
プラグインをインストールします。
変更の適用をクリックします。
コンポーネント設定のページに移ります。
ページの作成をクリックします。
対話モード・レポートを選択します。
データ・ソースのソース・タイプにSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。
select json_value(data,'$._id') "_id", data from tokyo_kosodateshienseido
ORA-54059: 不変列("WKSP_APEXDEV"."TOKYO_KOSODATESHIENSEIDO"."RESID")は別の値に更新できません
次へ進みます。
主キー列に_id (Varchar2)を選択します。MongoDBと互換性を持つためだと思われますが、JSONコレクション表は属性"_id"として、一意キーが設定されています。
ページの作成をクリックします。
対話モード・レポートとフォームのページが作成されます。
APEXアプリケーションを実行します。
対話モード・レポートにはJSONがそのまま表示されています。任意の行の編集アイコンをクリックし、ドロワーを開きます。
ドロワーが開いたら、JSONは変更せずに、変更の適用をクリックします。
以下のエラーが発生します。これは、更新するJSONに"_id"属性が含まれていることが原因です。
ORA-54059: 不変列("WKSP_APEXDEV"."TOKYO_KOSODATESHIENSEIDO"."RESID")は別の値に更新できません
JSONコレクション表を操作するプロセス・フォーム支援制度の前に、プロセスRemove _idを作成します。タイプはコードを実行です。
ソースのPL/SQLコードに以下を記述し、受信したデータより"_id"属性を削除します。
select json_transform(:P3_DATA, remove '$._id') into :P3_DATA;
サーバー側の条件のボタン押下時にSAVEを指定します。
プロセスRemove _idを追加することで先ほどのエラーは発生しなくなり、フォームでJSONデータを更新できるようになります。
これから、ページ・アイテムP3_DATAに含まれるJSONデータからフォームを生成します。
ページ・アイテムP3_DATAの下にリージョンを作成します。
識別の名前はJSON Region、タイプに先ほど導入したプラグインであるJson-Regionを選択します。
設定のJSON-itemにJSONデータが含まれるページ・アイテムP3_DATAを選択します。JSONスキーマのSourceとして、Generate Schemaを選択します。この設定では、JSONスキーマはP3_DATAに保存されているデータから生成されます。
その他は用途によって変更します。以下ではHide JSON-itemをオンにしているので、JSONデータを保持しているP3_DATAが非表示に変わります。
先ほどと同様の手順でフォームを開くと、JSONデータの代わりに自動的に生成されたフォームが開きます。
このままでは見辛いので、JSONスキーマを定義して表示されるページ・アイテムを限定します。
設定のSourceをStaticに変更し、Static Schemaに以下を記述します。
Column Widthに12を指定します。Universal Themeは横幅を12分割して配置を決めています。列幅に12を設定すると、1列すべてを1つのページ・アイテムが占有します。つまり、1列に1つだけページ・アイテムが配置されます。
編集も可能です。変更の適用をクリックします。
フォームのデータに一切変更を加えていないくても、JSON Regionの設定にあるKeep additional attributesやRemove NULLS from JSONといった設定により、属性が削除されることがあります。また、JSON Regionが更新するのはページ・アイテムP3_DATAに読み込まれたJSONデータであり、データベースはP3_DATAの値で更新されます。JSON_TRANSFORMを呼び出して更新する場合と異なり、JSONデータは全体が更新されます。
本記事のテーマであるJSON Regionの組み込みは以上で完了です。
対話モード・レポートの表示がJSONそのままではいけないので、属性ごとに列として表示されるように変更します。
JSONコレクション表からJSONデータガイドを生成し、それを元にビューを作成します。
SQLコマンドで以下のスクリプトを実行し、ビューTOKYO_KOSODATESHIENSEIDO_Vを作成します。
対話モード・レポートのソースのSQL問い合わせを、作成したビューTOKYO_KOSODATESHIENSEIDO_Vを参照するように変更します。
select * from tokyo_kosodateshienseido_v
対話モード・レポートで新しく認識された列は、デフォルトでは表示されません。
アクション・メニューの列を開き、新しく認識された列をレポートに表示します。
編集アイコンをクリックすると、ORA-1403が発生します。
これは対話モード・レポートでは主キーの値(属性"_id"の値)が大文字なのに対して(JSONデータガイドを元に作成したビューが列"_id"を大文字で返す)、フォームでは小文字で扱うためです。
フォームが"_id”の値を小文字で受け取るように、プロセス初期化フォーム支援制度の前にP3__IDの値を小文字に変換するプロセスを作成します。
識別の名前はLower P3__IDとします。ソースのPL/SQLコードに以下を記述します。
:P3__ID := lower(:P3__ID);
サーバー側の条件のタイプにアイテムはNULLではないを選択し、アイテムとしてP3__IDを設定します。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-json-region-plugin.zip
JSON RegionのプラグインとしてダウンローしたZIPには、プラグインの他にもサンプル・プログラムなどが含まれています。便利なプラグインなので、使い方を学ぶことをお勧めします。
今回の記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完



































