JAVA调用存储过程
2009-04-15 12:56
337 查看
有两种方式:
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方法:
public String callProc(String procName, String[][] params) ...{
log.debug("procName:" + procName);
for (int i = 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 ...{
CallableStatement proc = null;
Connection conn = null;
conn = this.getSession().connection();
int index = procName.indexOf("?");
procName = procName.substring(0, index) + "?,"
+ procName.substring(index);
proc = conn.prepareCall(procName);
int paramsNum = params.length;
for (int k = 0; k < paramsNum; k++) ...{
if (params[k][0].equalsIgnoreCase("String")) ...{
proc.setString(k + 1, params[k][1]);
} else if (params[k][0].equalsIgnoreCase("Long")) ...{
proc.setLong(k + 1, Long.parseLong(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("Integer")) ...{
proc.setInt(k + 1, Integer.parseInt(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("BigDecimal")) ...{
proc.setBigDecimal(k + 1, new BigDecimal(params[k][1]));
}
}
proc.registerOutParameter(paramsNum + 1, Types.VARCHAR);
proc.execute();
return proc.getString(paramsNum + 1);
} catch (Exception e) ...{
throw new RuntimeException(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调用方法:
public List callProcList(String procName, String[][] params) ...{
log.debug("procName:" + procName);
for (int i = 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]);
}
List list = new ArrayList();
ResultSet rs = null;
try ...{
Connection conn = this.getSession().connection();
if (this.getSystemConfig().isOracle()) ...{
// conn.setAutoCommit(false);
int index = procName.indexOf("?");
procName = procName.substring(0, index) + "?,"
+ procName.substring(index);
}
CallableStatement proc = conn.prepareCall(procName);
int paramsNum = params.length;
for (int k = 0; k < paramsNum; k++) ...{
if (params[k][0].equalsIgnoreCase("String")) ...{
proc.setString(k + 1, params[k][1]);
} else if (params[k][0].equalsIgnoreCase("Long")) ...{
proc.setLong(k + 1, Long.parseLong(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("Integer")) ...{
proc.setInt(k + 1, Integer.parseInt(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("BigDecimal")) ...{
proc.setBigDecimal(k + 1, new BigDecimal(params[k][1]));
}
}
if (this.getSystemConfig().isOracle()) ...{
proc.registerOutParameter(paramsNum + 1, OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet) proc.getObject(paramsNum + 1);
} else ...{
boolean b = proc.execute();
rs = proc.getResultSet();
}
int columnNum = rs.getMetaData().getColumnCount();
Object[] columnType = new Object[columnNum];
for (int i = 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 = new Object[columnNum];
for (int i = 0; i < columnNum; i++) ...{
objArr[i] = rs.getObject(i + 1);
}
list.add(objArr);
}
for (int i = 0; log.isDebugEnabled() && i < list.size() && i < 100; i++) ...{
Object[] objArr = (Object[]) list.get(i);
for (int j = 0; j < objArr.length; j++) ...{
if (j != 0) ...{
System.out.print(",");
}
System.out.print(objArr[j]);
}
System.out.println();
}
return list;
} catch (Exception ex) ...{
log.error("", ex);
throw new RuntimeException(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"));
.......以下省略
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方法:
public String callProc(String procName, String[][] params) ...{
log.debug("procName:" + procName);
for (int i = 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 ...{
CallableStatement proc = null;
Connection conn = null;
conn = this.getSession().connection();
int index = procName.indexOf("?");
procName = procName.substring(0, index) + "?,"
+ procName.substring(index);
proc = conn.prepareCall(procName);
int paramsNum = params.length;
for (int k = 0; k < paramsNum; k++) ...{
if (params[k][0].equalsIgnoreCase("String")) ...{
proc.setString(k + 1, params[k][1]);
} else if (params[k][0].equalsIgnoreCase("Long")) ...{
proc.setLong(k + 1, Long.parseLong(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("Integer")) ...{
proc.setInt(k + 1, Integer.parseInt(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("BigDecimal")) ...{
proc.setBigDecimal(k + 1, new BigDecimal(params[k][1]));
}
}
proc.registerOutParameter(paramsNum + 1, Types.VARCHAR);
proc.execute();
return proc.getString(paramsNum + 1);
} catch (Exception e) ...{
throw new RuntimeException(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调用方法:
public List callProcList(String procName, String[][] params) ...{
log.debug("procName:" + procName);
for (int i = 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]);
}
List list = new ArrayList();
ResultSet rs = null;
try ...{
Connection conn = this.getSession().connection();
if (this.getSystemConfig().isOracle()) ...{
// conn.setAutoCommit(false);
int index = procName.indexOf("?");
procName = procName.substring(0, index) + "?,"
+ procName.substring(index);
}
CallableStatement proc = conn.prepareCall(procName);
int paramsNum = params.length;
for (int k = 0; k < paramsNum; k++) ...{
if (params[k][0].equalsIgnoreCase("String")) ...{
proc.setString(k + 1, params[k][1]);
} else if (params[k][0].equalsIgnoreCase("Long")) ...{
proc.setLong(k + 1, Long.parseLong(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("Integer")) ...{
proc.setInt(k + 1, Integer.parseInt(params[k][1]));
} else if (params[k][0].equalsIgnoreCase("BigDecimal")) ...{
proc.setBigDecimal(k + 1, new BigDecimal(params[k][1]));
}
}
if (this.getSystemConfig().isOracle()) ...{
proc.registerOutParameter(paramsNum + 1, OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet) proc.getObject(paramsNum + 1);
} else ...{
boolean b = proc.execute();
rs = proc.getResultSet();
}
int columnNum = rs.getMetaData().getColumnCount();
Object[] columnType = new Object[columnNum];
for (int i = 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 = new Object[columnNum];
for (int i = 0; i < columnNum; i++) ...{
objArr[i] = rs.getObject(i + 1);
}
list.add(objArr);
}
for (int i = 0; log.isDebugEnabled() && i < list.size() && i < 100; i++) ...{
Object[] objArr = (Object[]) list.get(i);
for (int j = 0; j < objArr.length; j++) ...{
if (j != 0) ...{
System.out.print(",");
}
System.out.print(objArr[j]);
}
System.out.println();
}
return list;
} catch (Exception ex) ...{
log.error("", ex);
throw new RuntimeException(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调用MySQL存储过程
- java调用存储过程
- Java 调用存储过程
- Java 调用Oracle 存储过程
- mysql存储过程学习及java调用存储过程(转载)
- JAVA中对存储过程的调用方法 ZT
- DB2数据库、触发器、存储过程、JAVA数据库链接(JDBC)、调用层接口(CLI)
- JAVA中对存储过程的调用方法
- 【Java 调用Oracle 存储过程】
- CallableStatement java中调用存储过程
- JAVA调用存储过程
- java调用ORACLE 存储过程返回值22
- Java/JSP中调用SQL Server存储过程完整示例
- java调用oracle 存储过程 以及游标使用
- java调用存储过程
- 创建存储过程并用java调用实例
- Day60-Oracle04 - PLSQL编程、游标cursor、例外exception、存储过程(procedure)、存储函数(function)、java调用存储过程、触发器(trigger)
- java调用oracle 存储过程
- java调用存储过程
- 利用游标返回结果集的的例子(Oracle 存储过程)JAVA调用方法和.NET调用方法