- openai_tools.sql - 表OPENAI_TOOLSを作成するDDL
- utl_openai_chat_api.pkh - パッケージUTL_OPENAI_CHAT_APIの定義部
- utl_openai_chat_api.pkb - パッケージUTL_OPENAI_CHAT_APIの本体
- get_schema - データベースのスキーマ情報を返すファンクションget_schemaを作成
- run_sql - 受け取ったSELECT文を実行し、JSONでレスポンスを返すファンクションrun_sqlを作成
- tool definitions - 表OPENAI_TOOLSに登録するファンクションget_schemaとrun_sqlのツール定義
あなたは日本語を話すデータ・アナリストです。最初に以下のメッセージを与えました。(GIF動画とは結果が異なります)
実行するSELECT文はOracle Database向けに生成してください。
参照するスキーマは常にWKSP_APEXDEVです。
日本の人口を教えて。
日本の人口は126,860,301人です(データソース: WKSP_APEXDEV.EBA_COUNTRIES テーブル)。
この数値は2023年時点の推定値となります。より詳細な統計や最新データが必要な場合は、別途調整を検討してください。
アジアで最も人口の少ない国は?
アジアで最も人口の少ない国はブルネイ・ダルサラーム(Brunei Darussalam)です。人口は433,285人(データソース: WKSP_APEXDEV.EBA_COUNTRIES_V テーブル)です。
この結果は、2023年時点の推定値に基づいています。より詳細な統計や最新データが必要な場合は、別の基準(例: 経済協力開発機構のデータなど)を検討することをお勧めします。
アメリカで一番人口の多い国は?
アメリカ大陸(North America)で人口最多の国はアメリカ合衆国(United States of America)です。人口は3億2,906万4,917人(データソース: WKSP_APEXDEV.EBA_COUNTRIES_V テーブル)です。
ただし、データベースの構造上、「REGION = 'North America'」の条件で検索した際にはデータが取得できませんでした。このため、明示的に「United States of America」を指定して確認しました。もし大陸全体のランキングが必要な場合は、データの正確性を再検証する必要があります。
リージョンは表EBA_COUNTRY_REGIONSに定義されています。この情報を覚えてください。
リージョンの定義が表
EBA_COUNTRY_REGIONS
に保存されていることを認識しました。この情報から、リージョン名(例: 'Asia'、'North America')はEBA_COUNTRIES_V
テーブルのREGION
カラムに直接記録されている可能性がありますが、正確なマッピングはEBA_COUNTRY_REGIONS
のID
とNAME
を参照する必要があります。今後のクエリでリージョンを扱う際は、必要に応じて
EBA_COUNTRIES_V
とEBA_COUNTRY_REGIONS
を結合するクエリを構築することで、より正確な結果を得られるようにします。
では、アメリカ大陸全体で二番の人口を持つ国を教えて。
アメリカ大陸(Americas)で人口が2番目に多い国はブラジル(Brazil)です。人口は2億1,104万9,527人(データソース: WKSP_APEXDEV.EBA_COUNTRIES_V テーブル)です。
補足
- リージョンの定義:データベース上の
REGION
カラムでは、「Americas」(アメリカ大陸)が1つのリージョンとして扱われており、北米と南米の国々が含まれます。- 順位:上位2国のリストは以下の通りです。
- United States of America(3億2,906万4,917人)
- Brazil(2億1,104万9,527人)
この結果は、リージョン「America」に属する国の人口に基づいています。
run_sqlは以下のレスポンスを返します。
create or replace function get_schema( | |
p_args in clob | |
) | |
return clob | |
as | |
l_owner_object json_object_t; | |
l_owner varchar2(128); | |
l_schema clob; | |
begin | |
l_owner_object := json_object_t(p_args); | |
l_owner := l_owner_object.get_string('schema'); | |
if l_owner is null then | |
/* set default owner */ | |
l_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER'); | |
else | |
l_owner := upper(l_owner); | |
end if; | |
select json_arrayagg(objects) into l_schema from ( | |
select json_object(table_name, columns) objects from ( | |
select table_name, json_arrayagg(json_object(column_name, data_type)) columns | |
from all_tab_columns where owner = l_owner group by table_name | |
) | |
); | |
return l_schema; | |
end get_schema; | |
/ |
create or replace function run_sql( | |
p_args in clob | |
) | |
return clob | |
as | |
C_STMT constant varchar2(4000) := q'~select json_arrayagg(object) from ( | |
select json_object(*) object from ( | |
%s | |
) | |
)~'; | |
l_stmt clob; | |
l_result clob; | |
l_args json_object_t; | |
l_sql varchar2(32767); | |
begin | |
l_args := json_object_t(p_args); | |
l_sql := trim(l_args.get_string('sql')); | |
/* remove trailing ; from the sql */ | |
l_sql := rtrim(l_sql, ';'); | |
l_stmt := apex_string.format(C_STMT, l_sql); | |
apex_debug.info('sql: %s', l_stmt); | |
execute immediate l_stmt into l_result; | |
if l_result is null then | |
l_result := '{ "result": "no data found, please consider to change the condition supplied with this select statment." }'; | |
end if; | |
return l_result; | |
end run_sql; | |
/ |
drop function run_sql;
drop function get_schema;
drop package utl_openai_chat_api;
drop table openai_tools;