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

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

  • 博客分类:
  • java基础

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

DbUtil.java

Java代码

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

TestBean.java

Java代码

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

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

运行结果:


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

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

  • orai18n.jar (1.6 MB)
  • 下载次数: 2
  • OracleArrayTable.rar (3.2 MB)
  • 下载次数: 2
  • sql.rar (912 Bytes)
  • 下载次数: 2
  • 查看图片附件

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

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

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

    首先是我的数据库表(PLSQL操作) create table TEST_TABLE ( yid      NUMBER, ytel     VARCHAR2(50), yanumber VARCHA ...

  2. java操作oracle数据库 代码案例

    目录 1.先在Oracle数据库中创建一个student表: 2.向表中增添一些数据 1.将ojdbc6.jar导入项目中 2.创建一个类,开始编码 3.创建一个测试类 Oracle数据库先创建一个表 ...

  3. Java操作oracle数据库

    //创建数据库连接 Connection connection = null; //设置 PreparedStatement ps=null; PreparedStatement ps2=null; ...

  4. mybatis操作Oracle数据库批量插入与更新、运行注意事项、属性含义

    一.项目需求 针对将近300万用户的用电数据进行统计分析,将结果更新保存Oracle数据库.我需要往一个表里面插入数据,数据量总计在500万条左右.一条一条插入的话非常慢,2万条数据近20分钟,后面就 ...

  5. java mysql nclob_java语言操作Oracle数据库中的CLOB数据类型 (转)

    java语言操作Oracle数据库中的CLOB数据类型 (转)[@more@] 有关字段类型的相关信息可以查阅oracle技术网.下面摘抄一些有关blob.clob等类型的说明.又便于大家的了解. 字 ...

  6. Java连接Oracle数据库(详细!快速上手)

    Java连接Oracle数据库及封装JDBC 如果你点开看到了这篇文章,说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法.但是实际在开发程序的时候,我们是不可能手动地去 ...

  7. dos命令行连接操作ORACLE数据库

    C:\Adminstrator> sqlplus "/as sysdba" 查看是否连接到数据库 SQL> select status from v$instance; ...

  8. java中oracle.链接,java连接Oracle数据库的方法解析

    本文主要对java连接Oracle数据库方法进行步骤解析,具有很好的参考价值,需要的朋友一起来看下吧 Oracle数据库先创建一个表和添加一些数据 1.先在Oracle数据库中创建一个student表 ...

  9. Java操作Oracle

    Java操作Oracle PS:之前写的关于Java操作SQLserver数据库的博客和数据库基础的博客http://blog.csdn.net/q547550831/article/details/ ...

  10. oracle利用游标添加数据库,Oracle数据库游标的类型及使用实例全解

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.Oracle数据库的Cursor类型包含三种: 静态游标:分为显式(explicit)游标 ...

最新文章

  1. JHipster生成微服务架构的应用栈(二)- 认证微服务示例
  2. Spark-ML-数据获取/处理/准备
  3. 【风控场景】互利网上数字金融典型场景: 网络借贷
  4. ASP.NET MVC 框架路线图更新 【转】
  5. 在python中、对于函数定义代码的理解_python中如何理解装饰器代码?
  6. python random函数_Python随机函数random使用详解
  7. em算法 实例 正态分布_人人都能看懂的EM算法推导
  8. 点击键盘上的“Next”button实现文本框焦点跳转
  9. 其实,我被 Fenng 拉黑过!
  10. 关于一个flask的服务接口实战(flask-migrate,flask-script,SQLAlchemy)
  11. 3dmax su 简单_3DMAX转SU逆天神器!一键转换,无脑操作,你值得拥有!
  12. matlab 求反余弦,matlab中反余弦函数
  13. 等保三级 MySql数据库通用测评知识
  14. WPS演示常用快捷键大全
  15. 不积跬步 无以至千里
  16. 苹果手机10秒解除锁屏_苹果密码忘了不想刷机怎么办_苹果手机10秒解除锁屏
  17. MapReduce中文版论文
  18. 阿里巴巴2019实习生招聘正式启动!
  19. Hadoop学习之SSH免密登录配置(以三台虚拟机为例,完全分布式)
  20. 图像处理学习笔记之——绪论

热门文章

  1. 机器码反编译c语言,如何把任意一段机器码或unicode码反汇编成汇编指令
  2. 编写C\Cpp程序中函数声明定义中的常见错误
  3. php被挂马,近日报网站被挂马的解决方法
  4. 用excel表格解线性方程组
  5. PhotoShop配置和常用技巧
  6. 灌篮高手全国大赛漫画 (23-31卷) + 十日后
  7. 【股票】股票交易的手续费介绍以及计算
  8. 生产环境服务CPU飙升问题分析
  9. php数组倒排,js中数组倒序排列的方法
  10. 【历史上的今天】12 月 1 日:新浪网成立;钉钉上线;古登堡计划发布