Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle PreparedStatement数组参数传递空字符串_Java_Arrays_Oracle_Prepared Statement - Fatal编程技术网

Java Oracle PreparedStatement数组参数传递空字符串

Java Oracle PreparedStatement数组参数传递空字符串,java,arrays,oracle,prepared-statement,Java,Arrays,Oracle,Prepared Statement,当从SQL工作表调用时,以下对管道函数的调用可以完美地工作。当从Java作为一个完整的文本字符串传入时,它也可以完美地工作 select * from table(PKG.GetStuff( param_array => str_arr_t( 'field1 LIKE ''foo%''', 'field2 LIKE ''bar%''') )); 但是,如果我尝试用setArray()在Java中参数化调用,则oracle函数中会出现空字符串。数组

当从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之前,我不会收到任何错误。

您的用户连接是否对STR\u ARR\t对象具有正确的授权?还有可能它指向的是一个概要而不是实际的对象吗?我过去也遇到过类似的问题。是的,我相信是这样。如果没有同义词和grant execute,我在调用时会遇到oracle异常。我正在使用我的函数,但每个数组元素都是空的。因此,请在java代码中添加一些断点并检查MyStringaray,也许您遇到了某种阴影变量范围。我的数组似乎没有问题。这和我加入的用于文本字符串修复的数组是一样的。但是oracle.sql.ARRAY是可疑的。元素位于CHAR类型的基础数据数组中,数据字段显示为空。也许我应该更深入地了解api。通过将我的类型改为NVARCHAR2而不是VARCHAR2来解决这个问题![摘自本帖最后一条评论][1][1]: