Oracle bulk Insert的用法

本文介绍如何使用Oracle PL/SQL过程和Java程序实现数据批量插入到Oracle数据库的方法。通过定义类型、创建存储过程并结合Java代码调用,实现了高效的数据批量加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建一个简单的数据库表:

create table T_NAME
(
  id   NUMBER not null,
  name VARCHAR2(20)
)

alter table T_NAME
  add constraint PRIMARY_ID primary key (ID);


字段

字段长度

Nullable

Key

ID

NUMBER(6)

Not Nulll

Primary

NAME

varchar2(20)

 

 


根据相应的表结构创建过程

create or replace type ID_TABLE is table of number(10);  
create or replace type NAME_TABLE is table of varchar2(20);  
create or replace procedure pro_foralls_insert(v_1 ID_TABLE ,v_2 NAME_TABLE )  
as  
c integer;  
begin  
forall i in 1.. v_1.count   
insert into T_NAME values(v_1(i),v_2(i));  
end;  

接着就写相应的java程序做测试

import java.sql.*;  
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;


public class TestTest {  
private static final String sql="select max(id) from T_NAME";
private static final String jdbcUrl="jdbc:oracle:thin:@10.108.67.51:1521:orcl";
private static final String jdbcUser="b2cmonitor";
private static final String jdbcPassword="b2cmonitor";
private static int maxID;
public TestTest() {  
Connection conn = null;
Statement stmt=null;
CallableStatement cstmt = null;  
ResultSet rs=null;

try {  
Class.forName("oracle.jdbc.driver.OracleDriver");  
conn = DriverManager.getConnection(jdbcUrl, jdbcUser,jdbcPassword);  
conn.setAutoCommit(false);  
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
while(rs.next()){
maxID=rs.getInt("MAX(ID)");
}
}
catch (ClassNotFoundException ex) {
ex.printStackTrace();
}  
catch (SQLException ex) {  
ex.printStackTrace();  


ArrayDescriptor a = null;  
ArrayDescriptor b = null;  
Object[] s1 = new Object[100000];  
Object[] s2 = new Object[100000];  
System.out.println(maxID);
for (int i = 0; i < 100000; i++) {  
s1[i] = i+1+maxID;
s2[i] = "SSSS";  
}  
try {
a = oracle.sql.ArrayDescriptor.createDescriptor("ID_TABLE", conn);
b = oracle.sql.ArrayDescriptor.createDescriptor("NAME_TABLE", conn);  
ARRAY a_test = new ARRAY(a, conn, s1);  
ARRAY b_test = new ARRAY(b, conn, s2);  
cstmt = conn.prepareCall("{ call pro_foralls_insert(?,?) }"); 
cstmt.setObject(1, a_test);  
cstmt.setObject(2, b_test);  
System.out.println(System.currentTimeMillis());  
cstmt.execute();  
conn.commit();  
rs.close();
rs=null;
stmt.close();
stmt=null;
cstmt.close();
cstmt=null;
conn.close();
conn=null;

} catch (SQLException e) {
e.printStackTrace();
}  

}
public static void main(String args[]) {  
TestTest a = new TestTest();  
}  


}  




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值