MCPによるOracle DatabaseのファイングレインAIエンリッチメント (2026/04/06)

MCPによるOracle DatabaseのファイングレインAIエンリッチメント (2026/04/06)

https://www.thatjeffsmith.com/archive/2026/04/fine-grained-ai-enrichment-for-oracle-database-via-mcp/

Oracle SQLcl バージョン 26.1 が先週リリースされました。

リリースノートから、こんな興味深い情報が得られました。

スキーマ情報ツールは、フィルタリング機能と他のスキーマの詳細情報を取得する機能をサポートするようになりました。

これは一体どういう意味なのでしょうか?

便利なエージェントを使ってこのツールを要約してもらいましたが、要約すると、MCPサーバーにデータベース内の任意のスキーマ(接続されているスキーマだけでなく、アクセス権のあるスキーマ)に関する情報を提供するように要求できるようになったということです。また、必要なメタデータとメタデータのレベルをフィルタリングするように要求することもできます

お願いしたいのは 🤖 、スキーマ情報ツールの概要を教えてください。これを使用してoracleデータベースから特定のデータを取得し、今後のNL2SQLタスクを支援します。

エージェントの出力⬇️

schema-informationツールの実際的な内訳と、NL2SQL準備のためにそれを効果的に使用する方法を示します。


sqlcl:schema-information- 概要

このツールはOracleスキーマを解析し、構造化されたメタデータを返します。つまり、LLM(論理言語管理)にデータベースのマップを提供し、正確なSQL文を作成できるようにするのです。

パラメータ

パラメータデフォルト注記
schema現在接続されている図アクセスできるスキーマを指定します。例HR:SH, OE
levelBRIEFBRIEF= 名前 + 型のみ。DETAILED= 列/制約/インデックスの完全な情報
objects_listすべてのオブジェクトカンマ区切りのリストで、特定のテーブル/ビューなどに絞り込みます。
filter%LIKEオブジェクト名に関するSQLパターン、例:EMPLOYEE%
executionTypeSYNCHRONOUSASYNCHRONOUS2秒以上かかる大規模なスキーマに使用する
modelUNKNOWN-LLMログ記録/テレメトリ目的でモデル名を渡してください

NL2SQLの2つの主要モード

クイックインベントリBRIEFスキーマ内にどのようなオブジェクトが存在するかを確認してから、詳細に取得するオブジェクトを決定する場合に使用します。

schema: HR, level: BRIEF

NL2SQL の詳細コンテキストDETAILEDターゲットを指定して使用するとobjects_list、LLM が SQL を書き込むテーブルの列名、データ型、制約、およびリレーションシップを取得できます。

schema: HR, level: DETAILED, objects_list: EMPLOYEES,DEPARTMENTS,JOBS

NL2SQLの実践的な戦略

スキーマ全体をプロンプトに書き込む(コストがかかり、ノイズも多い)のではなく、良いパターンは次のとおりです。

  1. BRIEFスキーマ全体に対して実行して、すべてをインベントリします
  2. NL2SQLドメインに関連するテーブルを特定します。
  3. DETAILEDこれらのテーブルのみで実行
  4. その出力をNL2SQLプロンプトのスキーマコンテキストブロックとして貼り付けてください。

実際に試してみよう。私のプロンプト:

私の要望 🤖 :Raptorデータベースに接続し、情報ツールを使用してSHスキーマの簡単な概要を取得してください。

販売注文、その製品、および関係する顧客の概要を知りたいです。このチャットでのNL2SQLリクエストに必要な情報は、ご自身で辞書クエリを実行するのではなく、mcpツールを使用して取得してください。

そしてエージェントは、スキーマ情報ツールを含め、計画を実行に移します。

そしてエージェントの応答⬇️

以下は、販売/製品/顧客ドメインに焦点を当てた、SHスキーマの簡潔な概要です。


SHスキーマ — NL2SQLコンテキスト

コアテーブル(重点分野)

