Oracle 存儲過程 實現(xiàn) JAVA中的LIST輸入?yún)?shù) 收藏
今天周末沒事做便想來試試JAVA與ORACLE的結(jié)合程度,結(jié)果反映這兩件利器結(jié)合起來真的很厲害,前無古人,后無來者。嘿嘿~~
因為上周末幫JAVA組的同事實現(xiàn)了一個輸入數(shù)值->update記錄->返回游標(biāo)的存儲過程,這些過程很簡單。但當(dāng)時就考慮到了一個問題,因為有在JAVA代碼中調(diào)用這個存儲過程之前先要從一個XLS文件中讀取數(shù)據(jù)然后用INSERT插入ORACLE數(shù)據(jù)庫表中。但發(fā)現(xiàn)在JAVA代碼實現(xiàn)的方式是一條條記錄地INSERT進ORACLE,當(dāng)時就提出了這個問題,想在JAVA那些傳個數(shù)組對象進ORACLE存儲過程中,然后在ORACLE存儲過程代碼中分解這個數(shù)組的數(shù)據(jù),再執(zhí)行其他的操作。因此就有了下面的JAVA+ORACLE實踐日記了,嘿嘿,好久沒搞JAVA了,ArrayList都不會用了。不多說,看代碼:
首先創(chuàng)建兩個ORACLE數(shù)據(jù)類型,目的就是為了存儲結(jié)果集數(shù)據(jù)(數(shù)組等):
CREATE OR REPLACE TYPE CDW_OBJECT AS OBJECT(
FISCAL_MONTH VARCHAR2(10),
CUSTOMER_NUMBER VARCHAR2(10),
CUSTOMER_NAME VARCHAR2(50)
);
CREATE OR REPLACE TYPE CDW_TABLE AS TABLE OF CDW_OBJECT;
表結(jié)果及數(shù)據(jù):
SQL> DESC CDW_AR_SA_EXPOSURE_T;
Name Type Nullable Default Comments
--------------- ------------ -------- ------- --------
FISCAL_MONTH VARCHAR2(10) Y
CUSTOMER_NUMBER VARCHAR2(10) Y
CUSTOMER_NAME VARCHAR2(50) Y
SQL> DESC CDW_AR_SA_EXPOSURE_FACT;
Name Type Nullable Default Comments
--------------- ------------ -------- ------- --------
FISCAL_MONTH VARCHAR2(10) Y
CUSTOMER_NUMBER VARCHAR2(10) Y
CUSTOMER_NAME VARCHAR2(50) Y
SQL>
表結(jié)構(gòu)及測試數(shù)據(jù)代碼:
CREATE TABLE CDW_AR_SA_EXPOSURE_FACT (FISCAL_MONTH VARCHAR2(10),CUSTOMER_NUMBER VARCHAR2(10),CUSTOMER_NAME VARCHAR2(50));
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200708','1001','XIEFENG');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200705','1002','MANTISXF');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200706','2001','CHENGUOZHENG');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200808','3001','XIAOFANG');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200809','1056','ZIMING');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200810','7701','BOSHI');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200811','1821','BOGE');
INSERT INTO CDW_AR_SA_EXPOSURE_FACT VALUES('200903','2431','FEIZAI');
INSERT INTO CDW_AR_SA_EXPOSURE_T VALUES('200811','3301','BOSHI_HAOREN');
INSERT INTO CDW_AR_SA_EXPOSURE_T VALUES('200812','1921','BOGE_HAOREN');
INSERT INTO CDW_AR_SA_EXPOSURE_T VALUES('200905','6666','FEIZAI_HAOREN');
COMMIT;
存儲過程代碼:
CREATE OR REPLACE PROCEDURE SP_CARC_UPLOAD_FILE_TEST(OUT_CURSOR OUT SYS_REFCURSOR, V_ARRAY IN CDW_TABLE) AS
-- DECLARE THE VARIABLE AND CURSOR TYPE
V_STEP VARCHAR2(100);
VCOUNTS NUMBER;
BEGIN
V_STEP := 'INSERT RECORDS FROM ARRAY';
FOR I IN 1..V_ARRAY.COUNT LOOP
INSERT INTO CDW_AR_SA_EXPOSURE_T VALUES
(
V_ARRAY(I).FISCAL_MONTH,
V_ARRAY(I).CUSTOMER_NUMBER,
V_ARRAY(I).CUSTOMER_NAME
);
DBMS_OUTPUT.PUT_LINE('FISCAL_MONTH: '||V_ARRAY(I).FISCAL_MONTH);
DBMS_OUTPUT.PUT_LINE('CUSTOMER_NUMBER: '||V_ARRAY(I).CUSTOMER_NUMBER);
DBMS_OUTPUT.PUT_LINE('CUSTOMER_NAME: '||V_ARRAY(I).CUSTOMER_NAME);
IF MOD(I,1000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
V_STEP := 'GET THE INVALID CUSTOMER COUNT';
SELECT COUNT(1)
INTO VCOUNTS
FROM CDW_AR_SA_EXPOSURE_T STG
WHERE NOT EXISTS (SELECT 1
FROM CDW_AR_SA_EXPOSURE_FACT FACT
WHERE STG.CUSTOMER_NUMBER = FACT.CUSTOMER_NUMBER
AND STG.FISCAL_MONTH = FACT.FISCAL_MONTH);
--FETCH CUR_MATCH_USERID INTO RT_CUR_MATCH_USERID;
IF VCOUNTS = 0 THEN
V_STEP := 'UPDATE USER_INFORMATION';
DBMS_OUTPUT.PUT_LINE('UPDATED SQL COUNT: ' || SQL%ROWCOUNT);
OPEN OUT_CURSOR FOR SELECT DUMMY AS CUSTOMER_NUMBER FROM DUAL WHERE ROWNUM < 1;
ELSE
V_STEP := 'RETURN CURSOR WHICH STORED ALL INVILD CUSTOMER_DETAILS';
OPEN OUT_CURSOR FOR
SELECT CUSTOMER_NUMBER
FROM CDW_AR_SA_EXPOSURE_T STG
WHERE NOT EXISTS (SELECT 1
FROM CDW_AR_SA_EXPOSURE_FACT FACT
WHERE STG.CUSTOMER_NUMBER = FACT.CUSTOMER_NUMBER
AND STG.FISCAL_MONTH = FACT.FISCAL_MONTH);
END IF;
V_STEP := 'DELETE DATA FROM TABLE CDW_AR_SA_EXPOSURE_T';
/*DELETE FROM CDW.CDW_AR_SA_EXPOSURE_T;
COMMIT;*/
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
--EXECUTE IMMEDIATE 'TRUNCATE TABLE CDW_AR_SA_EXPOSURE_T REUSE STORAGE';
DBMS_OUTPUT.PUT_LINE('Error at :' || V_STEP);
DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SQLERRM);
END;
END SP_CARC_UPLOAD_FILE_TEST;
JAVA 代碼:
import oracle.sql.*;
import java.sql.*;
import oracle.jdbc.driver.*;
import java.util.*;
public class ArrayTest {
static public Connection conn;
static public OracleCallableStatement stmt = null;
public Connection getConnectionDB()throws SQLException, ClassNotFoundException{
Class.forName("oracle.jdbc.driver.OracleDriver");
// B. 創(chuàng)新新數(shù)據(jù)庫連接
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:Oraxf", "scott", "tiger");
DatabaseMetaData md = conn.getMetaData();
System.out.println("數(shù)據(jù)庫版本:");
System.out.println("------------------------------------------------");
System.out.println(md.getDatabaseProductVersion());
System.out.println();
System.out.println("驅(qū)動程序名稱與版本:");
System.out.println("------------------------------------------------");
System.out.print(md.getDriverName() + " " + md.getDriverVersion());
return conn;
}
public static void main(String[] my)throws SQLException, ClassNotFoundException{
try{
ArrayTest at = new ArrayTest();
at.getConnectionDB();
ArrayList myArray = new ArrayList();
String[][] values = {
{"200811","3301","BOSHI_HAOREN"},
{"200812","1921","BOGE_HAOREN"},
{"200905","6666","FEIZAI_HAOREN"}
};
myArray.add(values);
ARRAY array = getArray("CDW_OBJECT","CDW_TABLE",myArray);
stmt = (OracleCallableStatement)conn.prepareCall("begin SP_CARC_UPLOAD_FILE_TEST(?,?); end;");
stmt.registerOutParameter(1, OracleTypes.CURSOR,"OUT_CURSOR");
stmt.setArray(2, array);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(1);
while(rs.next()){
String CUSTOMER_NUMBER = rs.getString("CUSTOMER_NUMBER");
System.out.println("CUSTOMER_NUMBER: "+CUSTOMER_NUMBER);
}
at.closeConnectionDB();
}
catch(Exception e){
e.printStackTrace();
}
}
public static ARRAY getArray(String OracleObj,String OracleTbl, ArrayList alist) throws Exception{
// my code
ARRAY list = null;
if (alist != null && alist.size() > 0){
StructDescriptor structdesc = new StructDescriptor(OracleObj,conn);
//STRUCT[] structs = new STRUCT[alist.size()];
Object[] result = null;
//String[][] myArray = new String[alist.size()][3];
//alist.toArray(myArray);
/* for(int i=0;i<alist.size();i++){
String obj[] = (String [])alist.get(i);
result = new Object[3];
result[0] = obj[0].toString();
result[1] = obj[1].toString();
result[2] = obj[2].toString();
structs[i] = new STRUCT(structdesc,conn,result);
}
for(int i=0;i<alist.size();i++){
ResultSet rs = (ResultSet)alist.get(i);
for(int j=0;j<3;j++){
result = new Object[3];
result[0] = rs.getObject(1).toString();
result[1] = rs.getObject(2).toString();
result[2] = rs.getObject(3).toString();
}
structs[i] = new STRUCT(structdesc,conn,result);
}*/
Object[] o1 = new Object[]{"200811","3301","BOSHI_HAOREN"};
Object[] o2 = new Object[]{"200812","1921","BOGE_HAOREN"};
Object[] o3 = new Object[]{"200905","6666","FEIZAI_HAOREN"};
STRUCT s1 = new STRUCT(structdesc, conn, o1);
STRUCT s2 = new STRUCT(structdesc, conn, o2);
STRUCT s3 = new STRUCT(structdesc, conn, o3);
STRUCT[] structs = {s1,s2,s3};
/*
for(int i=0;i<alist.size();i++){
result = new Object[3];
result[0] = myArray[i][0].toString();
result[1] = myArray[i][1].toString();
result[2] = myArray[i][2].toString();
structs[i] = new STRUCT(structdesc,conn,result);
}*/
ArrayDescriptor arraydesc = new ArrayDescriptor(OracleTbl,conn);
list = new ARRAY(arraydesc,conn,structs);
}
return list;
}
public void closeConnectionDB()throws SQLException{
conn.close();
}
}
輸出結(jié)果:
-- JAVA 控制臺
數(shù)據(jù)庫版本:
------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
驅(qū)動程序名稱與版本:
------------------------------------------------
Oracle JDBC driver 10.1.0.2.0CUSTOMER_NUMBER: 6666
CUSTOMER_NUMBER: 1921
CUSTOMER_NUMBER: 3301
-- 數(shù)據(jù)庫SQLPLUS
SQL> SELECT * FROM CDW_AR_SA_EXPOSURE_T;
FISCAL_MONTH CUSTOMER_NUMBER CUSTOMER_NAME
------------ --------------- --------------------------------------------------
200811 3301 BOSHI_HAOREN
200812 1921 BOGE_HAOREN
200905 6666 FEIZAI_HAOREN
SQL>
在跑JAVA代碼時可能會出現(xiàn)相關(guān)問題:
java程序中使用Oracle的對象:
StructDescriptor structdesc = new StructDescriptor(OracleObj,conn);
出現(xiàn)這個錯誤:
java.sql.SQLException: Fail to construct descriptor: Invalid arguments
java.sql.SQLException: 無法構(gòu)造描述符: Invalid arguments
原因為數(shù)據(jù)庫連接dbConn為空,可是這種Exception著實有點讓人迷糊。切記:友好的提示信息對問題的定位和解決非常重要。
如果有什么問題歡迎指出。希望對大家有所幫助。
Good luck~~
發(fā)表于 @ 2008年09月07日 23:47:00 | 評論( 3 ) | 編輯| 舉報| 收藏
舊一篇:ORACLE 連續(xù)數(shù) 并以逗號分隔 顯示的問題 | 新一篇:PACKAGE 可變數(shù)組+行組觸發(fā)器+表級觸發(fā)器 解決數(shù)據(jù)操作問題
-
查看最新精華文章 請訪問博客首頁相關(guān)文章
ERP初階(一):走近ERP利用MFC 在運行中動態(tài)創(chuàng)建新窗口ERP初階(十一):ERP的實施過程微軟面試題之?dāng)?shù)字謎題手工構(gòu)造一個超微型的 PE 文件一段優(yōu)化排序的Sql語句一個數(shù)字顯示管的小程序調(diào)用MSN發(fā)消息mir2ming 發(fā)表于2009年6月12日 20:37:54 IP:舉報回復(fù)刪除
good job...... and Thanks so much, my best freid . :) jijianshuai 發(fā)表于2009年8月20日 13:51:51 IP:舉報回復(fù)刪除
好東西~~fuyou001 發(fā)表于2009年8月21日 14:39:03 IP:舉報回復(fù)刪除
不錯,可以學(xué)習(xí)下,建議樓主要是格式化下代碼,那就是更好了發(fā)表評論表 情: 評論內(nèi)容: 用 戶 名:登錄 注冊 匿名評論 匿名用戶驗 證 碼: 重新獲得驗證碼
專區(qū)推薦內(nèi)容點評三星Smart TV智能電視
太震撼了!首次參加IDF有感
【教程】基于VC色溫圖效果實現(xiàn)
【教程】游戲技巧特效處理
Firefox 4在meego上成功安裝
IDF2011:多圖詳解MeeGo 3月后正式發(fā)布
PayPal助力移動支付應(yīng)用
Android應(yīng)用換電視,前30名有效!
【教程】筆記本安裝MeeGo
微軟BI解決方案開發(fā)簡介
下載Windows Phone 中文培訓(xùn)包
下載 Windows Phone 開發(fā)工具
全新Windows Phone 開發(fā)中心
VS2010 SharePoint 入門
【免費下載】WebMatrix建站工具
AIX 專區(qū)有獎話題討論
4.21日Adobe企業(yè)RIA開發(fā)者研討會
MeeGo中文社區(qū)全新呈現(xiàn)
羨慕嫉妒恨!MeeGO平板到手
MeeGo SDK 1.2 for Linux 初窺
2011臺北國際電腦展開幕(5.31-6.4)
關(guān)于QT編程入門的那些事
相見 ——“人生若只如初見”
游戲遠程代碼注入和動態(tài)連接庫的使用
哥是傳奇—組團參賽心得
【教程】Windows平臺下MeeGo v1.2 SDK的安裝
MeeGo 1.2 正式版發(fā)布
在生命走到盡頭前用腳貢獻了最后一個代碼補丁
淺談QT中窗口刷新事件
贏筆記本電腦,提升管理軟件新水平!
【教程】安裝MeeGO和Windows 7雙系統(tǒng)的方法
分享我的個人初賽體會
【免費】參與移動應(yīng)用投票贏手機話費
Nokia宣布Qt 5計劃
立即加入IBM dW,萬千技術(shù)盡網(wǎng)羅
Linux 上簡單的MeeGo 開發(fā) QT 程序
軟件產(chǎn)品性能優(yōu)化注意事項
用C#實現(xiàn)HTTP協(xié)議下的多線程文件傳輸
【實戰(zhàn)】搭建Meego Tablet開發(fā)測試平臺
AppUp Center為更多程序員創(chuàng)造機會
【源碼分享】一個多線程下載文件的程序
輕松漫畫聊快速構(gòu)建網(wǎng)站
如何創(chuàng)建一個簡單的Qt應(yīng)用程序
【贏取舊金山之旅】2011線程挑戰(zhàn)賽
【圖】愛上NOOK COLOR的5個理由
IPAD&NOOK COLOR屏幕對比多圖
【教程】AppUp 進階基礎(chǔ)篇
Nokia CEO:下一步會與誰合作?
<<>> 熱門招聘職位 【更多】【傲盾軟件】高薪誠聘C、C++、JAVA、cavium/linux工程師
【道達天際】高薪誠聘:滲透測試、網(wǎng)絡(luò)安全、逆向技術(shù)分析 專業(yè)人才
誠聘高級軟件工程師,架構(gòu)師,待遇從優(yōu)
【山重融資】誠聘軟件開發(fā)工程師、網(wǎng)絡(luò)管理工程師
【卓坤信息】誠聘MFC高級客戶端、網(wǎng)頁設(shè)計師、PHP開發(fā)等
愛福康誠招:C++ / Directshow 軟件工程師
【天健集團】誠聘架構(gòu)師,高級軟件開發(fā)工程師(.NET、PB、J2EE),實施人員
愛唱數(shù)碼誠聘 研發(fā)經(jīng)理&程序員
【北京聯(lián)銀通科技有限制公司】高薪誠聘技術(shù)經(jīng)理、高級工程師等職位
【安博教育】誠聘軟件開發(fā)、架構(gòu)師、技術(shù)總監(jiān)等技術(shù)人才
【Autodesk】歐特克軟件(中國)誠聘軟件開發(fā),測試,研究員
【北京平川嘉恒】團隊Leader及客戶端/服務(wù)器端研發(fā)工程師
【歡網(wǎng)科技】誠聘系統(tǒng)架構(gòu)師、需求分析師、開發(fā)工程師
【酷狗音樂】誠聘VC、服務(wù)端開發(fā)工程師等職位
【法國電信】誠聘研發(fā)類人才
【飛漫公司】誠聘C/C++研發(fā)工程師、軟件測試等!
【上海電科智能】高新誠聘JAVA和C#等軟件工程師
【仙掌軟件】高新誠聘java、android、iPhone軟件工程師等職位,期待您的加入!
【完美世界】(原完美時空)誠聘各類游戲領(lǐng)域人才
【億陽信通】誠邀您的加盟!
【Amazon】亞馬遜誠聘技術(shù)專家!
【航天信息股份有限公司】誠聘系統(tǒng)架構(gòu),需求分析、JAVA開發(fā)、C/C++開發(fā)研發(fā)崗位熱招中
【杭州引力】高薪誠聘ios開發(fā)人員
【 CSDN】高薪誠聘:java、運營、就業(yè)、商務(wù)策劃經(jīng)理、網(wǎng)站編輯!
【傲盾軟件】高薪誠聘C、C++、JAVA、cavium/linux工程師
【道達天際】高薪誠聘:滲透測試、網(wǎng)絡(luò)安全、逆向技術(shù)分析 專業(yè)人才
誠聘高級軟件工程師,架構(gòu)師,待遇從優(yōu)
【山重融資】誠聘軟件開發(fā)工程師、網(wǎng)絡(luò)管理工程師
【卓坤信息】誠聘MFC高級客戶端、網(wǎng)頁設(shè)計師、PHP開發(fā)等
愛??嫡\招:C++ / Directshow 軟件工程師
【天健集團】誠聘架構(gòu)師,高級軟件開發(fā)工程師(.NET、PB、J2EE),實施人員
愛唱數(shù)碼誠聘 研發(fā)經(jīng)理&程序員
【北京聯(lián)銀通科技有限制公司】高薪誠聘技術(shù)經(jīng)理、高級工程師等職位
【安博教育】誠聘軟件開發(fā)、架構(gòu)師、技術(shù)總監(jiān)等技術(shù)人才
【Autodesk】歐特克軟件(中國)誠聘軟件開發(fā),測試,研究員
【北京平川嘉恒】團隊Leader及客戶端/服務(wù)器端研發(fā)工程師
【歡網(wǎng)科技】誠聘系統(tǒng)架構(gòu)師、需求分析師、開發(fā)工程師
【酷狗音樂】誠聘VC、服務(wù)端開發(fā)工程師等職位
【法國電信】誠聘研發(fā)類人才
【飛漫公司】誠聘C/C++研發(fā)工程師、軟件測試等!
【上海電科智能】高新誠聘JAVA和C#等軟件工程師
【仙掌軟件】高新誠聘java、android、iPhone軟件工程師等職位,期待您的加入!
【完美世界】(原完美時空)誠聘各類游戲領(lǐng)域人才
【億陽信通】誠邀您的加盟!
【Amazon】亞馬遜誠聘技術(shù)專家!
【航天信息股份有限公司】誠聘系統(tǒng)架構(gòu),需求分析、JAVA開發(fā)、C/C++開發(fā)研發(fā)崗位熱招中
【杭州引力】高薪誠聘ios開發(fā)人員
【 CSDN】高薪誠聘:java、運營、就業(yè)、商務(wù)策劃經(jīng)理、網(wǎng)站編輯!
. 公司簡介|招賢納士|廣告服務(wù)|銀行匯款賬號|聯(lián)系方式|版權(quán)聲明|法律顧問|問題報告
北京創(chuàng)新樂知信息技術(shù)有限公司 版權(quán)所有, 京 ICP 證 070598 號
世紀(jì)樂知(北京)網(wǎng)絡(luò)技術(shù)有限公司 提供技術(shù)支持
江蘇樂知網(wǎng)絡(luò)技術(shù)有限公司 提供商務(wù)支持
Email:webmaster@csdn.net
Copyright © 1999-2011, CSDN.NET, All Rights Reserved