日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2024/7/5 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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---------------

我被這個可整慘了!

尼瑪、老子這牙齒疼死我了!!!

總結

以上是生活随笔為你收集整理的java 批量入库oracle_java操作Oracle数据库——ARRAY、TABLE类型批量入库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。