0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Oracle Cloud] ADB で Select AI を試してみる

0
Last updated at Posted at 2026-05-08

はじめに

この記事は、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 キーを取得

  • OCI console 右上のユーザ・プロファイルボタンから、ユーザ設定を選択.
    api1.png

  • "トークンおよびキー" のタブを選び、"API キーの追加"ボタンをクリック.
    api2.png

  • "APIキー・ペアの生成"を選び、"秘密キーのダウンロード"を選ぶと xx.pem というファイルがダウンロードされる.
    api3.png

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 キー・ペアを保存する.
  • "構成ファイルのプレビュー"画面を表示し、その内容をコピーしてファイルに保存しておく

api4.png

[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
    image.png

  • xls を ADB に取り込むためにデータベース・アクションから、”データ・ロード"を選ぶ.
    imp1.png

  • admin ユーザから、Select AI を使用する ai_user にユーザ変更する.
    imp2.png

    imp3.png

  • データをロードするために、Data Studio の "データ・ロード"を選ぶ.
    imp4.png

  • "データのロード"をクリックし、ローカル・ファイルから先の xls を選択する.
    imp5.png
     imp6.png
    imp7.png

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

  • 先の xls の"開始" をクリックし、データをロードする
    imp10.png

  • 今回のケースでは、ai_user の元に HIGHSCHOOLS テーブルが作られ、427行のデータが、ロードされる.
    imp11.png

  • 以下 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の向上に比例すると思われるので、時間と諦念で解決するのかな?と自問自答する今日この頃です.

参考記事・ドキュメント

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?