はじめに
本記事は 2026/5/21 に 開催された Oracle Developer Day 2026 の関連記事です。
https://www.oracle.com/jp/developer/events/developer-day/
PL/SQLから生成AIサービスを呼び出すをテーマにお話しさせていただきました。
セッションの内容を体験できるよう手順を紹介させていただきます。
概要
Oracle Cloud(以下OCI)の生成AIをPL/SQLから簡単に利用する方法を紹介します。
OCIでは様々な生成AIサービスがありますが、以下のようなOCR機能をサンプルに紹介します。写真内の手書き文字をAI-OCR(Oracle Cloud Document Understanding)を使って、テキスト化します。
Autonomous AI Databaseを作成するところから全ての流れを記載しています。
OCR処理のPL/SQLコードのみ必要な方は一番最後「PL/SQLによるOCR処理の実行」をご覧ください。
・Autonomous AI Databaseを作成
・DBユーザ作成と設定
・作成したDBユーザ用のクレデンシャルを作成
・テストテーブルの作成と、画像データのロード
・PL/SQLによるOCR処理の実行
Autonomous AI Databaseの作成
テスト用のAutonomous AI Database 26aiを作成します。
・「Autonomous AI Database作成」ボタンから作成します。

・設定例です。
テスト用であれば特に気にする設定はありません。
ライセンスをAlways Freeにすることで、無料で利用可能です。(作成できる数や、スペックに制限があります)
ネットワーク・アクセス指定を「すべての場所からセキュア・アクセス」にしていますが、必要に応じて変更してください。
数分もかからず作成されます。すごいですよね。
作成されたデータベース名をクリックして次の手順に進みます。

DBユーザ作成と設定
デフォルトの管理者ユーザ(ADMIN)を使うのではなく、データ保存・処理用DBユーザを作成します。あわせて必要な権限の設定を行います。すべてブラウザから可能です。
・ブラウザからSQLを実行するツールが開きます。
これ便利です。右上にログインユーザが表示されていますが、デフォルトは「ADMIN」です。
・DBユーザ「AIUSER」作成と権限付与
名称は任意でかまいませんが、後ほどユーザ名を指定する箇所がいくつかあります。
CREATE USER aiuser IDENTIFIED BY Welcome12345#;
GRANT CONNECT,RESOURCE TO aiuser;
GRANT EXECUTE ON DBMS_CLOUD TO aiuser;
GRANT EXECUTE ON DBMS_CLOUD_AI TO aiuser;
GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO aiuser;
GRANT UNLIMITED TABLESPACE TO aiuser;
実行例です。実行したいSQL文を選択して「実行」ボタンでを押すと、SQLが実行されます。

・作成したDBユーザへの権限付与2
「DBアクション(SQL実行ツール)を使えるようにする設定。
OCI生成AIサービスにAutonomous AI Databaseがアクセスできるようにする設定。
BEGIN
ORDS_ADMIN.ENABLE_SCHEMA(
p_enabled => TRUE,
p_schema => 'aiuser', -- 作成したDBユーザ名を指定
p_url_mapping_type => 'BASE_PATH',
p_url_mapping_pattern => 'aiuser', -- 作成したDBユーザ名を指定
p_auto_rest_auth=> TRUE
);
commit;
END;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*.oci.oraclecloud.com', -- アクセス許可するURLパターン
lower_port => 443, -- HTTPSのポート
upper_port => 443,
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'aiuser', -- 作成したDBユーザ名を指定
principal_type => xs_acl.ptype_db)
);
END;
/
作成したDBユーザ用のクレデンシャルを作成
作成したDBユーザから生成AIサービスを呼び出せるように、クレデンシャルを作成します。
SQL文で作成しますが、まずは作成に必要な情報をOCIコンソールから取得します。
・userのOCID
・fingerprint
・tenancyのOCID
・秘密キー
・compartmentのOCID
・右上のユーザアイコンからプロファイルを開き、OCIユーザ名をクリックします。

・「トークンおよびキー」タブから「APIキーの追加」をクリックします。

・秘密キー、公開キーをダウンロードしてから、「追加」をクリックします。

・構成ファイルのプレビューに表示された情報をテキストで残しておきます。
以下3つを利用します。一部灰色で隠していますがその部分の情報も必要です。
・userのOCID
・fingerprint
・tenancyのOCID


・ダウンロードした秘密キーをテキストエディタで開いて内容を確認します。
のちほど利用します。

・コンパートメントのOCIDを確認します。
メニューから「アイデンティティとセキュリティ」>「コンパートメント」をクリックします。

・OCIDを確認するコンパートメントの名前をクリックします。
Autonomous AI Databaseを作成したコンパートメントが対象です。

