分享

java 实现往oracle存储过程中传递array数组类型的参数

 phebe 2012-03-07

java 实现往oracle存储过程中传递array数组类型的参数

原文地址:http:///u/fesing/Blog/t-1845

最近项目中遇到通过往存储过程传递数组参数的问题,

浪费了N多个小时,终于有点头绪。

具体的代码就不写上了,因为项目中存储过程的调用方法全部是封装好的(好像现在都这样,都姓3层,嘿嘿)

原理:

1.一维数组

A.单纯的一维数组的话,直接建立一个table类型就可以

TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);

2.多维数组

A.多维数组就要稍加修改了,如二维数组

TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);

TYPE TYPE_TABLE AS TABLE OF TYPE_VARCHAR;

3.java代码的实现

A。首先是connection的问题,connection必须是OracleConnection(java.sql包下的)

B。必须给Array添加一种数据定义(oracle.sql.ArrayDescriptor)

C。ARRAY必须是java.sql.Array

D。好了,开始定义ARRAY

arrDesc = ArrayDescriptor.createDescriptor("TYPE_TABLE", getNativeConnection(conn));
  ARRAY arr = new ARRAY(arrDesc, getNativeConnection(conn), new Object[][]{{"test1","test2"},{"testA","testB"}});

从网上搜到为数不多的代码(仅供参考)

下面代码来自ChinaUnix博客(http://blog./u2/63586/showart_703439.html)

-----------------------------------------------------------------------------------
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import org.apache.tomcat.dbcp.dbcp.DelegatingConnection;
public class BussinessLog {
public static ArrayList<Comparable> CancelLog(String sLoginUser, Object[] arrLogID)
{
  ArrayList<Comparable> arrList = new ArrayList<Comparable>();
  Connection conn = null;
  CallableStatement callStmt = null;
  String sql = null;
  ArrayDescriptor arrDesc = null;
 
  try
  {
   conn = DbConnectionManager.getConnection();
   sql = "{call P_CanceltLog(?,?,?,?)}";  
   callStmt = conn.prepareCall(sql);
   arrDesc = ArrayDescriptor.createDescriptor("NUMBERTABLE", getNativeConnection(conn));
   ARRAY arr = new ARRAY(arrDesc, getNativeConnection(conn), arrLogID);
   callStmt.setString(1, sLoginUser);
   callStmt.setObject(2, arr, Types.ARRAY);
   callStmt.registerOutParameter(3, Types.VARCHAR);
   callStmt.registerOutParameter(4, Types.INTEGER);
   callStmt.execute();
  
   arrList.add(callStmt.getInt(4));
   arrList.add(callStmt.getString(3));
   return arrList;
  } catch (Exception e) {
   System.out.println(e.toString());
  } finally {
   DbAction.clear(conn, callStmt);
  }
  return arrList;
}

public static Connection getNativeConnection(Connection con) throws SQLException {
  if (con instanceof DelegatingConnection) {
   Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
   return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
  }
  return con;
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多