ARRAY、TABLE類型批量入庫

 java操作Oracle數據庫——ARRAY、TABLE類型批量入庫

 
首先是我的數據庫表(PLSQL操作)
 
  1. create table TEST_TABLE 
  2.   yid      NUMBER,   
  3.   ytel     VARCHAR2(50),  
  4.   yanumber VARCHAR2(50)   
  5. ); 
這裏記錄兩種方式:不管哪種方式、一定要記得導入orai18n.jar否則一遇到字符串就亂碼、添加不到數據
第一種:
在數據庫中建立相應的java對象(Oracle中的類型)和數組.
 
  1. CREATE OR REPLACE TYPE yOracleObject(類型名稱) AS OBJECT( 
  2.        yid number,ytel varchar2(50),yanumber varchar2(50) 
  3. ); 
數組:
 
  1. CREATE OR REPLACE TYPE y_Oracle_LIST(數組名稱) AS VARRAY(5000) OF yOracleObject(類型名稱); 
創建完畢後在Types下面可以看到創建好的類型。
 
存儲過程:
 
  1. CREATE OR REPLACE PROCEDURE proc_test_new(y_Array IN y_oracle_list, 
  2.                                           p_out   OUT NUMBER) AS 
  3.   v_yID     number; 
  4.   v_yTel    varchar(50); 
  5.   v_anumber varchar(50); 
  6.   v_type    yoracleobject; 
  7. begin 
  8.   FOR I IN 1 .. y_Array.COUNT LOOP 
  9.     v_type    := y_Array(i); 
  10.     v_yID     := v_type.yid; 
  11.     v_yTel    := v_type.ytel; 
  12.     v_anumber := v_type.yanumber; 
  13.     insert into test_table values (v_yID, v_yTel, v_anumber); 
  14.   end loop; 
  15.   commit
  16.   p_out := 0; 
  17. EXCEPTION 
  18.   WHEN OTHERS THEN 
  19.     p_out := -1; 
  20.     ROLLBACK
  21. END
