使用Oracle MCP和LangChain4j实现自然语言SQL查询
Java开发LangChain4jOracle MCP数据库查询自然语言处理
原文地址: https://andersswanson.dev/2025/12/02/natural-language-sql-with-oracle-mcp-and-langchain4j/
# 使用 Oracle MCP 和 LangChain4j 实现自然语言 SQL 查询

## 概述
本文将介绍如何通过 Langchain4j 构建一个自然语言数据库查询接口,整合 Oracle SQLcl MCP 服务器(模型上下文协议)。
## 准备工作
1. 启动 Oracle Database Free 容器
2. 配置 SQLcl 以支持 MCP 代理访问
3. 构建并运行应用程序
4. 向数据库提出自然语言问题
## 系统架构

应用程序从终端提示获取自然语言问题,生成相应的 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) {
// 实现代码
}
}
```