SALES — ファクトテーブルはパーティション化されています(15パーティション)  PROD_ID, CUST_ID, TIME_ID, CHANNEL_ID, PROMO_ID, QUANTITY_SOLD, AMOUNT_SOLD →すべてのディメンションテーブルと結合します。サロゲートPKはありません。粒度はすべてのFK列の組み合わせです。

CUSTOMERS — 豊富な次元 CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME, CUST_GENDER, CUST_YEAR_OF_BIRTH, CUST_MARITAL_STATUS, CUST_CITY, CUST_STATE_PROVINCE, COUNTRY_ID, CUST_INCOME_LEVEL, CUST_CREDIT_LIMIT, CUST_EMAIL → FK COUNTRIES

PRODUCTS — 階層型製品ディメンション PROD_ID, PROD_NAME, PROD_DESC, PROD_SUBCATEGORY, PROD_CATEGORY, PROD_LIST_PRICE, PROD_MIN_PRICE, PROD_STATUS, SUPPLIER_ID → SCD 列 ( PROD_EFF_FROM、  PROD_EFF_TO、  PROD_VALID)を持つ

TIMES — 非常に豊かな時間的次元 TIME_ID (DATE), DAY_NAME, CALENDAR_MONTH_DESC, CALENDAR_QUARTER_DESC, CALENDAR_YEAR, FISCAL_YEAR, FISCAL_QUARTER_DESC → 暦と財政の両方の階層構造

CHANNELS — ちょっとした調査 CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS

COUNTRIES — 地域別集計 COUNTRY_ID, COUNTRY_NAME, COUNTRY_SUBREGION, COUNTRY_REGION


NL2SQLの重要な関係性

SALES ──┬── CUSTOMERS (CUST_ID)     → who bought
        ├── PRODUCTS  (PROD_ID)     → what they bought
        ├── TIMES     (TIME_ID)     → when they bought
        ├── CHANNELS  (CHANNEL_ID)  → how they bought
        └── PROMOTIONS (PROMO_ID)  → any promo involved

CUSTOMERS ── COUNTRIES (COUNTRY_ID) → where they are from

補足情報もご覧いただけます

  • COSTS — 分割されたコストファクトテーブル(製品別/時間別/チャネル別の単位コスト、単位価格)
  • PROMOTIONS — 日付範囲とカテゴリ階層を含むプロモーションメタデータ
  • SUPPLEMENTARY_DEMOGRAPHICS — 顧客属性の拡張(学歴、職業、世帯規模、スポーツへの関心)
  • PROFITS (表示)  — 売上とコストを組み合わせた、おそらく事前に構築されたビュー
  • CAL_MONTH_SALES_MV / FWEEK_PSCAT_SALES_MV  — 高速集計のためのマテリアライズドビュー

NL2SQLクエリの準備ができました!ご希望であれば、 開始前にDETAILED これらのテーブル(特に SALES、、、 CUSTOMERSまたは PRODUCTS)のメタデータを取得できます。これにより、LLMコンテキストの正確なデータ型、制約、およびインデックスがわかります。

何が起こったのか

  • 私はOracle AI Databaseを操作するために、当社のMCPサーバーを使用しています…
  • データベースユーザー、HRに関連付けられた接続
  • スキーマに関する情報を取得するには、SH
  • データディクショナリクエリを一切実行せずに

追加の質問 –

私の要望 🤖 :上位5名の顧客と、彼らが購入した商品を調べてください。

エージェントはより詳しい情報を求めているため、情報ツールを再度呼び出しますが、今回はより詳細な情報と、特定の3つのオブジェクト(この場合はテーブル)のみを対象とします。

メタデータが返されると、エージェントはタスクのNL2SQL部分に進み、指定されたSQLを実行することができました。

再び、エージェントの応答⬇️

上位5社の顧客とその購買パターンを特定することを考えている

まず、必要な3つのテーブルの詳細なメタデータを取得します。

顧客支出分析のためのSQLクエリの設計

スキーマコンテキストを確認しました。クエリを実行します。総支出額上位5社の顧客と、それぞれの最も購入された製品カテゴリを表示します。

