Java操作Oracle数据库——ARRAY TABLE类型批量数据处理区别比较

https://bijian1013.iteye.com/blog/2262435

java操作Oracle数据库——ARRAY、TABLE类型批量入库

oraclejavaARRAY、TABLE类型批量入库 

        首先是我的数据库表(PLSQL操作)

Sql代码 

 收藏代码

  1. --建表  
  2. create table TEST_TABLE    
  3. (    
  4.   yid      NUMBER,      
  5.   ytel     VARCHAR2(50),     
  6.   yanumber VARCHAR2(50)      
  7. );  

        这里记录两种方式:不管哪种方式、一定要记得导入orai18n.jar,否则一遇到字符串就乱码或添加不到数据库中。

一.ARRAY类型批量入库

        在数据库中建立相应的java对象(Oracle中的类型)和数组。

Sql代码 

 收藏代码

  1. --类型  
  2. CREATE OR REPLACE TYPE yOracleObject AS OBJECT(    
  3.        yid number,ytel varchar2(50),yanumber varchar2(50)    
  4. );  

Sql代码 

 收藏代码

  1. --数组  
  2. CREATE OR REPLACE TYPE y_Oracle_LIST AS VARRAY(5000)  OF yOracleObject;  

        创建完毕后在Types下面可以看到创建好的类型。

存储过程:

Sql代码 

 收藏代码

  1. --存储过程  
  2. CREATE OR REPLACE PROCEDURE proc_test_new(y_Array IN y_oracle_list,    
  3.                                           p_out   OUT NUMBER) AS    
  4.   v_yID     number;    
  5.   v_yTel    varchar(50);    
  6.   v_anumber varchar(50);    
  7.   v_type    yoracleobject;    
  8. begin    
  9.   FOR I IN 1 .. y_Array.COUNT LOOP    
  10.     v_type    := y_Array(i);    
  11.     v_yID     := v_type.yid;    
  12.     v_yTel    := v_type.ytel;    
  13.     v_anumber := v_type.yanumber;    
  14.     insert into test_table values (v_yID, v_yTel, v_anumber);    
  15.   end loop;    
  16.   commit;    
  17.   p_out := 0;    
  18. EXCEPTION    
  19.   WHEN OTHERS THEN    
  20.     p_out := -1;    
  21.     ROLLBACK;    
  22. END;   

java代码:

ArrayTestProc.java

