はじめに
Oracle Databaseの自然言語によるクエリ実行(SELECT AI)機能を試してみたい。毎回コマンドを記入するのではなく、Webアプリケーションで簡単に試したい。といった場合にAutonomous AI DatabaseのOracle APEXを使ったアプリケーションを少ない手順で作成してみました。
SELECT AI機能は、dbms_cloud_ai.generate プロシージャで呼び出しています。
この記事で完成するアプリケーション
- AIプロファイルを選択
- 問い合わせを入力
- SELECT AIで生成されたSQLの確認
- SELECT AIで生成されたSQLの実行結果の確認
- 検索結果はOracle APEXのクラシックレポート形式で表示
実行例
Oracle APEX SELECT AI アプリケーション 作成手順
前提条件
OCIチュートリアルなどを参考にAutonomous AI Database上にSELECT AIが実行できる環境の準備します。
- Oracle Autonomous AI Databaseインスタンスの作成
- Oracle APEXワークスペースの作成
- APEXワークスペースのDBユーザーに
DBMS_CLOUD_AIの実行権限を付与 - APEXワークスペースのDBユーザーがアクセスできる表・データの準備
- クレデンシャル情報の作成
- AIプロファイルの作成
Step 1: Oracle APEXアプリケーション作成
Step 2: リージョンの作成(入力・SQL表示)
ページ 「1- ホーム」の編集します。
Page 1のページ・デザイナーで以下の2リージョンを作成します。
| リージョン | タイプ | タイトル |
|---|---|---|
| Region 1 | 静的コンテンツ | 入力 |
| Region 2 | 静的コンテンツ | 生成されたSQL |
Step 3: ページ・アイテムの作成
ページ・アイテムを3つ作成します。
P1_AI_PROFILE(Region 1内)
| 属性 | 値 |
|---|---|
| タイプ | 選択リスト |
| ラベル | AI プロファイル |
| LOVタイプ | SQL クエリ |
| NULL表示値 | - プロファイルを選択 - |
LOV SQL:
SELECT profile_name d, profile_name r
FROM user_cloud_ai_profiles
ORDER BY profile_name
P1_NATURAL_LANGUAGE(Region 1内)
| 属性 | 値 |
|---|---|
| タイプ | テキスト領域 |
| ラベル | 自然言語で質問を入力 |
| 高さ(行数) | 4 |
P1_GENERATED_SQL(Region 2内)
| 属性 | 値 |
|---|---|
| タイプ | テキスト領域 |
| ラベル | 生成された SQL |
| 高さ(行数) | 6 |
| ストレージ | セッションごと(永続) |
| 読取り専用 | 常時 |
Step 4: ボタンの作成
「Region 1」内に「生成」ボタンと「クリア」ボタンを作成します。
GENERATE ボタン(Region 1内)
| 属性 | 値 |
|---|---|
| ラベル | 生成 |
| ボタン名 | GENERATE |
| アクション | ページの送信 |
| ホット | はい |
CLEAR ボタン(Region 1内)
| 属性 | 値 |
|---|---|
| ラベル | クリア |
| ボタン名 | CLEAR |
| アクション | ページの送信 |
Step 5: Region 3 の作成と Classic Report(実行結果)の設定
実行結果を表示するリージョンを作成します。
Region 3 の作成
| 属性 | 値 |
|---|---|
| タイプ | Classic Report |
| タイトル | 実行結果 |
| ソース・タイプ | Function Body Returning SQL Query |
SQL問合せを返すPL/SQLファンクション本体:
BEGIN
IF :P1_GENERATED_SQL IS NULL OR TRIM(:P1_GENERATED_SQL) IS NULL THEN
RETURN 'SELECT ''SQLが生成されていません'' AS "ステータス" FROM DUAL';
END IF;
DECLARE
l_sql VARCHAR2(32767) := TRIM(:P1_GENERATED_SQL);
BEGIN
-- AIがマークダウン形式(```sql ... ```)で返した場合に除去
IF l_sql LIKE '```%' THEN
l_sql := REGEXP_REPLACE(l_sql, '^```sql\s*', '', 1, 1, 'i');
l_sql := REGEXP_REPLACE(l_sql, '^```\s*', '', 1, 1, 'i');
l_sql := REGEXP_REPLACE(l_sql, '\s*```$', '', 1, 1, 'i');
l_sql := TRIM(l_sql);
END IF;
IF UPPER(l_sql) NOT LIKE 'SELECT%' THEN
RETURN 'SELECT ''有効なSELECT文が生成されませんでした'' AS "ステータス" FROM DUAL';
END IF;
RETURN l_sql;
END;
END;
汎用列(Generic Columns)の設定
SELECT AIでは実行のたびにSQLの列構成が変わるため、列定義を固定せず汎用列を使用します。
- 「汎用列名の使用」 を選択
- 列数に
20を入力して確定
ポイント: 汎用列(COL001〜COL020)を使うことで、生成SQLが返す列数・列名が変わっても
ORA-00904が発生しなくなります。列数に指定した数を超える列は表示されません。
属性タブ:
| 属性 | 値 |
|---|---|
| レポートの行数 | 50(必要に応じて調整) |
Step 6: ページ・プロセスの設定
ボタンをクリックした際の動作の定義として、プロセスを使用します。
この記事では動的アクションではなく「プロセス」を使用します。プロセスはページ送信(Submit)のサーバー側処理として実行されるため、ボタンクリック → ページ送信 → サーバー処理 → ページ再描画 という一連の流れで動作します。
左ナビゲーション(またはページ・デザイナー下部の「プロセス」タブ)→ 「作成」 を選択しまする。

