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 Developer Day 2026】PL/SQLからOCI生成AIサービスを呼び出す

0
Posted at

はじめに

本記事は 2026/5/21 に 開催された Oracle Developer Day 2026 の関連記事です。
https://www.oracle.com/jp/developer/events/developer-day/

PL/SQLから生成AIサービスを呼び出すをテーマにお話しさせていただきました。
セッションの内容を体験できるよう手順を紹介させていただきます。

image.png

概要

Oracle Cloud(以下OCI)の生成AIをPL/SQLから簡単に利用する方法を紹介します。

OCIでは様々な生成AIサービスがありますが、以下のようなOCR機能をサンプルに紹介します。写真内の手書き文字をAI-OCR(Oracle Cloud Document Understanding)を使って、テキスト化します。

image.png

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作成」ボタンから作成します。
image.png

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

image.png
image.png
image.png

数分もかからず作成されます。すごいですよね。
作成されたデータベース名をクリックして次の手順に進みます。
image.png

DBユーザ作成と設定

デフォルトの管理者ユーザ(ADMIN)を使うのではなく、データ保存・処理用DBユーザを作成します。あわせて必要な権限の設定を行います。すべてブラウザから可能です。

・「データベース・アクション」から「SQL」を選択します。
image.png

・ブラウザからSQLを実行するツールが開きます。
これ便利です。右上にログインユーザが表示されていますが、デフォルトは「ADMIN」です。

image.png

・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が実行されます。
image.png

・作成した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;
/

<実行例>
image.png

作成したDBユーザ用のクレデンシャルを作成

作成したDBユーザから生成AIサービスを呼び出せるように、クレデンシャルを作成します。

SQL文で作成しますが、まずは作成に必要な情報をOCIコンソールから取得します。
・userのOCID
・fingerprint
・tenancyのOCID
・秘密キー
・compartmentのOCID

・右上のユーザアイコンからプロファイルを開き、OCIユーザ名をクリックします。
image.png

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

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

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

・新しくキーが作成されたことを確認します。
image.png

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

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

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

・コピーでコンパートメントのOCIDをコピーし、テキストで残しておきます。
これで必要な情報がすべて集まりました。以下5つです。
・userのOCID
・fingerprint
・tenancyのOCID
・秘密キー
・compartmentのOCID

image.png

・Autonomous AI DatabaseのSQLツールで作業します。
Autonomous AI Databaseメニューの「データベース・アクション」から「SQL」をクリックします。
右上のユーザ名(ADMIN)をクリックし、サインアウトします。
image.png

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

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

・クレデンシャル「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;
/

<実行例>
image.png

ここまでが事前設定です。

テストテーブルの作成と、画像データのロード

DBユーザAIUSERによる作業

・次のSQLを実行して、表を作成します。
photo列に手書き文字が含まれる写真を保存し、OCRでテキスト化したものをtext列に保存するように構成していきます。

CREATE TABLE aitest (id NUMBER(10), photo BLOB , text CLOB );

<実行例>
image.png

・画像データを表にロードします。
矢印ボタンで画面を更新すると、先ほど作成した「AITEST」テーブルが表示されます。
テーブル名を右クリックして、「開く」をクリックします。

image.png

「データ」をクリックしてから、「挿入」をクリックします。
image.png

IDに1を入力し、PHOTO列の「鉛筆」アイコンをクリックします。
IDは適当な数字でかまいません。
image.png

ロードボタンでPC上の画像ファイルを選択できます。
image.png

保存します。
image.png

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

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;

<実行例>
image.png

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?