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

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

create table TEST_TABLE

(

yid      NUMBER,

ytel     VARCHAR2(50),

yanumber VARCHAR2(50)

);

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

第一种:

在数据库中建立相应的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代码:

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.ArrayList;

import com.chinaboxun.ordermanager.core.util.DbUtil;

import oracle.jdbc.driver.OracleCallableStatement;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

import oracle.sql.STRUCT;

import oracle.sql.StructDescriptor;

@SuppressWarnings("unchecked")

public class TestProc {

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 

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;

}

}

第二种:不用判断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代码:

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.ArrayList;

import com.chinaboxun.ordermanager.core.util.DbUtil;

import oracle.jdbc.driver.OracleCallableStatement;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

import oracle.sql.STRUCT;

import oracle.sql.StructDescriptor;

@SuppressWarnings("unchecked")

public class TestProc {

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();

if (1 == 1 )

{

Object[] s1 = new Object[10000];

Object[] s2 = new Object[10000];

Object[] s3 = new Object[10000];

for (int i = 0; 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();

}

}

}

}

DbUtil工具类:

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("/com/chinaboxun/ordermanager/config/ordermanager.properties");

try {

properties.load(in);

} catch (IOException ex) {

System.out.println(ex.getMessage());

ex.printStackTrace();

}

}

