原文地址: https://andersswanson.dev/2025/12/02/natural-language-sql-with-oracle-mcp-and-langchain4j/ # 使用 Oracle MCP 和 LangChain4j 实现自然语言 SQL 查询 ![](https://andersswanson.dev/wp-content/uploads/2025/12/Screenshot-2025-12-01-at-1.06.14-PM.png) ## 概述 本文将介绍如何通过 Langchain4j 构建一个自然语言数据库查询接口,整合 Oracle SQLcl MCP 服务器(模型上下文协议)。 ## 准备工作 1. 启动 Oracle Database Free 容器 2. 配置 SQLcl 以支持 MCP 代理访问 3. 构建并运行应用程序 4. 向数据库提出自然语言问题 ## 系统架构 ![交互图](https://i0.wp.com/andersswanson.dev/wp-content/uploads/2025/12/Screenshot-2025-12-01-at-1.15.37-PM.png?resize=1024%2C607&ssl=1) 应用程序从终端提示获取自然语言问题,生成相应的 SQL,通过 SQLcl 使用 MCP 协议执行,并通过第二个代理将结果汇总成清晰的报告。 ## 实现步骤 ### 准备工作 - SQLcl 25.2 或更高版本 - Docker compose - Java 21+ 和 Maven - OpenAI API key ### 启动 Oracle Database Free 容器 ```bash docker compose up -d ``` 数据库将运行在 `localhost:1530/freepdb1`,管理员密码为 `Welcome12345`,示例用户为 `testuser/testpwd`。 ### 配置 SQLcl ```bash sql testuser/testpwd@localhost:1530/freepdb1 conn -save cline_mcp -savepwd testuser/testpwd@localhost:1530/freepdb1 ``` ### 构建和运行应用程序 设置 OpenAI API Key: ```bash export OPENAI_API_KEY="Your OpenAI API Key" ``` 编译并运行: ```bash mvn clean compile exec:java ``` ## 核心实现 ### MCP Agent 工具 ```java package com.example.mcp; public class SQLclMCPToolProvider { public static McpToolProvider create() { // 实现代码 } } ``` ### 代理定义 #### SQLclMCPAgent ```java @UserMessage(""" 您是通过自然语言访问 Oracle 数据库的 SQL 代理 """) public interface SQLclMCPAgent { @Agent(description = "执行 SQL 查询") String runQuery(@V("queryText") String queryText, @V("dbConnection") String dbConnection); } ``` #### SQLSummaryAgent ```java @UserMessage(""" 您是将 SQL 查询结果转换为文本报告的专业编辑 """) public interface SQLSummaryAgent { @Agent(description = "生成文本报告") String writeReport(@V("queryResults") String queryResults); } ``` ### 主应用类 ```java public class MCPAgentApplication { public static void main(String[] args) { // 实现代码 } } ```