在WEBSPHERE下调用ORACLE存储过程
设置出参数,第一个为序号,第二个为返回参数的个数,第三个为返回参数的类型,第四个为返回参数的长度
stmt.registerIndexTableOutParameter(5,maxLen,OracleTypes.VARCHAR,elemaxLen);stmt.registerIndexTableOutParameter(6,maxLen,OracleTypes.VARCHAR,elemaxLen);stmt.registerIndexTableOutParameter(7,maxLen,OracleTypes.VARCHAR,elemaxLen);stmt.registerIndexTableOutParameter(8,maxLen,OracleTypes.NUMBER,elemaxLen);
int[] feetype = (int[])stmt.getPlsqlIndexTable(5,java.lang.Integer.TYPE);
float[] fee = (float[])stmt.getPlsqlIndexTable(8,java.lang.Float.TYPE);
//如果返回值中包括汉字,就需按照下面处理
Datum[] feename = (Datum[])stmt.getOraclePlsqlIndexTable(7);
feetypename = new String(feename[j].getBytes(), "GBK");//转换成汉字
String[] monthid = (String[])stmt.getPlsqlIndexTable(6);
通过中间件的连接池,使用thin方式连接。需要对存储过程修改,把在包体中定义的数组类型放到全局中定义。
con=ocicon.getPoolConnection();
//取到中间件连接池连接
stmt =(CallableStatement)con.prepareCall
("BEGIN MCMBAK_BILL.proc_hotfee_new(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?); END;");
//设置出参,入参
stmt.setString(3,svcid);
stmt.registerOutParameter(4,OracleTypes.FLOAT);stmt.registerOutParameter(5,OracleTypes.FLOAT);
//第三个参数为全局中的type名称
stmt.registerOutParameter(13,oracle.jdbc.driver.OracleTypes.ARRAY,"MCM_OBS_STR_ARRAY");
stmt.registerOutParameter(14,oracle.jdbc.driver.OracleTypes.ARRAY,"MCM_OBS_CUR_ARRAY");
//可以直接取得,成为一个字符串数组。
String[] feetype = (String[])((oracle.sql.ARRAY)stmt.getArray(12)).getArray();
//如果数组中包含了汉字,就要如下处理
String[] feename=new String[feecount];
Datum[] datum = ar7.getOracleArray();
for(int i=0;i<datum.length;i++)
{
feename[i]=new String(datum[i].getBytes(),"GBK");
}
入参为数组时,需要另外处理,在使用THIN连接时,包括直接连数据库,不支持下列方法
stmt.setPlsqlIndexTable(11,billingcyclid,maxLen,billingcyclid.length,billingcycleType,10);
stmt.registerIndexTableOutParameter(22,15,predepositType,8);
可使用另外的方式:
con = ocicon.getPoolConnection();testcon = (Connection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)con);//先取得连接,并转换连接。
String[] testStr = {"test","haha","gogo"};
ArrayDescriptor adStr = ArrayDescriptor.createDescriptor("MCM_OBS_BILLINGCYCLTYPE",testcon);//通过连接先注册一个数组类型,"MCM_OBS_BILLINGCYCLTYPE"必须是全局的TYPE,并且要全部大写。
![]()
ARRAY arStr = new ARRAY(adStr,testcon,testStr)// 再定义一个数组。
String[] array = (String[])arStr.getArray();//可以转换成一个数组。
stmt.setArray(13,arStr);//传入存储过程。
stmt.registerOutParameter(9,oracle.jdbc.driver.OracleTypes.ARRAY,"MCM_OBS_FEETYPE");//出参的写法
float[] payedfee = (float[])((oracle.sql.ARRAY) stmt.getArray(9)).getFloatArray();//取得出参值
如果数据源使用OCI连接,
con = ocicon.getPoolConnection();
OracleConnection testcon = (OracleConnection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)con);
使用上面的类把WEBSPHERE 的连接转换成oracle连接。之后使用的方法就可以传入数据,和传出数组。和最前面提到的一样,相当于直接使用ORACLE的护展。太乱了,没有做什么整理!在weblogic下也有类似转换连接类型为ORACLE连接的方法,没有正式调试过,仅供参考
Weblogic调用存储过程方法:
con = ocicon.dbConnect();
stmt = con.prepareCall("{call MCM_LIZHFTEST.TEST_PROC(?,?,?)}");
weblogic.jdbc.wrapper.CallableStatement sss = (weblogic.jdbc.wrapper.
CallableStatement) stmt;
osss = ( (weblogic.jdbc.wrapper.CallableStatement) stmt).stmt.
getConnection().prepareCall(
"begin mcm_fee.proc_wrtoff(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);end;");
ostmt = (OracleCallableStatement) osss;
0
相关文章
