2014-09-26 46 views
1

首先,我必須道歉,如果這是一個愚蠢的問題,但我是PL/SQL的新手。我應該如何將鍵值傳遞給PL/SQL過程?

我正在開發一個需要與使用java和PL/SQL的Oracle數據庫進行交互的項目。我有一個不確定的鍵值列表,我想將其傳遞給數據庫,我最初的研究似乎指向了oracle.sql.STRUCT和oracle.sql.ARRAY。

我不完全贊成STRUCT和ARRAY對象,因爲它們需要數據庫端的現有對象/表類型。

編輯:在我的Java代碼

java.sql.Connection connection = myGetConnection(); 
// create variables for the oracle.sql.ARRAY 
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor("TEXT_TABLE", connection); 
Object[] arrayObject = new Object[2]; 

//create STRUCT objects 
StructDescriptor descriptor = StructDescriptor.createDescriptor("MYITEM", connection); 

// Loop through the map and put objects in the arrayObject 
for(int i = 0; i < myMap.size(); i++){ 
String key = "key"+1; 
String value = "value"+2; 
Object[] obj = {key,value}; 
STRUCT structObj = new STRUCT(descriptor, connection, obj); 

// put the struct object in the array object 
arrayObject[i] = structObj; 
} 

// create the oracle.sql.ARRAY 
ARRAY array = new ARRAY(arraydesc, connection, arrayObject); 

//.. 
oracleCallableStatement = connection.prepareCall("{call myPackage.myProcedure(?)}"); 
oracleCallableStatement.setArray(1, array); 
oracleCallableStatement.execute(); 
oracleCallableStatement.close(); 

,我要在我的oracle數據庫品牌excplictly聲明一個類型的事實

在我的PL

/SQL

CREATE OR REPLACE TYPE myItem AS object (c1 VARCHAR2(10), c2 VARCHAR2(30)); 
CREATE OR REPLACE TYPE text_table AS TABLE OF myItem ; 

我認爲必須有一種更簡單的做事方式。這些都是非常原始的對象。

這是正確的方式去做它,這真的是我唯一的選擇?

回答

2

這不是一個愚蠢的問題,你按照我的方式去做(所以我認爲這是對的,至少是!)。您必須能夠將ARRAY類型與架構級集合類型相關聯,因此必須使用SQL CREATE TYPE創建;它不能是一個包中定義的PL/SQL集合,比如說,如果可能的話它可能會更簡潔一些。 Oracle將Java數組映射到任意集合沒有什麼神奇的方法 - 您必須定義和關聯該類型,以便可以通過JDBC以可識別的流的形式發送數據。

我可能會考慮做不同的唯一事情是創建集合的表型,而不是varray

CREATE TYPE text_varray AS table OF myItem ; 

...所以你不必限制大小;但元素的順序可能很重要,並且只保留varray

另一種選擇是使用兩個varrays,一個用於鍵和一個用於值,並將兩個參數傳遞給您的過程;那麼您必須將原始Java二維數組轉換爲兩個單獨的數組。這樣做的好處是您可以使用其中一種內置類型 - sys.odcivarchar2list - 而不必創建自己的varray或對象類型。但是,由於在Java方面它更復雜,並且維護自己的類型並不是很困難,所以它可能不值得;如果您從varray更改爲table,則這不是一個選項,因爲這兩個元素的列表中的元素不一定是相同的順序。

如果您的對象定義中的字符串長度是正確的,您可能會(ab)使用sys.odciobject and sys.odciobjectlist,因爲這會給你一個類似的設置;但如果系統未來發生變化,使用自己的類型更安全,或者更有可能需要更改需要更長的字符串。

相關問題