2026年6月16日火曜日

APEX 26.1に含まれるパッケージAPEX_DB_DICTIONARYを使って表の説明を生成する

生成AIを呼び出してSQLやPL/SQLを生成したり、BlueprintやAPEXlangで記述されたアプリケーションを生成する場合、表やビューの定義が必要になります。データベースにMCPサーバーでつないで、ディクショナリから読み出すことが多いと思いますが、APEX 26.1ではパッケージAPEX_DB_DICTIONARYが追加され、表やビューの定義情報をテキストやマークダウン形式で出力できるようになりました。

内部的にはDBMS_DICTIONARYを呼び出しているとのことなので、Oracle Database 23ai RU 23.7およびOracle Database 19c RU 19.28以降にAPEX 26.1をインストールして利用できます(オラクルの公式ブログを参照)。

これまで利用できたDBMS_METADATAやDBMS_DEVELOPERとの関連や、パッケージAPEX_DB_DICTIONARY全般ついては、Jan Květinaさんが彼のブログで紹介しています。

Describe tables to your AI with APEX_DB_DICTIONARY
https://www.oneoracledeveloper.com/2026/05/describe-tables-to-your-ai-with.html

本記事では、ファンクションAPEX_DB_DICTIONARY.GET_TABLE_INFOを呼び出し、マークダウンまたはテキスト形式で表/ビュー定義を出力しファイルとしてダウンロードするAPEXアプリを、Oracle APEX 26.1で作成してみました。


download-directory.github.ioからZIP形式でダウンロードすると、APEXワークスペースにそのままインポートできます。


ホーム・ページにAPEX_DB_DICTIONARY.GET_TABLE_INFOに与える全ての引数を、ページ・アイテムとして配置しています。APEX_DB_DICTIONARY.GET_TABLE_INFOの戻り値は、ページ・アイテムP4_DOCUMENTに保存しています。

ボタンGENERATEのクリックでAPEX_DB_DICTIONARY.GET_TABLE_INFOの呼び出し、ボタンDOWNLOADのクリックで、P4_DOCUMENTの内容をファイルとしてダウンロードしています。


名前がp_includeで始まる引数の型はBOOLEANです。APEXではページ・アイテムは、値を文字列として保持します。ページ・アイテムのタイプに応じて、文字列として保存されている値の扱いが変わります。今回はタイプが切替えなので、オン、オフの2値を持つページ・アイテムになります。設定についてはデフォルトを選択しています。


追記

