2026年9月11日金曜日
OpenAI CodexとLive音声モードのチャットで駅別乗降客数マップを表示するアプリを作成する
2026年9月10日木曜日
国土地理院が公開している自然災害伝承碑データより伝承碑の位置を表示するAPEXアプリをCodexで作成する
https://www.gsi.go.jp/bousaichiri/denshouhi_datainfo.html
このオープン・データのGeoJSONファイルより、OpenAI Codexを使って伝承碑が存在する場所や伝承碑の説明を表示するAPEXアプリケーションを作成します。一覧する伝承碑を絞り込むために、ファセット検索も組み込みます。
Create a dashboard page for order operations with KPI cards, a monthly revenue chart, and an interactive report. Use existing schema evidence and ask before guessing missing columns.
国土地理院 - 自然災害伝承碑データの提供についてのページにアクセスし、ページの一番下にある免責事項に同意するをクリックすると、データのダウンロード・ページに移ります。
ファイルは000250767.zipとしてダウンロードされます。このファイルを作業フォルダに配置し解凍します。解凍するとフォルダ20260827_GeoJSONが作成され、その下に20260827.geojsonとして、GeoJSON形式のデータファイルが作成されます。
ndmm_monuments % ls -l 20260827_GeoJSON
total 4760
-rw-rw-rw-@ 1 ******** staff 6729 12月 23 2021 0_はじめにお読みください(国土地理院コンテンツ利用規約).txt
-rw-rw-rw-@ 1 ******** staff 1229 1月 15 2024 1_データについて_geojson.txt
-rw-rw-rw-@ 1 ******** staff 2422479 8月 31 07:35 20260827.geojson
ndmm_monuments %
apm install oracle/skills/db --target codex
APEXlangのスキルはoracle/skills/apexに含まれています。
ndmm_monuments % apm install oracle/skills/apex --target codex
[*] Validating 1 package...
[+] oracle/skills/apex
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[>] Resolving skills-apex...
[i] Targets: codex (source: --target flag)
[+] github.com/oracle/skills/apex #default @fcbc9430
|-- Skill integrated -> .agents/skills/
[!] 1 dependency unpinned: oracle/skills -- add #tag or #sha to prevent drift
[*] Installed 1 APM dependency in 6.4s.
ndmm_monuments % apm install oracle/skills/db --target codex
[*] Validating 1 package...
[+] oracle/skills/db
[*] Updated apm.yml with 1 new package(s)
[>] Installing 1 new package...
[>] Resolving skills-db...
[i] Targets: codex (source: --target flag)
[+] github.com/oracle/skills/db #default @fcbc9430
|-- Skill integrated -> .agents/skills/
[!] 1 dependency unpinned: oracle/skills -- add #tag or #sha to prevent drift
[*] Installed 1 APM dependency in 6.7s.
ndmm_monuments % apm deps list
APM Dependencies (Project)
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┓
┃ Package ┃ Version ┃ Source ┃ Prompts ┃ Instructions ┃ Agents ┃ Skills ┃ Hooks ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━┩
│ oracle/skills/apex │ unknown │ github │ - │ - │ - │ 1 │ - │
│ oracle/skills/db │ unknown │ github │ - │ - │ - │ 1 │ - │
│ oracle/skills/apex/apexlang │ unknown │ orphaned │ - │ - │ - │ 1 │ - │
└─────────────────────────────┴─────────┴──────────┴─────────┴──────────────┴────────┴────────┴───────┘
[!] 1 orphaned package(s) found (not in resolved dependency graph):
[!] - oracle/skills/apex/apexlang
[i] Run 'apm prune' to remove orphaned packages
ndmm_monuments %
国土地理院からダウンロードした日本の自然災害伝承碑のGeoJSONのデータを、Oracle DatabaseにロードしてOracle APEXのマップ上に表示するアプリケーションを作成します。
データベースに接続するために使用するSQLclの実行ファイルは/opt/homebrew/bin/sqlclです。
接続先となるデータベースは、SQLclの保存済みの接続local-26ai-apexdevを使って接続します。
APEXアプリケーションを作成するワークスペースはAPEXDEVです。
保存済みの接続local-26ai-apexdevでは、スキーマAPEXDEVに接続されます。これはAPEXのワークスペースAPEXDEVのデフォルト・パーシング・スキーマです。
表などのデータベース・オブジェクトはスキーマAPEXDEV以下に作成します。
データを保存する表は、これから伝える条件で作成してください。
自然災害伝承碑のデータを利用するにあたって、公開されている以下のファイルの内容に配慮してください。
20260827_GeoJSON/0_はじめにお読みください(国土地理院コンテンツ利用規約).txt
20260827_GeoJSON/1_データについて_geojson.txt
ソースとなる自然災害伝承データは、 ファイル20260827_GeoJSON/20260827.geojsonに保存されています。
このGeoJSONファイルをデータベースの表にロードしてください。
作成する表はNDMM_MONUMENTSとします。
GeoJSONの1つのFeatureを1行として保存し、proppertiesはそれぞれ列として定義します。
Featureには、"ID", 碑名", "建立年","所在地", "災害名", "災害種別", "伝承内容", "公開日", "修正等公開日", "制限事項" があります。
これらのFeatureを表の列として定義します。この他に自然災害伝承碑の座標を列として定義します。
表の列として定義するにあたり、列名は英語にしてください。データ型はファイルから実際のデータ型を参照して適切なデータ型を選んでください。
geometryについては、SDO_GEOMETRY型の列として保存してください。
データベースに表を作成したら、ファイル20260827_GeoJSON/20260827.geojsonの内容を作成した表NDMM_MONUMENTSにロードしてください。
データをすべて表NDMM_MONUMENTSにロードした後、geometryを保存した列にOracle Spatialの空間索引を作成してください。
これから、新規に作成するAPEXアプリケーションの要件を説明します。
新規に作成するAPEXアプリケーションの名前は「自然災害伝承碑マップ」とします。
アプリケーション別名はndmm_monumentsとします。
上記の表NDMM_MONUMENTSをデータ・ソースとしたファセット検索付きのマップ・リージョンを持つページを作成してください。
作成したページには、国土地理院コンテンツ利用規約に沿って、出典と行なった加工と編集について表示してください。
マップ・リージョンの他に、マップ上に表示されている自然災害伝承碑の行を一覧するクラシック・レポートのリージョンを作成してください。
災害種別と災害名をファセットとしてください。
マップ上にそれぞれの自然災害伝承碑を配置してください。
マップ上のポイントをクリックして開く情報ボックスに、表NDMM_MOMENTSのgeometryを除く列を表示するようにしてください。
「地図上に表示されている伝承碑はクラシック・レポートに反映されていますが、検索条件を表示するファセットには反映されていません。クラシック・レポートと同様にファセットにも反映するようにしてください。」
「地図上の伝承碑のポイントをクリックしたときに表示される情報ボックスですが、地図の領域からはみ出てすべての情報が表示されません。横幅を2倍に広げて、縦方向の長さは半分にしてください。」
2026年7月3日金曜日
APEX 26.1のAIエージェントのレスポンス形式にJSONオブジェクトを指定する
Select the type of response that should be generated by the AI provider.
- Text: Plain text
- JSON Object: A JSON object that will adhere to a specific JSON schema. Note that AI Agents which return a JSON object can currently only be referenced by the apex_ai.generate PL/SQL API.
The JSON Schema based on which the JSON object is generated.
Note that the referenced AI provider might not support the full scope of the JSON Schema specification. Consult the documentation of the individual AI providers for more information.
Starting with database 26ai, the incoming JSON object is automatically validated against the JSON Schema. For earlier database versions, Oracle recommends validating the JSON object programatically before further processing.
select 'label' as label, null as polygon from dual where 1<>1
begin
:P1_POLYGON := apex_ai.generate(
p_agent_static_id => 'get-polygon-from-a-prompt'
,p_prompt => :P1_PROMPT
);
end;
今回作成したAPEXアプリケーションの説明は以上です。
2026年7月1日水曜日
APEX 26.1のAIエージェントでデータベースを操作する
先の記事「APEX 26.1のAIエージェントでHTMLキャンバスに描画した車を動かす」にて、APEX 26.1のAIエージェントを使ってブラウザを操作するサンプル・アプリを作ってみました。本記事では、AIエージェントを使ってデータベースを操作するエージェントを作ってみます。
以下、プロンプトで従業員の給与を更新します。データ・ソースとしてはサンプル・データセットのEMP/DEPTの含まれる表EMPを使用します。
作成するAPEXアプリケーションは以下のように動作します。LLMにmacOSのLM Studioで実行しているgoogle/gemma-4-31b-qatを使用しているため、処理に時間がかかっています(動作も若干安定しないです)。
ページ・アイテムP1_ENAMEにKINGが選択されているときに限り、AIエージェントのツールにupdate_salaryが含まれるようにしています。KING以外のときは「更新できません。」と返されます。
declare
l_text clob;
begin
l_text := apex_db_dictionary.get_table_info(
p_table_names => 'EMP, DEPT' );
return l_text;
end;
declare
l_empno emp.empno%type;
l_response clob;
begin
select empno into l_empno from emp where ename = :ENAME;
l_response := apex_string.format('empno %s found for ename %s', l_empno, :ENAME);
apex_ai.set_tool_result( p_result => l_response );
exception
when no_data_found then
l_response := apex_string.format('No empno found for %s, perhapse the employee with the name does not exist.', :EMPNO);
apex_ai.set_tool_result( p_result => l_response );
end;
declare
begin
update emp set sal = :SAL where empno = :EMPNO;
end;




























