2016-12-18 28 views
1

我試圖從java傳遞數組值到PL/SQL函數。我想下面,將字符串數組傳遞給來自java的pl/sql函數

String[] array = {"70" , "2" , "4" , "9" , "329" , "13" , "49" , "33"}; 
Connection cnn=DriverManager.getConnection(url, username, password); 
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VLIST", cnn); 
ARRAY array_to_pass = new ARRAY(descriptor, cnn,array); 
OracleCallableStatement pstmt = (OracleCallableStatement) cnn.prepareCall("{? = call GETSRCHLST2(?)}"); 
pstmt.registerOutParameter(1, Types.VARCHAR); 
pstmt.setArray(2, array_to_pass); 
pstmt.execute(); 
String output = pstmt.getString(1); 
out.println(output+"\n"+ " "+array_to_pass.length()); 

在這裏,在函數調用沒有數組的內容獲得通過,但array_to_pass.length()是8

Oracle過程:

CREATE OR REPLACE FUNCTION EDR.GETSRCHLST2(VV VLIST) RETURN VARCHAR2 IS 

BN NUMBER; 
STRS VARCHAR2(9000):='start'; 
HH varchar2(30); 

BEGIN 

STRS:=STRS || '- LIST COUNT: '||VV.COUNT||' - '; 
BN:=VV.FIRST; 

WHILE BN IS NOT NULL 
LOOP 

    HH:=VV(BN); 
    STRS:=STRS||HH||' , '; 
    BN := VV.NEXT(BN); 

END LOOP; 

RETURN STRS; 

EXCEPTION WHEN OTHERS THEN RETURN 'SOME ERROR'||SQLERRM; 
end; 

人告訴我,我哪裏出錯了?

+0

請參閱:http://stackoverflow.com/questions/5198856/pass-array-to-oracle-procedure – Kacper

+0

感謝您的答覆。我曾試過這個,但沒用。 – techhunter

+2

嗨,您可以發佈您的** VLIST **類型聲明或DDL嗎? – hmmftg

回答

0

希望它可以幫助那些尋找相同解決方案的人。

CREATE OR REPLACE 
TYPE DR.VLIST AS TABLE OF VARCHAR2(50) 

但是,從數組傳遞的值不會與VARCHAR匹配,而是會期望NVARCHAR。所以做了一個小小的變化,

CREATE OR REPLACE 
TYPE DR.VLIST AS TABLE OF NVARCHAR2(50) 

它解決了我的問題。