我正在尝试将值数组从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 :(得分:0)
希望它可以帮助那些寻求相同解决方案的人。
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)
它解决了我的问题。
答案 1 :(得分:0)
oracle.sql.ARRAY
已弃用。相反,您可以致电OracleConnection.createOracleArray(String arrayTypeName, Object elements)
请注意,arrayTypeName
应该是表的类型,而elements
应该是您的Java数组T[]
,其中T
对应于{{1}的类型是一个列表。 (这可以是实现arrayTypeName
)
有关详细信息,您可能会发现我的my answer on getArray() and writeArray()很有用。