在WEBSPHERE下调用ORACLE存储过程

本文详细介绍了在WEBSPHERE环境下,如何配置数据源为THIN模式,并针对存储过程的两种情况——包含数组返回值和不包含数组返回值,进行了具体的调用方法讲解。

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

在WEBSPHERE上数据源配置都为THIN方式。

  在使用存储过程时,分两类:返回值中包括了数组的处理,与不包括数组的处理:

不包括数组的处理
InitialContext initCtx = null;   // 上下文参数
 Connection con=null;              // 数据库的连接
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
       "com.ibm.websphere.naming.WsnInitialContextFactory");
props.put(Context.PROVIDER_URL,url);//在WEBSPHERE中就是这样初始化上下文。
initCtx = new InitialContext(props);
      DataSource ds = (javax.sql.DataSource)
      initCtx.lookup("jdbc/newThin");
// 直接用 javax.sql.DataSource 得到数据源,也只能处理不带数组返回值的处理。
 
con= ds.getConnection();
CallableStatement callsmt = null;
callsmt = con.prepareCall(
          "{call MCM_FEE.proc_search_owefee(?,?,?,?,?,?)}");
// 预处理存储过程
callsmt.setString(1,areaid);
      callsmt.setInt(2, Integer.parseInt(acctid));
// 使用存储过程的入参
     callsmt.registerOutParameter(3,OracleTypes.NUMBER);
      callsmt.registerOutParameter(4,OracleTypes.NUMBER);
      callsmt.registerOutParameter(5,OracleTypes.CHAR);
      callsmt.registerOutParameter(6,OracleTypes.CHAR);
     // 存储过程的出参
      callsmt.execute();
// 执行
O_predpstval = callsmt.getFloat(5);
// 得到出参的值
 
包括数组返回值的处理
有两种方式可以处理:
不通过中间件数据源,直接连到数据库,该种方式不可取。加大中间件,数据库的压力,会耗费更多的时间在取得连接上
 
Connection conn = null;
PreparedStatement stmt = null;
OracleDataSource ods = new OracleDataSource();
// 在这里必须使用 OracleDataSource 类,不能使用 DataSource
ods.setDriverType( "oci8" );
// 设置驱动类型,强烈建议使用‘ thin’ 方式,不要使用‘ oci8’
ods.setTNSEntryName( "ora92lx.idc.oracle.com" );
// 设置 TNS
ods.setURL(“ jdbc:oracle:oci8:@22);
// 设置地址 , 这是 oci8 的方式, thin 的方式为: jdbc:oralce:thin:@192.130.1.22:1521:yyora2
ods.setUser(obsconfig.getDBUserName());
// 用户名
ods.setPassword(obsconfig.getDBPassword());
// 用户密码
conn = ods.getConnection();
// 得到连接
OracleCallableStatement stmt = null;
// 必须使用 OracleCallableStatement
stmt =(OracleCallableStatement)con.prepareCall
            ("BEGIN MCM_FUNLIB.PROC_GETHOTFEE_MODEL_MONTH(?,?,?,?,?,?,?,?,?); END;");
设置入参。
    stmt.setString(1,subscrbid);
      stmt.setString(2,svcid);
      stmt.setString(3,areaid);
      stmt.setString(4,modelid);
设置出参 , 第一个为序号,第二个为返回参数的个数,
第三个为返回参数的类型,第四个为返回参数的长度
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值