APEX 26.1よりOracle AI Database 26ai限定ですが、アイテム・タイプがチェックボックス切替え非表示のときに、セッション・ステートデータ型BOOLEANを選択できるようになっています。ただし、API呼び出しの引数としてはBOOLEAN型のページ・アイテムはサポートしていないことのことなので、今回は利用できません。その他にも利用上の制限があるようです(リリース・ノート 2.10 Page Item Session State Data Type BOOLEAN


追記終了

デフォルトの使用オフにすると、オン値(オンとみなす文字列)、オン・ラベルオフ値(オンとみなす文字列)、オフ・ラベルを設定できます。


切替え設定デフォルト値は、共有コンポーネントコンポーネント設定に含まれています。


コンポーネント設定に切替えが含まれます。


切替えの表示スタイルオン値オン・ラベルオフ値オフ・ラベルのデフォルト値を設定できます。


ボタンGENERATEをクリックしたときに、プロセスGENERATEを実行します。識別タイプAPIの呼出しを選択し、呼出しにパッケージAPEX_DB_DICTIONARYのファンクションGET_TABLE_INFOを呼び出します。


ファンクションの結果を含む引数は、それぞれページ・アイテムに紐づけられます。ページ・アイテムのタイプが切替えの場合、文字列としてはオン値オフ値を含みます。

パラメータのデータ型BOOLEANの場合、ページ・アイテムに保存されているオン値およびオフ値を、BOOLEAN型のTrueFalseとして認識するためにの文字列を設定する必要があります。切替え定義オン値オフ値として認識される文字列が設定されていますが、それと同じ値をTrue値およびFalse値として設定する必要があります。


出力されたテキストをダウンロードするために、ボタンDOWNLOADをクリックしたときのトリガー・アクションとしてダウンロードをを実行します。

トリガー・アクションはAPEX 26.1で導入されたアクションです。動作アクションとして選択できます。イベントクリックのときに呼び出される動的アクションとほぼ同じ(スロットリングなどの細かい制御はできない)です。

ソースSQL問合せとして、以下を記述します。ダウンロードの動的アクションはAPEX 24.1で追加された機能ですが、それまでに記述する必要があったコードのほとんどを不要にしました。
select 
    :P1_DOCUMENT content
    ,case when :P1_FORMAT = 1 then 'table.md'      else 'table.txt'  end filename
    ,case when :P1_FORMAT = 1 then 'text/markdown' else 'text/plain' end mimetype
from dual

サンプル・データのEMP/DEPTをインストールし、コメントやアノテーションを追加します。GPT-5.5で生成した、こちらのスクリプトを実行します。

作成したAPEXアプリケーションで生成したマークダウンは以下です。
# Table: EMP
Comment: 従業員マスタ。従業員の基本情報、所属組織、上司および給与情報を管理する。

## Columns:
  - EMPNO - NUMBER(4) NOT NULL [pk]
  - ENAME - VARCHAR2(50)
  - JOB - VARCHAR2(50)
  - MGR - NUMBER(4) [fk]
  - HIREDATE - DATE
  - SAL - NUMBER(7,2)
  - COMM - NUMBER(7,2)
  - DEPTNO - NUMBER(4) [fk]

## Column Comments:
  - EMPNO - 従業員番号
  - ENAME - 従業員氏名
  - JOB - 職種
  - MGR - 直属上司の従業員番号
  - HIREDATE - 入社日
  - SAL - 基本給与
  - COMM - 歩合給
  - DEPTNO - 所属部署番号

## Column Display Attributes:
  - EMPNO
    - business-term: Employee Identifier
    - pii: No
  - ENAME
    - business-term: Employee Name
    - pii: Yes
    - searchable: Yes
  - JOB
    - business-term: Job Title
  - MGR
    - business-term: Manager Identifier
  - HIREDATE
    - business-term: Hire Date
  - SAL
    - business-term: Base Salary
    - sensitivity: Confidential
  - COMM
    - business-term: Commission Amount
    - sensitivity: Confidential
  - DEPTNO
    - business-term: Department Identifier

## Constraints:
  - EMP_PK - PRIMARY KEY (EMPNO)
  - EMP_MGR_FK - FOREIGN KEY (MGR) -> EMP(EMPNO)
  - EMP_DEPT_FK - FOREIGN KEY (DEPTNO) -> DEPT(DEPTNO)

## Indexes:
  - EMP_PK - UNIQUE (EMPNO)
  - EMP_1 - NONUNIQUE (MGR)
  - EMP_2 - NONUNIQUE (DEPTNO)

## Table Attributes:
  - business-object: Employee
  - data-classification: Internal
  - data-owner: Human Resources Department
  - subject-area: Human Resources

# Table: DEPT
Comment: 部署マスタ。組織内の部署および所在地情報を管理する。

## Columns:
  - DEPTNO - NUMBER(4) NOT NULL [pk]
  - DNAME - VARCHAR2(50)
  - LOC - VARCHAR2(50)

## Column Comments:
  - DEPTNO - 部署番号
  - DNAME - 部署名
  - LOC - 所在地

## Column Display Attributes:
  - DEPTNO
    - business-term: Department Identifier
  - DNAME
    - business-term: Department Name
  - LOC
    - business-term: Department Location

## Constraints:
  - DEPT_PK - PRIMARY KEY (DEPTNO)

## Indexes:
  - DEPT_PK - UNIQUE (DEPTNO)

## Table Attributes:
  - business-object: Department
  - data-classification: Internal
  - data-owner: Human Resources Department
  - subject-area: Human Resources
データベースのディクショナリを参照すると、実際の定義と参照している定義が乖離することはありません。しかし、データベースのスキーマが更新されることは(特にリレーショナル・データベースでは)一般的に少なく、AIエージェントが参照しやすいようにテキストに落としておくのもひとつの方法でしょう。

今回の記事は以上になります。