java-调用存储过程工具类
1、先确认参数列表,通过 SQL 查询获取存储过程的参数列表
SELECT
parameter_name,
data_type,
parameter_mode
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE SPECIFIC_NAME = 'SP_SST_GHYY_GRJBXX_gjyb'; -- SP_SST_GHYY_GRJBXX_gjyb ##替换具体的存储过程名称
输出示例:
ParameterName TypeName IsOutput
@input_xml varchar 0
@output_xml xml 1
test:test:test:test:
SELECT
parameter_name,
data_type,
parameter_mode
FROM INFORMATION_SCHEMA.PARAMETERS
WHERE SPECIFIC_NAME = 'SP_SST_GHYY_GRJBXX_gjyb'; -- SP_SST_GHYY_GRJBXX_gjyb
EXEC SP_SST_GHYY_GRJBXX_gjyb @in_xml = '<root><request><cardno>D65415711</cardno><social_no></social_no><insuplc_admdvs></insuplc_admdvs></request><tetal_heart>Y</tetal_heart></root>';
test:test:test:test:
2、调整 Java 代码中的参数匹配
根据实际参数定义修改代码中的参数设置:
private static final String CALL_SYNTAX = "{call SP_SST_GHYY_GRJBXX_gjyb(?)}";
public static String callProcedure(String inputXml)
{
try (Connection conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
CallableStatement cstmt = conn.prepareCall(CALL_SYNTAX))
{
// 设置输入参数
cstmt.setString(1, inputXml);
// 执行存储过程
boolean hasResult = cstmt.execute();
// 读取结果集
StringBuilder result = new StringBuilder();
while (hasResult)
{
try (ResultSet rs = cstmt.getResultSet())
{
while (rs.next())
{
result.append(rs.getString(1)); // 假设结果在第一列
}
}
hasResult = cstmt.getMoreResults(); // 处理多个结果集
}
return result.toString();
} catch (SQLException e)
{
handleSqlException(e);
return null;
}
}
private static final String CALL_SYNTAX = "{call SP_SST_GHYY_GRJBXX_gjyb(?, ?)}";
public static String callProcedure(String inputXml) {
try (/* ... */) {
// 第一个参数是输出,第二个是输入
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.setString(2, inputXml);
cstmt.execute();
return cstmt.getString(1);
}
}
2、将代码编译并运行
/home/sql-test/
├── qlServerProcedureCaller.java # 你的 Java 类文件
mssql-jdbc-9.4.1.jre8.jar # 驱动文件
注意:如果代码中声明了包路径 如: package com.freeview.medical.dataviewsimulator.beans)
Java 要求类文件必须按包名层级存放
# 编译
javac -encoding UTF-8 -d . SqlServerProcedureCaller.java
# 运行
java -cp "mssql-jdbc-9.4.1.jre8.jar:." com.freeview.medical.dataviewsimulator.beans.SqlServerProcedureCaller
[root@N_MZJH_Server test]# javac -encoding UTF-8 -d . SqlServerProcedureCaller.java
[root@N_MZJH_Server test]# java -cp "mssql-jdbc-9.4.1.jre8.jar:." com.freeview.medical.dataviewsimulator.beans.SqlServerProcedureCaller
存储过程调用成功!输出结果:
<root><retInfo><retCode>02</retCode><retMsg>ÕË»§×´Ì¬Òì³££¬Çëµ½ÊÕ·Ñ´°¿Ú´¦Àí</retMsg></retInfo><msgInfo></msgInfo></root>