有两种方式:
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"));
.......以下省略
分享到:
相关推荐
### JAVA调用存储过程知识点详解 #### 一、无结果集返回的存储过程调用 在Java中调用不返回结果集的存储过程时,主要步骤包括建立连接、准备调用语句、设置输入参数、执行存储过程以及处理可能产生的警告信息。 1...
值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用存储过程无关,它们看起来像是Delphi或FreePascal项目的文件,这些文件通常用于描述项目配置、单元信息、表单布局等,而不是与Java...
### Java调用存储过程实例:详解 #### 存储过程简介 存储过程是一种在数据库中编写的SQL程序,可以接受输入参数,执行一系列操作,并返回结果或输出参数。它们可以提高应用程序的性能、安全性和复用性。在Oracle...
总之,调用存储过程是Java开发中处理数据库操作的重要环节。理解如何设置`IN`和`OUT`参数,并正确地执行和获取结果,将有助于提高代码的效率和可维护性。希望这个详细讲解对你有所帮助,如果你在实践中遇到任何问题...
java调用存储过程,支持获取return值,output返回值,以及查询的表数据,表数据允许有多个查询结果集
总结来说,Java调用存储过程并处理返回数组,需要理解存储过程的定义,正确使用`CallableStatement`或其子类如`OracleCallableStatement`,以及处理Oracle特定数据类型的方法。通过这些技巧,我们可以有效地在Java...
Java调用存储过程是数据库操作中的常见任务,特别是在复杂业务逻辑和数据处理中。存储过程是一种预编译的SQL语句集合,可以在数据库服务器端执行,提高了效率并减少了网络通信量。本文将详细讲解Java如何调用存储...
### Java调用存储过程——传入集合参数:深入解析与实践 #### 核心知识点概览 在Java应用中,调用数据库存储过程时,往往需要处理复杂的参数传递,特别是当参数为集合类型时,这一过程变得更加具有挑战性。本文将...
Java 调用存储过程小结 Java 调用存储过程是指在 Java 程序中调用数据库中的存储过程,以便实现复杂的业务逻辑和数据处理。存储过程是指保存在数据库并在数据库端执行的程序,可以使用特殊的语法在 Java 类中调用...
### Java调用存储过程的两种方法 在Java中调用数据库中的存储过程是常见的操作之一,这不仅可以提高程序性能和代码可维护性,还可以更好地利用数据库的功能。根据提供的标题、描述以及部分内容,本文将详细介绍Java...