java调用存储过程

本文介绍了如何使用Java调用DB2及Oracle存储过程,并通过输出参数返回字符串或获取结果集。详细展示了不同类型的参数设置及返回值处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有两种方式:

1、通过输出参数返回一个字符串(可以由多个输出参数,这里我们只演示一个的情况)

DB2过程:(只是示例,不要直接去运行,我没有时间去调试存储过程)

CREATE PROCEDURE test1
(IN V_IARG1 VARCHAR(40),
IN V_IARG2 VARCHAR(20),
IN V_IARG3 VARCHAR(20),
OUT V_ORET VARCHAR(40)
)
SPECIFIC test1
LANGUAGE SQL
P1:BEGIN

SET v_oret = '1';
RETURN 0;

END P1

oracle类似上面,不再写了。

java方法:

publicStringcallProc(StringprocName,String[][]params)...{
log.debug(
"procName:"+procName);
for(inti=0;params!=null&&i<params.length;i++)...{
if(params[i][1]==null||params[i][1].equals("")
||params[i][1].equals("null"))...{
params[i][
1]="%";
}

log.debug(params[i][
1]);
}

try...{
CallableStatementproc
=null;
Connectionconn
=null;
conn
=this.getSession().connection();
intindex=procName.indexOf("?");
procName
=procName.substring(0,index)+"?,"
+procName.substring(index);
proc
=conn.prepareCall(procName);
intparamsNum=params.length;
for(intk=0;k<paramsNum;k++)...{
if(params[k][0].equalsIgnoreCase("String"))...{
proc.setString(k
+1,params[k][1]);
}
elseif(params[k][0].equalsIgnoreCase("Long"))...{
proc.setLong(k
+1,Long.parseLong(params[k][1]));
}
elseif(params[k][0].equalsIgnoreCase("Integer"))...{
proc.setInt(k
+1,Integer.parseInt(params[k][1]));
}
elseif(params[k][0].equalsIgnoreCase("BigDecimal"))...{
proc.setBigDecimal(k
+1,newBigDecimal(params[k][1]));
}

}

proc.registerOutParameter(paramsNum
+1,Types.VARCHAR);
proc.execute();
returnproc.getString(paramsNum+1);
}
catch(Exceptione)...{
thrownewRuntimeException(e);
}

}

2、返回一个结果集(ResultSet)

db2等是直接获取结果集,但oracle不支持,必须用一个输出参数来获取结果集

db2过程示例:

CREATE PROCEDURE TEST2
(IN V_ARG VARCHAR(40)
)
SPECIFIC TEST2
DYNAMIC RESULT SETS 1
LANGUAGE SQL
P1: BEGIN
DECLARE OUT_CUR CURSOR WITH RETURN FOR
SELECT *
FROM TEST2_TABLE
WHERE XXXXXXXX
ORDER BY XXXXXX;
OPEN OUT_CUR;
END P1

ORACLE示例:


CREATE OR REPLACE procedure TEST3(
v_args1 IN VARCHAR2,--输入参数示例,如果你不需要,也可以不加
my_cur OUT yy_db.V_CURSOR.V_CUR--输出参数,oracle跟其它数据库不同的地方,必须加输出参数,用游标返回结果集
)
AS
xxxxx 省略
begin

V_RETSQL := ' select * from xxxxtable 省略';
OPEN my_cur FOR V_RETSQL;

end TEST3;

JAVA调用方法:

publicListcallProcList(StringprocName,String[][]params)...{
log.debug(
"procName:"+procName);
for(inti=0;params!=null&&i<params.length;i++)...{
if(params[i][1]==null||params[i][1].equals("")
||params[i][1].equals("null"))...{
params[i][
1]="%";
}

log.debug(params[i][
1]);
}

Listlist
=newArrayList();
ResultSetrs
=null;
try...{
Connectionconn
=this.getSession().connection();
if(this.getSystemConfig().isOracle())...{
//conn.setAutoCommit(false);
intindex=procName.indexOf("?");
procName
=procName.substring(0,index)+"?,"
+procName.substring(index);
}

CallableStatementproc
=conn.prepareCall(procName);
intparamsNum=params.length;
for(intk=0;k<paramsNum;k++)...{
if(params[k][0].equalsIgnoreCase("String"))...{
proc.setString(k
+1,params[k][1]);
}
elseif(params[k][0].equalsIgnoreCase("Long"))...{
proc.setLong(k
+1,Long.parseLong(params[k][1]));
}
elseif(params[k][0].equalsIgnoreCase("Integer"))...{
proc.setInt(k
+1,Integer.parseInt(params[k][1]));
}
elseif(params[k][0].equalsIgnoreCase("BigDecimal"))...{
proc.setBigDecimal(k
+1,newBigDecimal(params[k][1]));
}

}


if(this.getSystemConfig().isOracle())...{
proc.registerOutParameter(paramsNum
+1,OracleTypes.CURSOR);
proc.execute();
rs
=(ResultSet)proc.getObject(paramsNum+1);
}
else...{
booleanb=proc.execute();
rs
=proc.getResultSet();
}

intcolumnNum=rs.getMetaData().getColumnCount();
Object[]columnType
=newObject[columnNum];
for(inti=0;i<columnNum;i++)...{
//System.out.print(rs.getMetaData().getColumnType(i));
//System.out.println(rs.getMetaData().getColumnTypeName(i));
columnType[i]=String.valueOf(rs.getMetaData().getColumnType(
i
+1));
if(columnType[i].equals("3"))...{
columnType[i]
="2";
}

}

list.add(columnType);
while(rs.next())...{
Object[]objArr
=newObject[columnNum];
for(inti=0;i<columnNum;i++)...{
objArr[i]
=rs.getObject(i+1);
}

list.add(objArr);
}

for(inti=0;log.isDebugEnabled()&&i<list.size()&&i<100;i++)...{
Object[]objArr
=(Object[])list.get(i);
for(intj=0;j<objArr.length;j++)...{
if(j!=0)...{
System.out.print(
",");
}

System.out.print(objArr[j]);
}

System.out.println();
}

returnlist;
}
catch(Exceptionex)...{
log.error(
"",ex);
thrownewRuntimeException(ex);
}

}

调用示例:(以上两种类似)

String proc = "{call TEST3(?,?,?,?,?,?)}";
params = new String[6][2];
params[0][0] = "String";
params[0][1] ="123123";

params[1][0] = "String";
params[1][1] = userSession.getTransCompanyId();

params[2][0] = "String";
params[2][1] = String.valueOf(map.get("startRq")).replaceAll("-",
"");
params[3][0] = "String";
params[3][1] = String.valueOf(map.get("endRq")).replaceAll("-", "");
params[4][0] = "String";
params[4][1] = String.valueOf(map.get("yylx"));
params[5][0] = "String";
params[5][1] = String.valueOf(map.get("tjjb"));

.......以下省略

注意,以下使用数据库sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让大家明白,单一结果和多结果的区别): Boolean hasMoreResult = true; while (hasMoreResult) { ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { } hasMoreResult = callableStatement.getMoreResults(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值