如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程
http://blog.csdn.net/dutguoyi/article/details/1879416
為了減少連接Oracle數據庫的數量,需要將多條數據作為變量一次傳入Oracle的存儲過程中。方法如下:
步驟一:定義對象類型。?
CREATE?TYPE?department_type?AS?OBJECT?(DNO?NUMBER?(10),
NAME?VARCHAR2?(50),
LOCATION?VARCHAR2?(50)
);
步驟二:定義一個對象類型的數組對象。
CREATE?TYPE?dept_array?AS?TABLE?OF?department_type;步驟三:定義存儲過程來插入數據。
CREATE?OR?REPLACE?PACKAGE?objecttype?AS??PROCEDURE?insert_object?(d?dept_array);
END?objecttype;
CREATE?OR?REPLACE?PACKAGE?BODY?objecttype
AS
PROCEDURE?insert_object?(d?dept_array)
AS
BEGIN
FOR?i?IN?d.FIRST..d.LAST
LOOP
INSERT?INTO?department_teststruct
VALUES?(d(i).dno,d(i).name,d(i).location);
END?LOOP;
END?insert_object;?
END?objecttype;
步驟四(可選步驟,即可以不做):定義一個Java class來映射對象中類型。
步驟五:定義Java方法來調用存儲過程。?
import?java.sql.DriverManager;
import?oracle.jdbc.OracleCallableStatement;
import?oracle.sql.ARRAY;
import?oracle.sql.ArrayDescriptor;
import?oracle.sql.STRUCT;
import?oracle.sql.StructDescriptor;
public?class?TestStruct?...{
????public?static?void?main(String[]?args)
????...{
????????????sendStruct();
????}
????public?static?void?sendStruct()?
????...{
????????Connection?dbConn?=?null;
????????try...{????
????????????Object[]?so1?=?...{"10","Accounts","LHR"};?
????????????Object[]?so2?=?...{"20","HR","ISB"};?
????????????OracleCallableStatement?callStatement?=?null;?
????????????Class.forName("oracle.jdbc.driver.OracleDriver");
????????????dbConn?=?DriverManager.getConnection("jdbc:oracle:thin:@ServerName:Port:ORa",?"UserName",?"Password");
????????????StructDescriptor?st?=?new?StructDescriptor("DEPARTMENT_TYPE",dbConn);
????????????STRUCT?s1?=?new?STRUCT(st,dbConn,so1);
????????????STRUCT?s2?=?new?STRUCT(st,dbConn,so2);
????????????STRUCT[]?deptArray?=?...{s1,s2};
????????????ArrayDescriptor?arrayDept?=?ArrayDescriptor.createDescriptor("DEPT_ARRAY",?dbConn);
????????????ARRAY?deptArrayObject?=?new?ARRAY(arrayDept,?dbConn,?deptArray);?
????????????callStatement?=?(OracleCallableStatement)dbConn.prepareCall("{call?insert_object(?)}");
????????????((OracleCallableStatement)callStatement).setArray(1,?deptArrayObject);
????????????callStatement.executeUpdate();?
????????????dbConn.commit();
????????????callStatement.close();?
????????}?
????????catch(Exception?e)...{?
????????????System.out.println(e.toString());
????????}
????}
}
jdbc:oracle:thin:??????????? --Oracle數據庫驅動標識
ServerName:???????????????? --Oracle數據庫所有機器名或IP地址
1521:????????????????????????? ?--數據庫所使用的端口號
ORa???????????????????????????? --Oracle服務名???
?
注意事項:
1.?首先一個操作是手動連接Oracle建立對象,接下來的操作是通過JAVA程序建立數據庫連接來使用對象。如果兩個操作使用同一個用戶就沒有問題,如果是不同的用戶那么要確保第二個操作(即通過Java程序)的用戶有權限來操作第一個用戶建立的對象。第一個用戶為它添加權限的方法是:在每個對象中大家可以找到權限一項,找到對應用戶添加執行權限即可。而在程序中就需要做一些修改。存儲過程同理。 ???StructDescriptor?st?=?new?StructDescriptor("第一個UserName.DEPARTMENT_TYPE",dbConn); ????? ArrayDescriptor?arrayDept?=?ArrayDescriptor.createDescriptor("第一個UserName.DEPT_ARRAY",?dbConn); ????? callStatement?=?(OracleCallableStatement)dbConn.prepareCall("{call?第一個UserName.insert_object(?)}");結果是Java中雖然只是一次執行連接數據庫,但是卻一次插入兩條數據。希望能夠給尋找類似解決方案的兄弟姐妹提供一點幫助。有什么建議或者意見盡管留言,謝謝。
參考資料:
1. 大家可以在下面的鏈接中找到javadoc文件來進行下載,這是一個非常有用的說明文檔,這次我主要用到了DriverManager.getConnection的定義方法。
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101020.html
?
總結
以上是生活随笔為你收集整理的如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle cast multiset
- 下一篇: 关于eclipse不编译项目的问题解决