Java代码 

 收藏代码

  1. package com.bijian.study;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.SQLException;  
  6. import java.util.ArrayList;  
  7.   
  8. import oracle.jdbc.OracleCallableStatement;  
  9. import oracle.sql.ARRAY;  
  10. import oracle.sql.ArrayDescriptor;  
  11. import oracle.sql.STRUCT;  
  12. import oracle.sql.StructDescriptor;  
  13.   
  14. @SuppressWarnings("unchecked")    
  15. public class ArrayTestProc {    
  16.     
  17.     public static void main(String[] args) {  
  18.           
  19.         ArrayList arrayL = new ArrayList();    
  20.         TestBean t = new TestBean();    
  21.         t.setYid(1);    
  22.         t.setYtel("1236");    
  23.         t.setYanumber("骚年");    
  24.         arrayL.add(t);    
  25.         TestBean t1 = new TestBean();    
  26.         t1.setYid(2);    
  27.         t1.setYtel("1236");    
  28.         t1.setYanumber("骚年");    
  29.         arrayL.add(t1);      
  30.         TestBean t2 = new TestBean();      
  31.         t2.setYid(3);    
  32.         t2.setYtel("1236");    
  33.         t2.setYanumber("骚年");    
  34.         arrayL.add(t2);    
  35.         TestBean t3 = new TestBean();    
  36.         t3.setYid(4);    
  37.         t3.setYtel("1236");    
  38.         t3.setYanumber("骚年");    
  39.         arrayL.add(t3);    
  40.         TestBean t4 = new TestBean();    
  41.         t4.setYid(5);    
  42.         t4.setYtel("1236");    
  43.         t4.setYanumber("骚年");    
  44.         arrayL.add(t4);    
  45.         try {    
  46.             /*  
  47.              * 记得判断一下list集合的大小、如果集合大于你在数据设置的数组大小了、那么就要分批次提交  
  48.              * 我的是y_Oracle_LIST AS VARRAY(5000)   
  49.              * 那么当list集合的值等于5000的时候就入库了、  
  50.              * 然后剩下的数据又从新用一个list来装、在继续判断......  
  51.              * 这里只是简单的演示、就不具体操作判断了  
  52.              */    
  53.             int backVal = newTest(arrayL);    
  54.             System.out.println(backVal==0?"成功!":"失败!");    
  55.         } catch (SQLException e) {    
  56.             e.printStackTrace();    
  57.         }    
  58.     }    
  59.     /**  
  60.      * 将java中的arrayList转化  
  61.      * @param con 数据库连接对象  
  62.      * @param Oraclelist 数据数组类型名称  
  63.      * @param objlist 要存储的list对象  
  64.      * @return oracle.sql.ARRAY  
  65.      * @throws Exception  
  66.      */    
  67.     private static ARRAY getOracleArray(Connection con, String Oraclelist,    
  68.             ArrayList objlist) throws Exception {    
  69.         ARRAY list = null;    
  70.         if (objlist != null && objlist.size() > 0) {    
  71.             /**  
  72.              * 必须大写类型名称  
  73.              * 否则会报错:java.sql.SQLException: 无效的名称模式: M_ORDER.yoracleobject  
  74.              */    
  75.             StructDescriptor structdesc = new StructDescriptor(    
  76.                     "YORACLEOBJECT", con);    
  77.             STRUCT[] structs = new STRUCT[objlist.size()];    
  78.             Object[] result = new Object[0];    
  79.             for (int i = 0; i < objlist.size(); i++) {    
  80.                 result = new Object[3];     
  81.                 TestBean t = (TestBean)(objlist.get(i));    
  82.                 result[0] = t.getYid();    
  83.                 result[1] = t.getYtel();      
  84.                 result[2] = t.getYanumber();     
  85.                 /*  
  86.                  * 一定要记得导入orai18n.jar  
  87.                  * 否则一遇到字符串就乱码、添加不到数据  
  88.                  */    
  89.                 structs[i] = new STRUCT(structdesc, con, result);    
  90.             }    
  91.             ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,    
  92.                     con);    
  93.             list = new ARRAY(desc, con, structs);    
  94.         } else {    
  95.             ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,    
  96.                     con);    
  97.             STRUCT[] structs = new STRUCT[0];    
  98.             list = new ARRAY(desc, con, structs);    
  99.         }    
  100.         return list;    
  101.     }     
  102.         
  103.     /**  
  104.      * 入库  
  105.      * @param peoleList 要存储的list对象  
  106.      * @return  
  107.      * @throws SQLException  
  108.      */    
  109.     public static int newTest(ArrayList peoleList) throws SQLException{    
  110.         Connection con = null;    
  111.         CallableStatement stmt = null;    
  112.         int backVal = -1;     
  113.         try {    
  114.             DbUtil d = new DbUtil();    
  115.             con = d.getCon();    
  116.             if (con != null) {    
  117.                 stmt = con.prepareCall("{call proc_test_new(?,?)}");    
  118.                 ARRAY adArray = getOracleArray(con, "Y_ORACLE_LIST",peoleList);    
  119.                 ((OracleCallableStatement) stmt).setARRAY(1, adArray);    
  120.                 stmt.registerOutParameter(2, java.sql.Types.INTEGER);    
  121.                 stmt.execute();     
  122.                 backVal = stmt.getInt(2);    
  123.             }    
  124.         } catch (Exception e) {    
  125.             e.printStackTrace();     
  126.         } finally {    
  127.             if(stmt!=null){    
  128.                 stmt.close();    
  129.             }    
  130.             if(con!=null){    
  131.                 con.close();    
  132.             }    
  133.         }    
  134.         return backVal;    
  135.     }    
  136. }  

DbUtil.java

Java代码 

 收藏代码

  1. package com.bijian.study;  
  2.   
  3. import java.io.IOException;    
  4. import java.io.InputStream;    
  5. import java.sql.Connection;    
  6. import java.sql.DriverManager;    
  7. import java.util.Properties;    
  8.     
  9. public class DbUtil {  
  10.       
  11.     static Properties properties = null;    
  12.     
  13.     public DbUtil() {    
  14.         // 读取.properties文件的信息    
  15.         properties = new Properties();    
  16.         InputStream in = getClass().getResourceAsStream("ordermanager.properties");    
  17.         try {    
  18.             properties.load(in);      
  19.         } catch (IOException ex) {    
  20.             System.out.println(ex.getMessage());    
  21.             ex.printStackTrace();    
  22.         }    
  23.     }    
  24.         
  25.     /**  
  26.      * <LI>获取连接对象</LI>  
  27.      *   
  28.      * @return  
  29.      */    
  30.      public Connection getCon() {    
  31.             Connection connection = null;      
  32.             try {    
  33.                 String url=properties.getProperty("jdbc.url");    
  34.                 String user=properties.getProperty("jdbc.username");    
  35.                 String pwd=properties.getProperty("jdbc.password");    
  36.                 String driver=properties.getProperty("jdbc.driverClassName");    
  37.                 Class.forName(driver);                     
  38.                 connection = DriverManager.getConnection(url, user, pwd);    
  39.             } catch (Exception err) {    
  40.                   System.out.println("错误:ConDB-->getCon()____JDBC连接失败!");    
  41.                 err.printStackTrace();    
  42.                 return null;    
  43.             }    
  44.             return connection;    
  45.     }      
  46. }  

