2016-12-18 2 views
1

Ich versuche Array von Werten von Java zu PL/SQL-Funktion übergeben. Ich versuche, wie unten,Übergabe Array von String zu PL/SQL-Funktion von Java

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()); 

Hier in der Funktion keinen Inhalt von Array nennen geleitet wird immer aber array_to_pass.length() ist 8.

Oracle-Prozedur:

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; 

Kann jemand Sag mir, wo ich falsch liege?

+0

Siehe das: http://stackoverflow.com/questions/5198856/pass-array-to-oracle-procedure – Kacper

+0

Danke für die Antwort. Ich hatte dieses versucht, aber keinen Nutzen. – techhunter

+2

Hallo, können Sie bitte Ihre ** VLIST ** Typ Erklärung oder DDL posten? – hmmftg

Antwort

0

Ich hoffe, es kann denen helfen, die auf der Suche nach der gleichen Lösung sind.

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

Aber der Wert von Java in Array übergeben wird VARCHAR nicht statt übereinstimmen es NVARCHAR erwartet. So machte eine kleine Änderungen wie,

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

es löste mein Problem.

0

oracle.sql.ARRAY ist veraltet. Stattdessen können Sie OracleConnection.createOracleArray(String arrayTypeName, Object elements)
Hinweis rufen, dass arrayTypeName die Tabelle von Typ sein sollte und elements sollten Sie Ihre Java-Array sein T[] wo T dem Typ entspricht, dass arrayTypeName ist eine Liste mit. (Dies kann eine Klasse implementieren SQLData sein)

Für weitere Informationen finden Sie möglicherweise meine my answer on getArray() and writeArray() nützlich.

Verwandte Themen