MCPによるOracle DatabaseのファイングレインAIエンリッチメント (2026/04/06)
MCPによるOracle DatabaseのファイングレインAIエンリッチメント (2026/04/06)
Oracle SQLcl バージョン 26.1 が先週リリースされました。
リリースノートから、こんな興味深い情報が得られました。
スキーマ情報ツールは、フィルタリング機能と他のスキーマの詳細情報を取得する機能をサポートするようになりました。
これは一体どういう意味なのでしょうか?
便利なエージェントを使ってこのツールを要約してもらいましたが、要約すると、MCPサーバーにデータベース内の任意のスキーマ(接続されているスキーマだけでなく、アクセス権のあるスキーマ)に関する情報を提供するように要求できるようになったということです。また、必要なメタデータとメタデータのレベルをフィルタリングするように要求することもできます。
お願いしたいのは 、スキーマ情報ツールの概要を教えてください。これを使用してoracleデータベースから特定のデータを取得し、今後のNL2SQLタスクを支援します。
エージェントの出力
schema-informationツールの実際的な内訳と、NL2SQL準備のためにそれを効果的に使用する方法を示します。
sqlcl:schema-information- 概要
このツールはOracleスキーマを解析し、構造化されたメタデータを返します。つまり、LLM(論理言語管理)にデータベースのマップを提供し、正確なSQL文を作成できるようにするのです。
パラメータ
| パラメータ | デフォルト | 注記 |
|---|---|---|
schema | 現在接続されている図 | アクセスできるスキーマを指定します。例HR:SH, OE |
level | BRIEF | BRIEF= 名前 + 型のみ。DETAILED= 列/制約/インデックスの完全な情報 |
objects_list | すべてのオブジェクト | カンマ区切りのリストで、特定のテーブル/ビューなどに絞り込みます。 |
filter | % | LIKEオブジェクト名に関するSQLパターン、例:EMPLOYEE% |
executionType | SYNCHRONOUS | ASYNCHRONOUS2秒以上かかる大規模なスキーマに使用する |
model | UNKNOWN-LLM | ログ記録/テレメトリ目的でモデル名を渡してください |
NL2SQLの2つの主要モード
クイックインベントリ—BRIEFスキーマ内にどのようなオブジェクトが存在するかを確認してから、詳細に取得するオブジェクトを決定する場合に使用します。
schema: HR, level: BRIEFNL2SQL の詳細コンテキスト—DETAILEDターゲットを指定して使用するとobjects_list、LLM が SQL を書き込むテーブルの列名、データ型、制約、およびリレーションシップを取得できます。
schema: HR, level: DETAILED, objects_list: EMPLOYEES,DEPARTMENTS,JOBSNL2SQLの実践的な戦略
スキーマ全体をプロンプトに書き込む(コストがかかり、ノイズも多い)のではなく、良いパターンは次のとおりです。
BRIEFスキーマ全体に対して実行して、すべてをインベントリします- NL2SQLドメインに関連するテーブルを特定します。
DETAILEDこれらのテーブルのみで実行- その出力を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
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秒後にタイムアウトします。そのため、長時間実行されるリクエストを非同期でサポートすることが重要です。
エージェントに長時間実行されるタスクの計画を依頼するだけで、エージェントは非同期タスクモードに切り替わります。その後、結果が準備できるまでタスクの更新を要求します。
コメント
コメントを投稿