TestBean.java

Java代码 

 收藏代码

  1. package com.bijian.study;  
  2.   
  3. public class TestBean {  
  4.   
  5.     private int yid;  
  6.     private String ytel;  
  7.     private String yanumber;  
  8.       
  9.     public int getYid() {  
  10.         return yid;  
  11.     }  
  12.     public void setYid(int yid) {  
  13.         this.yid = yid;  
  14.     }  
  15.     public String getYtel() {  
  16.         return ytel;  
  17.     }  
  18.     public void setYtel(String ytel) {  
  19.         this.ytel = ytel;  
  20.     }  
  21.     public String getYanumber() {  
  22.         return yanumber;  
  23.     }  
  24.     public void setYanumber(String yanumber) {  
  25.         this.yanumber = yanumber;  
  26.     }  
  27. }  

ordermanager.properties

Properties代码 

 收藏代码

  1. jdbc.driverClassName=oracle.jdbc.driver.OracleDriver  
  2. jdbc.url=jdbc:oracle:thin:@10.20.128.18:1521:orcl  
  3. jdbc.username=test  
  4. jdbc.password=root  

运行结果:


 

二.TABLE类型批量入库

        不用判断list集合大小、不用考虑数组长度的做法就是用table。

使用的类型:你要新增的数据有多少字段就添加相应个数的类型

Sql代码 

 收藏代码

  1. --类型  
  2. create or replace type i_table is table of number;    
  3. create or replace type t_table is table of varchar2(30);    
  4. create or replace type a_table is table of varchar2(30);  

存储过程:

Sql代码 

 收藏代码

  1. --存储过程  
  2. create or replace procedure pro_forall_insert(v_1 i_table,    
  3.                                               v_2 t_table,    
  4.                                               v_3 a_table) as    
  5. begin    
  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代码:

Java代码 

 收藏代码

  1. package com.bijian.study;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5.   
  6. import oracle.sql.ARRAY;  
  7.   
  8. @SuppressWarnings("unchecked")    
  9. public class TableTestProc {    
  10.     
  11.     public static void main(String[] args) {    
  12.         Connection con = null;    
  13.         CallableStatement cstmt = null;    
  14.         oracle.sql.ArrayDescriptor a = null;    
  15.         oracle.sql.ArrayDescriptor b = null;    
  16.         oracle.sql.ArrayDescriptor c = null;    
  17.         DbUtil d = new DbUtil();    
  18.         con = d.getCon();    
  19.             
  20.         Object[] s1 = new Object[10000];    
  21.         Object[] s2 = new Object[10000];    
  22.         Object[] s3 = new Object[10000];    
  23.     
  24.         for (int i = 0; i < 10000; i++) {    
  25.             s1[i] = new Integer(i);    
  26.             s2[i] = "ttt"+i;    
  27.             s3[i] = "aaa"+i;    
  28.         }  
  29.         try {    
  30.             a = oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE", con);    
  31.             b = oracle.sql.ArrayDescriptor.createDescriptor("T_TABLE", con);    
  32.             c = oracle.sql.ArrayDescriptor.createDescriptor("A_TABLE", con);    
  33.             ARRAY a_test = new ARRAY(a, con, s1);    
  34.             ARRAY b_test = new ARRAY(b, con, s2);    
  35.             ARRAY c_test = new ARRAY(c, con, s3);    
  36.             cstmt = con.prepareCall("{ call pro_forall_insert(?,?,?) }");    
  37.             cstmt.setObject(1, a_test);    
  38.             cstmt.setObject(2, b_test);    
  39.             cstmt.setObject(3, c_test);      
  40.             cstmt.execute();    
  41.             con.commit();    
  42.         } catch (Exception e) {  
  43.             e.printStackTrace();    
  44.         }    
  45.     }    
  46. }  

运行结果:


        最后:Java在操作数据库存储过程时如果需要用到array或者table数据类型的话,需要导入orai18n.jar包,否则一遇到字符串就乱码、添加不到数据!

文章来源:http://blog.csdn.net/hzw2312/article/details/8444462

  • sql.rar (912 Bytes)
  • 下载次数: 2

https://bijian1013.iteye.com/blog/2262435

猜你喜欢

转载自blog.csdn.net/xuheng8600/article/details/85446590