有两种方式:
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 StringcallProc(StringprocName,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 ... { CallableStatementproc = null ; Connectionconn = 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 (Exceptione) ... { 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 ListcallProcList(StringprocName,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 ]); } Listlist= new ArrayList(); ResultSetrs = null ; try ... { Connectionconn = this .getSession().connection(); if ( this .getSystemConfig().isOracle()) ... { // conn.setAutoCommit(false); int index = procName.indexOf( " ? " ); procName = procName.substring( 0 ,index) + " ?, " + procName.substring(index); } CallableStatementproc= 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 (Exceptionex) ... { 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"));
.......以下省略