java代碼:
  1. import java.sql.CallableStatement; 
  2. import java.sql.Connection; 
  3. import java.sql.SQLException; 
  4. import java.util.ArrayList; 
  5. import com.chinaboxun.ordermanager.core.util.DbUtil; 
  6. import oracle.jdbc.driver.OracleCallableStatement; 
  7. import oracle.sql.ARRAY; 
  8. import oracle.sql.ArrayDescriptor; 
  9. import oracle.sql.STRUCT; 
  10. import oracle.sql.StructDescriptor; 
  11. @SuppressWarnings("unchecked"
  12. public class TestProc { 
  13.  
  14.     public static void main(String[] args) { 
  15.         ArrayList arrayL = new ArrayList(); 
  16.         TestBean t = new TestBean(); 
  17.         t.setYid(1); 
  18.         t.setYtel("1236"); 
  19.         t.setYanumber("騷年"); 
  20.         arrayL.add(t); 
  21.         TestBean t1 = new TestBean(); 
  22.         t1.setYid(2); 
  23.         t1.setYtel("1236"); 
  24.         t1.setYanumber("騷年"); 
  25.         arrayL.add(t1);   
  26.         TestBean t2 = new TestBean();   
  27.         t2.setYid(3); 
  28.         t2.setYtel("1236"); 
  29.         t2.setYanumber("騷年"); 
  30.         arrayL.add(t2); 
  31.         TestBean t3 = new TestBean(); 
  32.         t3.setYid(4); 
  33.         t3.setYtel("1236"); 
  34.         t3.setYanumber("騷年"); 
  35.         arrayL.add(t3); 
  36.         TestBean t4 = new TestBean(); 
  37.         t4.setYid(5); 
  38.         t4.setYtel("1236"); 
  39.         t4.setYanumber("騷年"); 
  40.         arrayL.add(t4); 
  41.         try { 
  42.             /* 
  43.              * 記得判斷一下list集合的大小、如果集合大於你在數據設置的數組大小了、那麼就要分批次提交 
  44.              * 我的是y_Oracle_LIST AS VARRAY(5000)  
  45.              * 那麼當list集合的值等於5000的時候就入庫了、 
  46.              * 然後剩下的數據又從新用一個list來裝、在繼續判斷...... 
  47.              * 這裏只是簡單的演示、就不具體操作判斷了 
  48.              */ 
  49.             int backVal = newTest(arrayL); 
  50.             System.out.println(backVal==0?"成功!":"失敗!"); 
  51.         } catch (SQLException e) { 
  52.             e.printStackTrace(); 
  53.         } 
  54.     } 
  55.     /** 
  56.      * 將java中的arrayList轉化 
  57.      * @param con 數據庫連接對象 
  58.      * @param Oraclelist 數據數組類型名稱 
  59.      * @param objlist 要存儲的list對象 
  60.      * @return oracle.sql.ARRAY 
  61.      * @throws Exception 
  62.      */ 
  63.     private static ARRAY getOracleArray(Connection con, String Oraclelist, 
  64.             ArrayList objlist) throws Exception { 
  65.         ARRAY list = null
  66.         if (objlist != null && objlist.size() > 0) { 
  67.             /** 
  68.              * 必須大寫類型名稱 
  69.              * 否則會報錯:java.sql.SQLException: 無效的名稱模式: M_ORDER.yoracleobject 
  70.              */ 
  71.             StructDescriptor structdesc = new StructDescriptor( 
  72.                     "YORACLEOBJECT", con); 
  73.             STRUCT[] structs = new STRUCT[objlist.size()]; 
  74.             Object[] result = new Object[0]; 
  75.             for (int i = 0; i < objlist.size(); i++) { 
  76.                 result = new Object[3];  
  77.                 TestBean t = (TestBean)(objlist.get(i)); 
  78.                 result[0] = t.getYid(); 
  79.                 result[1] = t.getYtel();   
  80.                 result[2] = t.getYanumber();  
  81.                 /* 
  82.                  * 一定要記得導入orai18n.jar 
  83.                  * 否則一遇到字符串就亂碼、添加不到數據 
  84.                  */ 
  85.                 structs[i] = new STRUCT(structdesc, con, result); 
  86.             } 
  87.             ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, 
  88.                     con); 
  89.             list = new ARRAY(desc, con, structs); 
  90.         } else { 
  91.             ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, 
  92.                     con); 
  93.             STRUCT[] structs = new STRUCT[0]; 
  94.             list = new ARRAY(desc, con, structs); 
  95.         } 
  96.         return list; 
  97.     }  
  98.      
  99.     /** 
  100.      * 入庫 
  101.      * @param peoleList 要存儲的list對象 
  102.      * @return 
  103.      * @throws SQLException 
  104.      */ 
  105.     public static int newTest(ArrayList peoleList) throws SQLException{ 
  106.         Connection con = null
  107.         CallableStatement stmt = null
  108.         int backVal = -1;  
  109.         try { 
  110.             DbUtil d = new DbUtil(); 
  111.             con = d.getCon(); 
  112.             if (con != null) { 
  113.                 stmt = con.prepareCall("{call proc_test_new(?,?)}"); 
  114.                 ARRAY adArray = getOracleArray(con, "Y_ORACLE_LIST",peoleList); 
  115.                 ((OracleCallableStatement) stmt).setARRAY(1, adArray); 
  116.                 stmt.registerOutParameter(2, java.sql.Types.INTEGER); 
  117.                 stmt.execute();  
  118.                 backVal = stmt.getInt(2); 
  119.             } 
  120.         } catch (Exception e) { 
  121.             e.printStackTrace();  
  122.         } finally { 
  123.             if(stmt!=null){ 
  124.                 stmt.close(); 
  125.             } 
  126.             if(con!=null){ 
  127.                 con.close(); 
  128.             } 
  129.         } 
  130.         return backVal; 
  131.     } 
第二種:不用判斷list集合大小、不用考慮數組長度的做法就是用table。
使用的類型:你要新增的數據有多少字段就添加相應個數的類型
 
  1. create or replace type i_table is table of number; 
  2. create or replace type t_table is table of varchar2(30); 
  3. create or replace type a_table is table of varchar2(30); 
存儲過程:
  1. create or replace procedure pro_forall_insert(v_1 i_table, 
  2.                                               v_2 t_table, 
  3.                                               v_3 a_table) as 
  4. begin 
  5.  
  6.   forall i in 1 .. v_1.count 
  7.     insert into test_table values (v_1(i), v_2(i), v_3(i)); 
  8. END