Process 1: 「SQL生成」 プロセスの作成
「識別」セクション:
| 属性 | 値 |
|---|---|
| 名前 | SQL生成 |
| タイプ | コードを実行 |
| 言語 | PL/SQL |
PL/SQL コード:
DECLARE
l_sql CLOB;
BEGIN
-- 入力チェック:AIプロファイル
IF :P1_AI_PROFILE IS NULL THEN
apex_error.add_error(
p_message => 'AIプロファイルを選択してください。',
p_display_location => apex_error.c_inline_in_notification
);
RETURN;
END IF;
-- 入力チェック:自然言語
IF :P1_NATURAL_LANGUAGE IS NULL THEN
apex_error.add_error(
p_message => '質問を入力してください。',
p_display_location => apex_error.c_inline_in_notification
);
RETURN;
END IF;
-- SQLを生成
l_sql := dbms_cloud_ai.generate(
action => 'showsql',
profile_name => :P1_AI_PROFILE,
prompt => :P1_NATURAL_LANGUAGE
);
:P1_GENERATED_SQL := l_sql;
EXCEPTION
WHEN OTHERS THEN
apex_error.add_error(
p_message => 'SQL生成エラー: ' || SQLERRM,
p_display_location => apex_error.c_inline_in_notification
);
END;
「サーバー側の条件」セクション(プロパティ・パネルを下にスクロール):
| 属性 | 値 |
|---|---|
| ボタン押下時 | GENERATE |
Process 2: 「クリア」 プロセスの作成
「識別」セクション:
| 属性 | 値 |
|---|---|
| 名前 | 画面クリア |
| タイプ | コードを実行 |
| 言語 | PL/SQL |
PL/SQL コード:
BEGIN
:P1_AI_PROFILE := NULL;
:P1_NATURAL_LANGUAGE := NULL;
:P1_GENERATED_SQL := NULL;
END;
「サーバー側の条件」セクション:
| 属性 | 値 |
|---|---|
| ボタン押下時 | CLEAR |
動作確認
- アプリケーションの実行
- AIプロファイルを選択
- 自然言語で質問を入力
例: "従業員数が100人以上の部門を売上順に表示して" - [生成] ボタンをクリック
→ dbms_cloud_ai.generate (showsql) を実行
→ P1_GENERATED_SQL にSQLが格納される- [生成されたSQL] に SELECT文が表示される
- [実行結果] にクエリ結果が表示される
- [クリア] ボタンで全項目をリセット
おわりに
SQL生成の確認に特化したシンプルなOracle APEXですので、SELECT AIの機能確認用途で使用します。



























