java 實現往oracle存儲過程中傳遞array數組類型的參數


注:本文來源於 《  java 實現往oracle存儲過程中傳遞array數組類型的參數  》

最近項目中遇到通過往存儲過程傳遞數組參數的問題, 

浪費了N多個小時,終於有點頭緒。 

具體的代碼就不寫上了,因為項目中存儲過程的調用方法全部是封裝好的(好像現在都這樣,都姓3層,嘿嘿) 

原理: 



1.一維數組 



A.單純的一維數組的話,直接建立一個table類型就可以 

  1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);


2.多維數組 



A.多維數組就要稍加修改了,如二維數組 

  1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);
  2 
  3 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.chinaunix.net/u2/63586/showart_703439.html) 
  1 -----------------------------------------------------------------------------------
  2 import java.sql.Connection;
  3 import java.sql.PreparedStatement;
  4 import java.sql.CallableStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.sql.Types;
  8 import java.util.ArrayList;
  9 import  oracle.sql.ARRAY;
 10 import oracle.sql.ArrayDescriptor;
 11 import org.apache.tomcat.dbcp.dbcp.DelegatingConnection;
 12 public class BussinessLog {
 13 public static ArrayList<Comparable> CancelLog(String sLoginUser, Object[] arrLogID)
 14 {
 15   ArrayList<Comparable> arrList = new ArrayList<Comparable>();
 16   Connection conn = null;
 17   CallableStatement callStmt = null;
 18   String sql = null;
 19   ArrayDescriptor arrDesc = null;
 20 
 21   try
 22   {
 23    conn = DbConnectionManager.getConnection();
 24    sql = "{call P_CanceltLog(?,?,?,?)}";
 25    callStmt = conn.prepareCall(sql);
 26    arrDesc = ArrayDescriptor.createDescriptor("NUMBERTABLE", getNativeConnection(conn));
 27    ARRAY arr = new ARRAY(arrDesc, getNativeConnection(conn), arrLogID);
 28    callStmt.setString(1, sLoginUser);
 29    callStmt.setObject(2, arr, Types.ARRAY);
 30    callStmt.registerOutParameter(3, Types.VARCHAR);
 31    callStmt.registerOutParameter(4, Types.INTEGER);
 32    callStmt.execute();
 33 
 34     arrList.add(callStmt.getInt(4));
 35    arrList.add(callStmt.getString(3));
 36    return arrList;
 37   } catch (Exception e) {
 38    System.out.println(e.toString());
 39   } finally {
 40    DbAction.clear(conn, callStmt);
 41   }
 42   return arrList;
 43 }
 44 
 45 public static Connection getNativeConnection(Connection con) throws SQLException {
 46   if (con instanceof DelegatingConnection) {
 47    Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
 48    return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
 49   }
 50   return con;
 51 }
 52 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM