从SQL工作表调用时,以下对流水线函数的调用非常有效。当它从Java作为完整的文字字符串传入时,它也可以很好地工作。
select * from table(PKG.GetStuff(
param_array => str_arr_t(
'field1 LIKE ''foo%''',
'field2 LIKE ''bar%''')
));
但是如果我尝试使用setArray()在Java中调用调用,我会在oracle函数中获得空字符串。数组计数正确但值为空。
STR_ARR_T在架构上定义为:
create or replace TYPE STR_ARR_T AS TABLE OF varchar2(50);
Java调用是:
PreparedStatement statement =
connection.prepareCall("select * from table(PKG.GetStuff(param_array => ?))");
ArrayDescriptor ad1 = ArrayDescriptor.createDescriptor("STR_ARR_T", connection);
ARRAY arr = new ARRAY(ad1, connection, myStringArray);
statement.setArray(1, arr);
函数内的plsql处理数组如下。它正确循环但将空字符串连接到动态sql。
FOR J IN 1 .. param_array.COUNT
LOOP
sql := sql || ' AND ' || param_array(J);
END LOOP;
在我因为缺少表达式而尝试执行无效的动态sql之前,我没有收到任何错误。