はじめに
この記事は、Oracle Cloud(OCI) で提供されている Oracle Autonomous AI Database(ADB) の Select AI 機能を使う手順をまとめています.
Select AI は、自然言語で質問するだけで、自動的にSQLクエリを生成・実行し、Oracle Database 内のデータから回答を取得できるAI機能です.
Select AI が利用できるのは、OCI 上の ADB あるいは、ExaDB-D/ExaDB-C@C 上の ADB になります.
今回は、手元の PC[macbook] からインターネット経由で OCI 上の ADB に接続し、sqlplus から Select AI の SQL を投げるまでの一連の流れを整理しました.
対象者
この記事は下記のような人を対象にしています.
- Oracle DB は、オンプレミスで使っている.
- Oracle Cloud の基本操作は、知っている.
- Oracle DB を操作するときは、sqlplus を使いたい.
- とりあえず Select AI を試してみたい.
目次
- 事前準備(ADBの作成から接続まで)
- ADB の作成
- PC(macbook) への Oracle Client の install
- sqlplus からの ADB への接続
- Select AI を利用するために OCI 生成 AI の API キーを取得
- Select AI を使用するユーザを作成
- サンプルのテーブルを作成し、データをロード
- OCI 生成 AI を利用するためにクレデンシャルとプロファイルの作成
- Select AI を実行
- 余談
- 参考記事・ドキュメント
事前準備(ADBの作成から接続まで)
以下の 3 つは、別の記事にまとめているのでそちらを参照ください。
https://qiita.com/x_ashi/items/1059a3892587780c76f1
- ADB の作成
- PC(macbook) への Oracle Client の install
- sqlplus からの ADB への接続
以下の説明では、上記の記事で作成した ADB を使用します.
Select AI を利用するために OCI 生成 AI の API キーを取得
duke@mac Downloads %
duke@mac Downloads % ls -lt *pem
-rw-r--r--@ 1 duke staff 1715 4月 24 20:39 duke.oracle@mac.com-2026-04-24T11_39_53.558Z.pem
duke@mac Downloads %
duke@mac Downloads % cat duke.oracle@mac.com-2026-04-24T11_39_53.558Z.pem
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDA1dlqfNZeuy6p
xxx
xxx
xxx
Sdkngc0+7lNsgJho0xCJLjU=
-----END PRIVATE KEY-----
OCI_API_KEY%
duke@mac Downloads %
- "追加"ボタンを押して、API キー・ペアを保存する.
- "構成ファイルのプレビュー"画面を表示し、その内容をコピーしてファイルに保存しておく
[DEFAULT]
user=ocid1.user.ocxxxx.wubhya
fingerprint=4f:5a:09:xxxxxxxxxx9a:9e
tenancy=ocid1.tenancy.oc1..aaxxxxxxxn4q
region=ap-tokyo-1
key_file=<path to your private keyfile> # TODO
Select AI を使用するユーザを作成
先の ADB に対し admin ユーザで以下を実行する.
- ai_user というユーザを作成し、ADB で事前定義されているロール DWROLE を設定.
- Select AI を使用するために必要となる DBMS_CLOUD_AI パッケージの実行権限を付与.
- 後々、AI Agent を使用するために必要となる DBMS_CLOUD_AI_AGENT パッケージの実行権限を付与.
duke@mac ~ %
duke@mac ~ % sqlplus admin/Welcome12345#@aidb1_high
SQL>
SQL> GRANT DWROLE, UNLIMITED TABLESPACE TO ai_user IDENTIFIED BY Welcome12345#;
権限付与が成功しました。
SQL> GRANT EXECUTE ON DBMS_CLOUD_AI TO ai_user;
権限付与が成功しました。
SQL> GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ai_user;
権限付与が成功しました。
SQL>
SQL>
duke@mac %
サンプルのテーブルを作成し、データをロード
以下のサンプルデータを ai_user の schema にロードする、
OCI console の DB actions を使用すると、xls ファイルから直接データをロードできるので今回は、この機能を利用する.
-
アメリカの高校の情報が入っている highsolls.xls を手元の PC にダウンロードする
https://github.com/marina-fujimoto/oci-tutorial

-
テーブル名を定義するために、鉛筆マークをクリックし、表名を "HIGHSCHOOLS" に変更する.(デフォルトでは、シート1 という名前になっている)