・コピーでコンパートメントのOCIDをコピーし、テキストで残しておきます。
これで必要な情報がすべて集まりました。以下5つです。
・userのOCID
・fingerprint
・tenancyのOCID
・秘密キー
・compartmentのOCID
・Autonomous AI DatabaseのSQLツールで作業します。
Autonomous AI Databaseメニューの「データベース・アクション」から「SQL」をクリックします。
右上のユーザ名(ADMIN)をクリックし、サインアウトします。

・先ほど作成したDBユーザ「AIUSER」でログインしなおします。

・右上のユーザ名が「AIUSER」になりました。
SQLをクリックして、ツールを起動します。

・クレデンシャル「OCI_CRED」を作成するため、次のSQLを実行します。
すべての行で1つのコマンドです。
先ほど情報を取得したOCID等に変更してから実行します。
declare
jo json_object_t;
begin
jo := json_object_t();
jo.put('user_ocid', '★ユーザのOCID★');
jo.put('tenancy_ocid', '★テナンシのOCID★');
jo.put('compartment_ocid', '★コンパートメントのOCID★');
jo.put('private_key', '-----BEGIN PRIVATE KEY-----
★秘密キー★
-----END PRIVATE KEY-----
OCI_API_KEY');
jo.put('fingerprint', '★fingerprint★');
dbms_output.put_line(jo.to_string);
dbms_vector.create_credential(
credential_name => 'OCI_CRED',
params => json(jo.to_string));
end;
/
ここまでが事前設定です。
テストテーブルの作成と、画像データのロード
DBユーザAIUSERによる作業
・次のSQLを実行して、表を作成します。
photo列に手書き文字が含まれる写真を保存し、OCRでテキスト化したものをtext列に保存するように構成していきます。
CREATE TABLE aitest (id NUMBER(10), photo BLOB , text CLOB );
・画像データを表にロードします。
矢印ボタンで画面を更新すると、先ほど作成した「AITEST」テーブルが表示されます。
テーブル名を右クリックして、「開く」をクリックします。
IDに1を入力し、PHOTO列の「鉛筆」アイコンをクリックします。
IDは適当な数字でかまいません。

保存後、再度「鉛筆」アイコンで開き、「イメージ」タブをみると、写真がロードされていることが確認できます。

OCR処理の実行
ここまでの手順で以下のテーブルを作成しました。
以下のPHOTO列にある写真データ内の文字をテキスト化して、TEXT列に保存するコードを紹介します。
テーブル「AITEST」
| 列名 | データ型 | 備考 |
|---|---|---|
| ID | (NUMBER) | 写真データのID(適当な番号) |
| PHOTO | (BLOB) | OCRしたい写真データ |
| TEXT | (CLOB) | 写真からOCRされたテキストデータ |
DECLARE
l_uri varchar2(100) := 'https://document.aiservice.ap-tokyo-1.oci.oraclecloud.com/20221109/actions/analyzeDocument';
l_photo blob;
l_text clob;
l_body_clob clob;
l_body_blob blob;
l_response DBMS_CLOUD_TYPES.resp;
l_result_clob clob;
l_warning INTEGER;
l_dest_offset INTEGER := 1;
l_src_offset INTEGER := 1;
l_lang_ctx INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
BEGIN
-- AITESTテーブルのIDが1の写真データを取得
select photo into l_photo from aitest where id = 1;
-- AIサービスをよびだすJSONリクエストを作成(CLOB)
l_body_clob := '{"features": [{"featureType": "TEXT_EXTRACTION"}],"processorType":"GENERAL","isZipOutputEnabled":false,"language":"JPN", "document": {"source": "INLINE", "data": "'
|| APEX_WEB_SERVICE.BLOB2CLOBBASE64(l_photo) || '"}}';
-- CLOBをBLOBに変換
DBMS_LOB.CREATETEMPORARY(l_body_blob, FALSE);
DBMS_LOB.CONVERTTOBLOB(
dest_lob => l_body_blob,
src_clob => l_body_clob,
amount => DBMS_LOB.LOBMAXSIZE,
dest_offset => l_dest_offset,
src_offset => l_src_offset,
blob_csid => DBMS_LOB.DEFAULT_CSID,
lang_context=> l_lang_ctx,
warning => l_warning
);
-- AIサービスの呼び出し
l_response := DBMS_CLOUD.SEND_REQUEST(
credential_name => 'OCI_CRED',
uri => l_uri,
method => 'POST',
body => l_body_blob
);
l_result_clob := DBMS_CLOUD.GET_RESPONSE_TEXT(l_response);
-- 返ってきた結果(JSON)の整形。取得されたテキスト部分だけ取り出す
SELECT LISTAGG(j.text, CHR(10))
INTO l_body_clob
FROM JSON_TABLE(
l_result_clob,
'$.pages[*].lines[*]'
COLUMNS (text CLOB PATH '$.text')
) j;
-- TEXT列をUPDATE
update aitest set text = l_body_clob where id=1;
commit;
end;
/
-- 結果確認用のSQL
select id,text from aitest where id = 1;
