Run-sql

SQL
WITH top_customers AS (
    SELECT
        c.CUST_ID,
        c.CUST_FIRST_NAME || ' ' || c.CUST_LAST_NAME AS customer_name,
        c.CUST_CITY,
        c.CUST_STATE_PROVINCE,
        SUM(s.AMOUNT_SOLD)    AS total_spent,
        SUM(s.QUANTITY_SOLD)  AS total_items,
        COUNT(*)              AS total_transactions
    FROM SH.SALES s
    JOIN SH.CUSTOMERS c ON s.CUST_ID = c.CUST_ID
    GROUP BY c.CUST_ID, c.CUST_FIRST_NAME, c.CUST_LAST_NAME, c.CUST_CITY, c.CUST_STATE_PROVINCE
    ORDER BY total_spent DESC
    FETCH FIRST 5 ROWS ONLY
),
top_category AS (
    SELECT
        s.CUST_ID,
        p.PROD_CATEGORY,
        SUM(s.AMOUNT_SOLD) AS cat_spent,
        RANK() OVER (PARTITION BY s.CUST_ID ORDER BY SUM(s.AMOUNT_SOLD) DESC) AS rn
    FROM SH.SALES s
    JOIN SH.PRODUCTS p ON s.PROD_ID = p.PROD_ID
    WHERE s.CUST_ID IN (SELECT CUST_ID FROM top_customers)
    GROUP BY s.CUST_ID, p.PROD_CATEGORY
)
SELECT
    tc.customer_name,
    tc.cust_city || ', ' || tc.cust_state_province AS location,
    TO_CHAR(tc.total_spent, '$999,999.99')    AS total_spent,
    tc.total_transactions,
    tc.total_items,
    cat.PROD_CATEGORY                         AS top_category
FROM top_customers tc
JOIN top_category cat ON tc.CUST_ID = cat.CUST_ID AND cat.rn = 1
ORDER BY tc.total_spent DESC

生涯支出額上位5社のお客様をご紹介します。

お客様位置総支出額取引トップカテゴリー
ドーラ・ライス神奈川県横浜市103,412.66ドル248ゴルフ
ロリータ・カッツミズーリ州オラン99,578.09ドル256ゴルフ
テシア・エップリングゾーリンゲン、ノルトライン=ヴェストファーレン州98,585.96ドル266ゴルフ
クセルクセス・アッバシイングランド、ウェイクフィールド98,006.16ドル235ゴルフ
ローズ・リーマン神奈川県横浜市97,573.55ドル240ゴルフ

いくつか注目すべき点があります。

  • ゴルフが圧倒的に多い――高額購入者の支出カテゴリーはすべてゴルフであり、これは詳しく調べてみる価値がある。このデータセットにおいて、ゴルフは高額商品カテゴリーである可能性が高い。
  • 販売数量=すべての取引件数。つまり、各取引は1単位の販売であり、高額商品での大量購入は含まれません。
  • 国際的に展開しており、日本、ドイツ、イギリス、アメリカなど、世界各国から顧客が集まっている。SHスキームのグローバルな顧客基盤が明らかになりつつある。
  • 支出額の範囲がかなり狭い(9万7000ドル~10万3000ドル)ことから、これらの顧客は一度に多額の支出をする人ではなく、継続的に高頻度で購入する人であることが示唆される。

でもジェフ、私の辞書は巨大で複雑なんです。スキーマ情報レポートが返ってくるまでには時間がかかるんですよ!

MCPツールのリクエストは60秒後にタイムアウトします。そのため、長時間実行されるリクエストを非同期でサポートすることが重要です。

エージェントに長時間実行されるタスクの計画を依頼するだけで、エージェントは非同期タスクモードに切り替わります。その後、結果が準備できるまでタスクの更新を要求します。

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

ミリ秒の問題: BCCグループとOCIが市場データ・パフォーマンスを再定義する方法(AWSに対するベンチマークを使用) (2025/11/13)

OCIのカスタム・ルート表を使用した詳細なルーティング制御 (2025/02/27)