首先是我的数据库表(PLSQL操作)
--建表 create table TEST_TABLE ( yid NUMBER, ytel VARCHAR2(50), yanumber VARCHAR2(50) );
这里记录两种方式:不管哪种方式、一定要记得导入orai18n.jar,否则一遇到字符串就乱码或添加不到数据库中。
一.ARRAY类型批量入库
在数据库中建立相应的java对象(Oracle中的类型)和数组。
--类型 CREATE OR REPLACE TYPE yOracleObject AS OBJECT( yid number,ytel varchar2(50),yanumber varchar2(50) );
--数组 CREATE OR REPLACE TYPE y_Oracle_LIST AS VARRAY(5000) OF yOracleObject;
创建完毕后在Types下面可以看到创建好的类型。
存储过程:
--存储过程 CREATE OR REPLACE PROCEDURE proc_test_new(y_Array IN y_oracle_list, p_out OUT NUMBER) AS v_yID number; v_yTel varchar(50); v_anumber varchar(50); v_type yoracleobject; begin FOR I IN 1 .. y_Array.COUNT LOOP v_type := y_Array(i); v_yID := v_type.yid; v_yTel := v_type.ytel; v_anumber := v_type.yanumber; insert into test_table values (v_yID, v_yTel, v_anumber); end loop; commit; p_out := 0; EXCEPTION WHEN OTHERS THEN p_out := -1; ROLLBACK; END;
java代码:
ArrayTestProc.java
package com.bijian.study; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import oracle.jdbc.OracleCallableStatement; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import oracle.sql.STRUCT; import oracle.sql.StructDescriptor; @SuppressWarnings("unchecked") public class ArrayTestProc { public static void main(String[] args) { ArrayList arrayL = new ArrayList(); TestBean t = new TestBean(); t.setYid(1); t.setYtel("1236"); t.setYanumber("骚年"); arrayL.add(t); TestBean t1 = new TestBean(); t1.setYid(2); t1.setYtel("1236"); t1.setYanumber("骚年"); arrayL.add(t1); TestBean t2 = new TestBean(); t2.setYid(3); t2.setYtel("1236"); t2.setYanumber("骚年"); arrayL.add(t2); TestBean t3 = new TestBean(); t3.setYid(4); t3.setYtel("1236"); t3.setYanumber("骚年"); arrayL.add(t3); TestBean t4 = new TestBean(); t4.setYid(5); t4.setYtel("1236"); t4.setYanumber("骚年"); arrayL.add(t4); try { /* * 记得判断一下list集合的大小、如果集合大于你在数据设置的数组大小了、那么就要分批次提交 * 我的是y_Oracle_LIST AS VARRAY(5000) * 那么当list集合的值等于5000的时候就入库了、 * 然后剩下的数据又从新用一个list来装、在继续判断...... * 这里只是简单的演示、就不具体操作判断了 */ int backVal = newTest(arrayL); System.out.println(backVal==0?"成功!":"失败!"); } catch (SQLException e) { e.printStackTrace(); } } /** * 将java中的arrayList转化 * @param con 数据库连接对象 * @param Oraclelist 数据数组类型名称 * @param objlist 要存储的list对象 * @return oracle.sql.ARRAY * @throws Exception */ private static ARRAY getOracleArray(Connection con, String Oraclelist, ArrayList objlist) throws Exception { ARRAY list = null; if (objlist != null && objlist.size() > 0) { /** * 必须大写类型名称 * 否则会报错:java.sql.SQLException: 无效的名称模式: M_ORDER.yoracleobject */ StructDescriptor structdesc = new StructDescriptor( "YORACLEOBJECT", con); STRUCT[] structs = new STRUCT[objlist.size()]; Object[] result = new Object[0]; for (int i = 0; i < objlist.size(); i++) { result = new Object[3]; TestBean t = (TestBean)(objlist.get(i)); result[0] = t.getYid(); result[1] = t.getYtel(); result[2] = t.getYanumber(); /* * 一定要记得导入orai18n.jar * 否则一遇到字符串就乱码、添加不到数据 */ structs[i] = new STRUCT(structdesc, con, result); } ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con); list = new ARRAY(desc, con, structs); } else { ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist, con); STRUCT[] structs = new STRUCT[0]; list = new ARRAY(desc, con, structs); } return list; } /** * 入库 * @param peoleList 要存储的list对象 * @return * @throws SQLException */ public static int newTest(ArrayList peoleList) throws SQLException{ Connection con = null; CallableStatement stmt = null; int backVal = -1; try { DbUtil d = new DbUtil(); con = d.getCon(); if (con != null) { stmt = con.prepareCall("{call proc_test_new(?,?)}"); ARRAY adArray = getOracleArray(con, "Y_ORACLE_LIST",peoleList); ((OracleCallableStatement) stmt).setARRAY(1, adArray); stmt.registerOutParameter(2, java.sql.Types.INTEGER); stmt.execute(); backVal = stmt.getInt(2); } } catch (Exception e) { e.printStackTrace(); } finally { if(stmt!=null){ stmt.close(); } if(con!=null){ con.close(); } } return backVal; } }
DbUtil.java
package com.bijian.study; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class DbUtil { static Properties properties = null; public DbUtil() { // 读取.properties文件的信息 properties = new Properties(); InputStream in = getClass().getResourceAsStream("ordermanager.properties"); try { properties.load(in); } catch (IOException ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); } } /** * <LI>获取连接对象</LI> * * @return */ public Connection getCon() { Connection connection = null; try { String url=properties.getProperty("jdbc.url"); String user=properties.getProperty("jdbc.username"); String pwd=properties.getProperty("jdbc.password"); String driver=properties.getProperty("jdbc.driverClassName"); Class.forName(driver); connection = DriverManager.getConnection(url, user, pwd); } catch (Exception err) { System.out.println("错误:ConDB-->getCon()____JDBC连接失败!"); err.printStackTrace(); return null; } return connection; } }
TestBean.java
package com.bijian.study; public class TestBean { private int yid; private String ytel; private String yanumber; public int getYid() { return yid; } public void setYid(int yid) { this.yid = yid; } public String getYtel() { return ytel; } public void setYtel(String ytel) { this.ytel = ytel; } public String getYanumber() { return yanumber; } public void setYanumber(String yanumber) { this.yanumber = yanumber; } }
ordermanager.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@10.20.128.18:1521:orcl jdbc.username=test jdbc.password=root
运行结果:
二.TABLE类型批量入库
不用判断list集合大小、不用考虑数组长度的做法就是用table。
使用的类型:你要新增的数据有多少字段就添加相应个数的类型
--类型 create or replace type i_table is table of number; create or replace type t_table is table of varchar2(30); create or replace type a_table is table of varchar2(30);
存储过程:
--存储过程 create or replace procedure pro_forall_insert(v_1 i_table, v_2 t_table, v_3 a_table) as begin forall i in 1 .. v_1.count insert into test_table values (v_1(i), v_2(i), v_3(i)); END;
java代码:
package com.bijian.study; import java.sql.CallableStatement; import java.sql.Connection; import oracle.sql.ARRAY; @SuppressWarnings("unchecked") public class TableTestProc { public static void main(String[] args) { Connection con = null; CallableStatement cstmt = null; oracle.sql.ArrayDescriptor a = null; oracle.sql.ArrayDescriptor b = null; oracle.sql.ArrayDescriptor c = null; DbUtil d = new DbUtil(); con = d.getCon(); Object[] s1 = new Object[10000]; Object[] s2 = new Object[10000]; Object[] s3 = new Object[10000]; for (int i = 0; i < 10000; i++) { s1[i] = new Integer(i); s2[i] = "ttt"+i; s3[i] = "aaa"+i; } try { a = oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE", con); b = oracle.sql.ArrayDescriptor.createDescriptor("T_TABLE", con); c = oracle.sql.ArrayDescriptor.createDescriptor("A_TABLE", con); ARRAY a_test = new ARRAY(a, con, s1); ARRAY b_test = new ARRAY(b, con, s2); ARRAY c_test = new ARRAY(c, con, s3); cstmt = con.prepareCall("{ call pro_forall_insert(?,?,?) }"); cstmt.setObject(1, a_test); cstmt.setObject(2, b_test); cstmt.setObject(3, c_test); cstmt.execute(); con.commit(); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
最后:Java在操作数据库存储过程时如果需要用到array或者table数据类型的话,需要导入orai18n.jar包,否则一遇到字符串就乱码、添加不到数据!
相关推荐
在Java编程中,连接Oracle数据库是一项常见的任务,用于执行SQL查询、更新和其他数据库操作。`sqlHelper`类是一个自定义的工具类,旨在简化这个过程,提供一个方便、高效的接口来处理数据库交互。本篇文章将深入探讨...
Java 操作 Oracle 数据库(建表,插数据,删除) Java 是一种广泛使用的编程语言,而 Oracle 数据库是一种功能强大且广泛使用的关系型数据库管理系统。在本文中,我们将探讨如何使用 Java 操作 Oracle 数据库,包括...
### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...
在Java中集成Oracle数据库,不仅可以从Java调用数据库操作,还可以在SQL和PL/SQL中调用Java代码。Oracle提供了扩展的DDL语句,允许在数据库中创建和管理Java程序,将Java命名空间映射到数据库模式,使得访问和调用...
Java连接Oracle数据库主要依赖于JDBC(Java Database Connectivity)技术,这是Java平台中用于与各种数据库进行交互的一套标准API。Oracle公司提供了JDBC驱动,使得Java程序能够方便地访问Oracle数据库。在Java中...
Java 导出 Oracle 数据库数据 Java 是一种流行的编程语言,广泛应用于各种领域。Oracle 是一种关系数据库管理系统,广泛应用于企业级应用中。在实际项目中,数据备份和恢复是非常重要的工作。本文将介绍如何使用 ...
Oracle Call Interface (OCII) 是Oracle数据库提供的一种C++接口,允许开发者在C++应用程序中直接操作Oracle数据库,而无需安装完整的Oracle客户端。这个“occi连接Oracle数据库——库文件.rar”压缩包显然包含了...
总之,批量导入图片到Oracle数据库是一项涉及到Java编程、JDBC连接、SQL操作以及文件处理的任务。掌握这些技能对于处理大量图片数据的数据库应用至关重要,无论是Web应用、数据分析还是其他领域。通过理解和实践,你...
在Java编程中,批量操作数据库可以显著提高程序的性能,特别是在处理大量数据时。Oracle作为一款广泛应用的关系型数据库管理系统,其与Java的结合是企业级开发中的常见实践。本篇文章将详细探讨如何使用Java来实现...
java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle...
Java连接数据库Oracle中文乱码解决方案需要根据实际情况选择合适的解决方案,可以通过修改数据库或者项目的编码格式,或者对入库的中文进行编码转换。本文通过详细的示例代码介绍了如何解决Java连接数据库Oracle中文...
Oracle数据库的数据库安全性管理是确保数据安全的关键环节。在Oracle中,主要通过验证系统权限、角色管理和概要文件管理来实现这一目标。 首先,验证系统权限管理涉及到对用户赋予特定的系统权限,如创建表(CREATE...
在本课程设计中,我们利用Java编程语言与Oracle数据库相结合,构建了一个功能完善的学生成绩管理系统。这个系统针对管理员、教师和学生三个角色,提供了不同的权限和操作功能,旨在实现成绩的有效管理和查询。 首先...
本实例将详细介绍如何使用Java连接Oracle数据库,并提供所需的jar文件——`classes14.jar`。 首先,为了在Java中与Oracle数据库建立连接,我们需要引入Oracle的JDBC驱动程序。`classes14.jar`就是Oracle JDBC驱动的...
在Java编程中,连接Oracle数据库并执行简单的查询是常见的任务,尤其在开发企业级应用时。这个过程涉及几个关键步骤,下面将详细解释这些步骤以及相关的知识点。 首先,要连接Oracle数据库,你需要以下核心组件: ...