/**

获取连接对象

*

* @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;

}

}

ordermanager.properties属性文件:

jdbc.driverClassName=oracle.jdbc.OracleDriver

jdbc.url=jdbc:oracle:thin:@172.16.0.162:1521:ORCL

jdbc.username=m_order

jdbc.password=morder

最后:一定要记得导入orai18n.jar否则一遇到字符串就乱码、添加不到数据!

----------------编辑:20140110---------------

一些加上jar继续报错如下错误的朋友可以考虑以下解决方案:

ERROR1:Non supported character set: oracle-character-set-852

ERROR2:oracle/i18n/text/converter/CharacterConverterOGS.getInstance(I)Loracle/i18n/text/converter/CharacterConverter;

以上两个错误可以采取一个方案,就是把type的数据类型改成:nVARCHAR2

如果坚持使用该jar的童鞋请将 nls_charset12.jar 加入到 classpath 中。在加上orai18n.jar

----------------编辑:20140110---------------

我被这个可整惨了!

尼玛、老子这牙齿疼死我了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj 1036 树的统计Count

题意&#xff1a;... 解法&#xff1a;树链剖分&#xff0c;对点进行重编号&#xff0c;这样的话线段树中点的信息就是树中点的信息。。。别的很常规。。。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #define N 300105 #define lson l,m…

LeetCode 1500. Design a File Sharing System(哈希map+优先队列)

文章目录1. 题目2. 解题1. 题目 We will use a file-sharing system to share a very large file which consists of m small chunks with IDs from 1 to m. When users join the system, the system should assign a unique ID to them. The unique ID should be used once …

mupdf java_mupdf库学习

http://macleo.iteye.com/blog/1544948Java代码freetye-config --cflags2.C语言的用处其实还是很大的....C也一样&#xff0c;不经意处C语言还在发挥着巨大的作用3.踏破铁鞋无觅处啊http://zhiweiofli.iteye.com/blog/9050694.Bitmap旋转http://blog.sina.com.cn/s/blog_625def…

Centos或者Redhet开通telnet

我参考了两篇文章&#xff1a; 1、51cto的这篇最全&#xff1a; http://blog.chinaunix.net/uid-21134884-id-3015272.html 2、本园子里面的&#xff1a; http://www.cnblogs.com/xlmeng1988/archive/2012/04/24/telnet-server.html转载于:https://www.cnblogs.com/diyunpeng/a…

LeetCode 425. 单词方块(Trie树+DFS)

文章目录1. 题目2. 解题1. 题目 给定一个单词集合 &#xff08;没有重复&#xff09;&#xff0c;找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。 例如&#xff0c;单…

python numpy pandas 书 全_用Python做数据分析,Numpy,Pandas,matp

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼用Python做数据分析&#xff0c;Numpy&#xff0c;Pandas&#xff0c;matplotlib是怎么也绕不开的三个包&#xff0c;我最开始学习pandas是看的《利用Python进行数据分析》&#xff0c;看了好几遍&#xff0c;不是从头到尾看了好几…

打开约束指令,让编码更规范

如果你使用perl5.12 或更高的版本&#xff0c;可以显示的指定当前Perl版本号来自动打开约束指令。 use 5.012; #自动启用use strict 指令 之前的版本通过添加下边这句话 use strict; 通过启用约束指令&#xff0c;编程时常见的错误很容易暴露出来。 而启用warnings指令的话&…

LeetCode 642. 设计搜索自动补全系统(Trie树)

文章目录1. 题目2. 解题1. 题目 为搜索引擎设计一个搜索自动补全系统。 用户会输入一条语句&#xff08;最少包含一个字母&#xff0c;以特殊字符 ‘#’ 结尾&#xff09;。 除 ‘#’ 以外用户输入的每个字符&#xff0c;返回历史中热度前三并以当前输入部分为前缀的句子。下面…

python 动漫卡通人物图片大全_用Python把人物头像动漫化,不同的表情给你不同的惊喜...

前言最近上网冲浪的时候看到了一个有趣的东西&#xff0c;叫做『人物动漫化』&#xff0c;作为老大的粉丝&#xff0c;怎么可能放过这个机会&#xff0c;让我们先看看效果图&#xff1a;这就是这次要用Python搞的事情啦&#xff0c;我们会利用百度AI的人物动漫化技术&#xff0…

linux 命令学习记录

文件操作 chown -R user file 修改文件所有者chmod -R 777 file 修改文件权限wrxmkdir -p dir1/dir2/dir3 创建目录rmdir -p dir1/dir2/dir3 删除目录&#xff08;目录为空&#xff09;cp source target 复制source到targetcp -s source target 创建target 软链接到source &…

“后见之明”是冰冷刻薄的讥讽;这是一种病,得治。

我最讨厌的一类人就是&#xff0c;“嗯&#xff0c;我早就说过吧”、“你看&#xff0c;我没说错吧”。这不是高明&#xff0c;而是无耻无德无道无义。你早知 道为什么不说&#xff1f;你早发现为什么不阻止&#xff1f;你早有能耐为什么到现在才和我扯淡&#xff1f;“后见之明…

LeetCode MySQL 1264. 页面推荐(union)

文章目录1. 题目2. 解题1. 题目 朋友关系列表&#xff1a; Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ 这张表的主键是 (user1_id, use…

java从1开始计时用线程_java – Python – 线程,计时或函数使用?

我正在制定一个关于如何解决这个问题的想法.请帮忙.我的项目包含一个N x N网格,其中包含一系列块,这些块应该在随机方向和随机速度内移动(每隔0.1秒,块的位置用速度更新).我有三个“特殊”块,预计会有各自的移动功能.我将有其他块(其中许多)除了更新它们的位置之外什么都不做,并…

LeetCode MySQL 1070. 产品销售分析 III(group by 陷阱)

文章目录1. 题目2. 解题1. 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------…

java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里

1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls)&#xff0c;也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语&#xff1a;工作薄)&#xff0c;下面的代码片段举例说明了应该如何操作&#xff1a;(完整代码见Excel…

怎样在方框里打钩?

打开Microsoft Office Word 2003文档&#xff0c;鼠标单击菜单栏“插入”下拉菜单中的“符号”&#xff0c;选择“符号”对话框中的“符号”标签&#xff0c;在“字体”中选择“Wingdings 2”&#xff0c;即可在众多符号中找到“方框里面打钩的符号”。转载于:https://www.cnbl…

LeetCode MySQL 1364. 顾客的可信联系人数量

文章目录1. 题目2. 解题1. 题目 顾客表&#xff1a;Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | customer_name | varchar | | email | varchar | ------------------------ customer_…

JS控制锚点打开新窗口

在XHTML中不能含有TARGET&#xff0c;那么要使链接打开新窗口的话&#xff0c; 如果针对页面上所有锚点&#xff0c;JAVASCRIPT如下即可&#xff1a; function externalLinks() {if (!document.getElementsByTagName) return;var anchors document.getElementsByTagName("…

java showinputdialog_java - JOptionPane.showInputDialog中的多个输入

有没有一种方法可以在JOptionPane.showInputDialog中创建多个输入&#xff0c;而不是只创建一个输入&#xff1f;最佳答案&#xff1a;对。您知道可以将任何Object放入大多数Object的JOptionPane.showXXX methods参数中&#xff0c;并且经常会发现Object恰好是一个JPanel参数。…

LeetCode MySQL 602. 好友申请 II :谁有最多的好友(union all)

文章目录1. 题目2. 解题1. 题目 在 Facebook 或者 Twitter 这样的社交应用中&#xff0c;人们经常会发好友申请也会收到其他人的好友申请。 表 request_accepted 存储了所有好友申请通过的数据记录&#xff0c;其中&#xff0c; requester_id 和 accepter_id 都是用户的编号。…