1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Autonomous AI DatabaseのSelectAIで指定するテーブルを動的に指定する

1
Last updated at Posted at 2026-01-22

SelectAIのプロファイルについて

OCIのAutonomous AI DatabaseでSelectAIの機能を使う場合、LLMに渡す情報としてDBMS_CLOUD_AI.CREATE_PROFILEプロシージャを実行します。
https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dbms-cloud-ai-package.html#GUID-D51B04DE-233B-48A2-BBFA-3AAB18D8C35C

DBMS_CLOUD_AI.CREATE_PROFILE
   profile_name        IN  VARCHAR2,
   attributes          IN  CLOB      DEFAULT NULL,
   status              IN  VARCHAR2  DEFAULT NULL,
   description         IN  CLOB      DEFAULT NULL
);

この時attributesの中にobject_listという項目があり、ここでownerやname等を指定します。

	[
    	{"owner": "sample", "name": "sales"}
    ]

ここのプロファイルを実行する時にこのobject_listを動的に作成したいというお話をいただきました。

1.動的に作りたい動機

ここについては、テーブルを関連テーブルのように管理していて、その情報を取ってくれば色々設定もやりやすいよねと言うところから、これを使ってPROFILEの作成を実現できるかどうかと言うところに繋がってきました。
関連テーブルについては以下のような形で持ってました。
〇table_master

TABLE_ID OWNER TABLE_NAME
111111 sample employee
222222 sample employee_data
911111 sample sales
922222 sample entry_log

〇relation

PARENT_TABLE PARENT_ID CHILD_TABLE CHILD_ID
111111 1 222222 1
111111 1 922222 1
222222 1 911111 02M260

これらを利用してPROFILEを作成したいという形です。

2.PROFILEの設定

実際にこれで行けるだろうという形のプロファイルを記載します。

DECLARE
  v_object_list CLOB;
  v_profile_attr CLOB;
  v_parent_id   NUMBER := 1;
BEGIN
  SELECT JSON_ARRAYAGG(
           JSON_OBJECT(
             'owner' VALUE tm.owner,
             'name'  VALUE tm.table_name
           )
         )
  INTO v_object_list
  FROM (
    SELECT DISTINCT parent_table AS table_id
    FROM relation
    WHERE parent_id = v_parent_id
    UNION
    SELECT DISTINCT child_table
    FROM relation
    WHERE parent_id = v_parent_id
  ) r
  JOIN table_master tm
    ON tm.table_id = r.table_id;

  v_object_list := COALESCE(v_object_list, '[]');

  -- ★ JSONとして正しく組み立てる
  v_profile_attr :=
       '{'
    || '  "provider": "openai",'
    || '  "credential_name": "OPENAI_CRED",'
    || '  "comments": "true",'
    || '  "model": "gpt-4o",'
    || '  "object_list": ' || v_object_list
    || '}';

  DBMS_CLOUD_AI.CREATE_PROFILE(
    'REL_PROFILE_1',
    v_profile_attr
  );
END;

DECLAREのv_parent_idでrelationテーブルのPARENT_IDを引っ張ってきてテーブルを持ってきて、さらにparent_idに関連するCHILD_TABLEも持ってきているという感じで、
取ってきたリストをv_object_listに渡してそれを配列に記載という形で最後のv_profile_attrに渡しています。
ここら辺は色々設定が可能になるかと思います。

所感

この形で持ってくるとtable_masterのownerも設定されるので、schemaも制御できそうな感じなので、マルチテナントでという環境に利用できるのでは?と少し思った次第です。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?