-
以下 admin ユーザで highschools テーブルが作成されていることを確認する.
SQL> desc ai_user.highschools;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
BOROUGH VARCHAR2(64)
SCHOOL_NAME VARCHAR2(256)
NEIGHBORHOOD VARCHAR2(64)
INTEREST VARCHAR2(64)
METHOD VARCHAR2(64)
TOTAL_STUDENTS NUMBER
GRADUATION_RATE NUMBER
ATTENDANCE_RATE NUMBER
COLLEGE_CAREER_RATE NUMBER
SAFE NUMBER
SEATS NUMBER
APPLICANTS NUMBER
DBN VARCHAR2(64)
LATITUDE NUMBER
LONGITUDE NUMBER
LANGUAGE_CLASSES VARCHAR2(4000)
ADVANCED_PLACEMENT_COURSES VARCHAR2(4000)
SCHOOL_SPORTS VARCHAR2(4000)
FAQ_URL VARCHAR2(64)
OVERVIEW_PARAGRAPH VARCHAR2(4000)
ACADEMIC_OPPORTUNITIES VARCHAR2(4000)
ADVANCEDPLACEMENT_COURSES VARCHAR2(4000)
DIADETAILS VARCHAR2(4000)
EXTRACURRICULAR_ACTIVITIES VARCHAR2(4000)
PSAL_SPORTS_BOYS VARCHAR2(4000)
PSAL_SPORTS_GIRLS VARCHAR2(4000)
ADDTL_INFO1 VARCHAR2(4000)
SQL>
SQL> select count(*) from ai_user.highschools;
COUNT(*)
----------
427
SQL>
OCI 生成 AI を利用するためにクレデンシャルとプロファイルを作成
- OCI 生成 AI にアクセスするためのクレデンシャルを定義する.
先に生成した API キー情報を使い、DBMS_CLOUD のプロシージャによりクレデンシャルを作成する.- credential_name:任意(今回 OCI_CRED としています)
- user_ocid:APIキーの構成ファイルを参照し、ユーザーのOCIDを入力
- tenancy_ocid:APIキーの構成ファイルを参照し、使用しているテナンシーのOCIDを入力
- private_key:APIキーで取得した秘密キーの内容をコピー&ペースト
- fingerprint:APIキーの構成ファイルを参照し、フィンガープリントを入力
duke@mac ~ % sqlplus ai_user/Welcome12345#@aidb1_high
SQL>
SQL>
SQL> BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OCI_CRED',
user_ocid => 'ocid1.user.ocxxxxxxxwubhya',
tenancy_ocid => 'ocid1.tenancy.oc1..aaxxxxxxxn4q',
private_key => '-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDA1dlqfNZeuy6p
...
...
Sdkngc0+7lNsgJho0xCJLjU=
-----END PRIVATE KEY-----',
fingerprint => '4f:5a:09:xxxxxxxxxx9a:9e'
);
END;
/
PL/SQLプロシージャが正常に完了しました。
SQL>
-
利用する AI モデルとその配置場所、および、対象となるスキーマ・オブジェクトの情報を DBMS_CLOUD_AI のプロシージャによりプロファイルとして作成する.
- プロファイル名:SELECT_AI_PROFILE(任意)
- provider:oci(今回は、OCI生成AIサービスをAIプロバイダーとして使用)
- credential_name:OCI_CRED(先に作成したクレデンシャル名を指定)
- model:xai.grok-code-fast-1(grok AI モデルを指定)
- region: us-chicago-1(AI モデルが提供されているリージョン名を指定)
- object_list:(このプロファイルで使用するスキーマ・オブジェクトの所有者 ai_user とオブジェクト名 HIGHSCHOOLS を指定)
どこのリージョンでどの AIモデルが使えるかは、以下を参照してください.
https://docs.oracle.com/en-us/iaas/Content/generative-ai/model-endpoint-regions.htm
duke@mac ~ % sqlplus ai_user/Welcome12345#@aidb1_high
SQL>
SQL> BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'SELECT_AI_PROFILE',
'{
"provider": "oci",
"credential_name": "OCI_CRED",
"model":"xai.grok-code-fast-1",
"region": "us-chicago-1",
"object_list": [
{"owner": "ai_user", "name": "highschools"}
]
}'
);
END;
/
PL/SQLプロシージャが正常に完了しました。
SQL>
SQL>
Select AI を実行
- ユーザ ai_user で Select AI を実行します.
- 先に指定したプロファイル SELECT_AI_PROFILE を DBMS_CLOUD_AI のプロシージャからセットします.
- "select AI" というコマンドの後に調べたい内容を日本語で明記します.
- "select ai showsql" というコマンドを使い、その時に生成・実行された sql の内容を確認します.
duke@mac ~ % sqlplus ai_user/Welcome12345#@aidb1_high
SQL>
SQL> select ai 高校の数は;
select ai 高校の数は
*
行1でエラーが発生しました。:
ORA-00904: "AI": 無効な識別子です。 ヘルプ:
https://docs.oracle.com/error-help/db/ora-00904/
SQL>
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('SELECT_AI_PROFILE');
PL/SQLプロシージャが正常に完了しました。
SQL>
SQL> select ai 高校の数は;
Number of High Schools
----------------------
427
SQL>
SQL> select ai showsql 高校の数は;
RESPONSE
---------------------------------------------------------------------------
SELECT COUNT(*) AS "Number of High Schools"
FROM "AI_USER"."HIGHSCHOOLS" HS
SQL>
次は、"ブルックリン"にある高校の数を確認してみます.
ただ、結果は、0件になっています.
showsql を見ると、日本語の"ブルックリン"で尋ねているのに SQL は英語の"Brooklyn" に置き換えて検索しています.
highschools テーブルの borough 列は、日本語の"ブルックリン"になっているので、ヒットしなかったようです.
そこで地域の名前は日本語であることの説明を追記して、質問を投げてみると、日本語のままで検索してくれました.
SQL> select ai ブルックリンにある高校の数を教えて ;
Number of High Schools
----------------------
0
SQL>
SQL> select ai showsql ブルックリンにある高校の数を教えて ;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS "Number of High Schools"
FROM "AI_USER"."HIGHSCHOOLS" HS
WHERE UPPER(HS."BOROUGH") = UPPER('Brooklyn')
SQL>
SQL> select ai showsql ブルックリンにある高校の数を教えて,地域名は日本語でテーブルに入っています;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS "HIGH_SCHOOL_COUNT"
FROM "AI_USER"."HIGHSCHOOLS" HS
WHERE UPPER(HS."BOROUGH") = UPPER('ブルックリン')
SQL> select ai ブルックリンにある高校の数を教えて,地域名は日本語でテーブルに入っています;
HIGH_SCHOOL_COUNT
-----------------
119
SQL>
次は、2つの and 条件を満たす学校を探してみました.
出席率=attendance_rate や学生の総数=total_students のように日本語から適切な列名を探し当てて検索しています.
SQL>
SQL> select ai 出席率が95%以上で学生の総数が200名以上の高校の数は;
HIGH_SCHOOL_COUNT
-----------------
32
SQL> select ai showsql 出席率が95%以上で学生の総数が200名以上の高校の数は;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(*) AS "HIGH_SCHOOL_COUNT"
FROM "AI_USER"."HIGHSCHOOLS" HS
WHERE HS."ATTENDANCE_RATE" >= 95
AND HS."TOTAL_STUDENTS" >= 200
SQL> select ai 出席率が95%以上で学生の総数が200名以上の高校について出席率の高い3校を教えて;
SCHOOL_NAME
--------------------------------------------------------------------------------
ATTENDANCE_RATE
---------------
二言語・アジア研究高等学校
98
マンハッタン ビレッジ アカデミー
98
クリントンスクール
97
SQL> select ai showsql 出席率が95%以上で学生の総数が200名以上の高校について出席率の高い3校を教えて;
RESPONSE
--------------------------------------------------------------------------------
SELECT h."SCHOOL_NAME" AS school_name, h."ATTENDANCE_RATE" AS attendance_rate, h
."TOTAL_STUDENTS" AS total_students
FROM "AI_USER"."HIGHSCHOOLS" h
WHERE h."ATTENDANCE_RATE" >= 95 AND h."TOTAL_STUDENTS" >= 200
ORDER BY h."ATTENDANCE_RATE" DESC
FETCH FIRST 3 ROWS ONLY
SQL>
Select AI を使う場合は、テーブルの列名やその列データの形式や意味を理解した上で質問文を投げないと適切な結果が、得られない可能性があります.
そのあたりを補完する方法としては、列の意味を事前に設定しておく等あるようですが、今回は触れません.
以上、Select AI を試してみました.
余談
日本語文章で Select AI を実行しても結果の正確性が気になって、結局生成された SQL 文を都度確認してしまいます. とはいえ、回答精度はLLMの向上に比例すると思われるので、時間と諦念で解決するのかな?と自問自答する今日この頃です.
参考記事・ドキュメント
以上












