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否则一遇到字符串就乱码、添加不到数据!

猜你喜欢

转载自lzhw1985.iteye.com/blog/1830148