java代碼:
  1. package com.chinaboxun; 
  2.  
  3. import java.sql.CallableStatement; 
  4. import java.sql.Connection; 
  5. import java.sql.SQLException; 
  6. import java.util.ArrayList; 
  7. import com.chinaboxun.ordermanager.core.util.DbUtil; 
  8. import oracle.jdbc.driver.OracleCallableStatement; 
  9. import oracle.sql.ARRAY; 
  10. import oracle.sql.ArrayDescriptor; 
  11. import oracle.sql.STRUCT; 
  12. import oracle.sql.StructDescriptor; 
  13. @SuppressWarnings("unchecked"
  14. public class TestProc { 
  15.  
  16.     public static void main(String[] args) { 
  17.         Connection con = null
  18.         CallableStatement cstmt = null
  19.         oracle.sql.ArrayDescriptor a = null
  20.         oracle.sql.ArrayDescriptor b = null
  21.         oracle.sql.ArrayDescriptor c = null
  22.         DbUtil d = new DbUtil(); 
  23.         con = d.getCon(); 
  24.          
  25.         if (1 == 1 ) 
  26.         { 
  27.             Object[] s1 = new Object[10000]; 
  28.             Object[] s2 = new Object[10000]; 
  29.             Object[] s3 = new Object[10000]; 
  30.  
  31.             for (int i = 0; i < 10000; i++) { 
  32.                 s1[i] = new Integer(i); 
  33.                 s2[i] = "ttt"+i; 
  34.                 s3[i] = "aaa"+i; 
  35.             } 
  36.             try { 
  37.                 a = oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE", con); 
  38.                 b = oracle.sql.ArrayDescriptor.createDescriptor("T_TABLE", con); 
  39.                 c = oracle.sql.ArrayDescriptor.createDescriptor("A_TABLE", con); 
  40.                 ARRAY a_test = new ARRAY(a, con, s1); 
  41.                 ARRAY b_test = new ARRAY(b, con, s2); 
  42.                 ARRAY c_test = new ARRAY(c, con, s3); 
  43.                 cstmt = con.prepareCall("{ call pro_forall_insert(?,?,?) }"); 
  44.                 cstmt.setObject(1, a_test); 
  45.                 cstmt.setObject(2, b_test); 
  46.                 cstmt.setObject(3, c_test);   
  47.                 cstmt.execute(); 
  48.                 con.commit(); 
  49.             } catch (Exception e) { 
  50.                 e.printStackTrace(); 
  51.             } 
  52.         } 
  53.  
  54.     } 
DbUtil工具類:
  1. import java.io.IOException; 
  2. import java.io.InputStream; 
  3. import java.sql.Connection; 
  4. import java.sql.DriverManager; 
  5. import java.util.Properties; 
  6.  
  7. public class DbUtil { 
  8.     static Properties properties = null
  9.  
  10.     public DbUtil() { 
  11.         // 讀取.properties文件的信息 
  12.         properties = new Properties(); 
  13.         InputStream in = getClass().getResourceAsStream("/com/chinaboxun/ordermanager/config/ordermanager.properties"); 
  14.         try { 
  15.             properties.load(in);   
  16.         } catch (IOException ex) { 
  17.             System.out.println(ex.getMessage()); 
  18.             ex.printStackTrace(); 
  19.         } 
  20.     } 
  21.      
  22.     /** 
  23.      * <LI>獲取連接對象</LI> 
  24.      *  
  25.      * @return 
  26.      */ 
  27.      public Connection getCon() { 
  28.             Connection connection = null;   
  29.             try { 
  30.                 String url=properties.getProperty("jdbc.url"); 
  31.                 String user=properties.getProperty("jdbc.username"); 
  32.                 String pwd=properties.getProperty("jdbc.password"); 
  33.                 String driver=properties.getProperty("jdbc.driverClassName"); 
  34.                 Class.forName(driver);                  
  35.                 connection = DriverManager.getConnection(url, user, pwd); 
  36.             } catch (Exception err) { 
  37.                   System.out.println("錯誤:ConDB-->getCon()____JDBC連接失敗!"); 
  38.                 err.printStackTrace(); 
  39.                 return null
  40.             } 
  41.             return connection; 
  42.     }   
ordermanager.properties屬性文件:
 
  1. jdbc.driverClassName=oracle.jdbc.OracleDriver 
  2. jdbc.jdbc:oracle:thin:@172.16.0.162:1521:ORCL < /span>
  3. jdbc.username=m_order 
  4. jdbc.password=morder 
最後:一定要記得導入orai18n.jar否則一遇到字符串就亂碼、添加不到數據!我被這個可整慘了!尼瑪、老子這牙齒疼死我了!!!
 
 
 
 
 
 
 
 
 
 
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章