从java向pl/sql函数传递字符串数组

从java向pl/sql函数传递字符串数组,java,arrays,oracle,jdbc,plsql,Java,Arrays,Oracle,Jdbc,Plsql,我试图将值数组从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);

我试图将值数组从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());
这里在函数调用中没有传递数组的内容,但是数组的长度为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;

有人能告诉我,我哪里出了问题吗?

希望它能帮助那些正在寻找相同解决方案的人

CREATE OR REPLACE
TYPE DR.VLIST AS TABLE OF VARCHAR2(50)
但是,从数组中的java传递的值将不匹配VARCHAR,而应该是NVARCHAR。所以做了一点小小的改动,

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

它解决了我的问题。

希望它能帮助那些正在寻找相同解决方案的人

CREATE OR REPLACE
TYPE DR.VLIST AS TABLE OF VARCHAR2(50)
但是,从数组中的java传递的值将不匹配VARCHAR,而应该是NVARCHAR。所以做了一点小小的改动,

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

它解决了我的问题。

oracle.sql.ARRAY
已被弃用。相反,您可以拨打
请注意,
arrayTypeName
应该是类型表,
elements
应该是Java数组
T[]
,其中
T
对应于
arrayTypeName
是类型列表的类型。(这可以是实现
SQLData
的类)


有关详细信息,您可能会发现我的方法很有用。

oracle.sql.ARRAY
已被弃用。相反,您可以拨打
请注意,
arrayTypeName
应该是类型表,
elements
应该是Java数组
T[]
,其中
T
对应于
arrayTypeName
是类型列表的类型。(这可以是实现
SQLData
的类)


有关更多信息,您可能会发现我的建议很有用。

请参阅:谢谢您的回复。我试过这个,但没有用。嗨,你能发布你的VLIST类型声明或DDL吗?谢谢你指出。我在这里找到了解决办法。已将VLIST类型从VARCHAR更改为NVARCHAR。@safoorasafu好的,然后请提供您的VLIST DDL并回答以下问题,也许有一天它会对某人有所帮助,谢谢您的回复。我试过这个,但没有用。嗨,你能发布你的VLIST类型声明或DDL吗?谢谢你指出。我在这里找到了解决办法。已将VLIST类型从VARCHAR更改为NVARCHAR。@safoorasafu好的,然后请提供您的VLIST DDL并回答以下问题,也许有一天它会帮助某人,谢谢