[转帖]ARRAY、TABLE类型批量入库_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3846 | 回复: 0   主题: [转帖]ARRAY、TABLE类型批量入库        下一篇 
Leon
注册用户
等级:少校
经验:1436
发帖:116
精华:7
注册:2013-1-4
状态:离线
发送短消息息给Leon 加好友    发送短消息息给Leon 发消息
发表于: IP:您无权察看 2013-1-4 15:02:42 | [全部帖] [楼主帖] 楼主

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.  * @param peoleList 要存储的list对象 
  101.  * @return 
  102.  * @throws SQLException 
  103.  */ 
  104.  public static int newTest(ArrayList peoleList) throws SQLException{ 
  105.  Connection con = null; 
  106.  CallableStatement stmt = null; 
  107.  int backVal = -1; 
  108.  try { 
  109.  DbUtil d = new DbUtil(); 
  110.  con = d.getCon(); 
  111.  if (con != null) { 
  112.  stmt = con.prepareCall("{call proc_test_new(?,?)}"); 
  113.  ARRAY adArray = getOracleArray(con, "Y_ORACLE_LIST",peoleList); 
  114.  ((OracleCallableStatement) stmt).setARRAY(1, adArray); 
  115.  stmt.registerOutParameter(2, java.sql.Types.INTEGER); 
  116.  stmt.execute(); 
  117.  backVal = stmt.getInt(2); 
  118.  } 
  119.  } catch (Exception e) { 
  120.  e.printStackTrace(); 
  121.  } finally { 
  122.  if(stmt!=null){ 
  123.  stmt.close(); 
  124.  } 
  125.  if(con!=null){ 
  126.  con.close(); 
  127.  } 
  128.  } 
  129.  return backVal; 
  130.  } 



第二种:不用判断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.   forall i in 1 .. v_1.count 
  6.     insert into test_table values (v_1(i), v_2(i), v_3(i)); 
  7. END; 


java代码:

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


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


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

本文出自 “
胡汉三   http://..” 博客,请务必保留此出处

 http://hzw2312.blog.51cto.com/2590340/1105070




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论