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 将空sql数组发送到oracle过程_Java_Arrays_Oracle_Jdbc_Procedure - Fatal编程技术网

Java 将空sql数组发送到oracle过程

Java 将空sql数组发送到oracle过程,java,arrays,oracle,jdbc,procedure,Java,Arrays,Oracle,Jdbc,Procedure,我试图将sql.Array发送到过程中,但不知怎的,它在oracle过程中变为空 oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection(); String [] name = new String[]{"20206643799002684001","20206643799002684001"};

我试图将sql.Array发送到过程中,但不知怎的,它在oracle过程中变为空

         oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
            String [] name = new String[]{"20206643799002684001","20206643799002684001"};
            ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
            Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
            OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
            callableStatement.setDate(1,date);
            callableStatement.setDate(2,dateL);
           ((OracleCallableStatement)callableStatement).setARRAY(3,arr);
            callableStatement.setString(4,this.branchId);
            callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);

begin

FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);

-- test

RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
我的java代码用数据填充sql.Array并尝试将其发送到过程中

         oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
            String [] name = new String[]{"20206643799002684001","20206643799002684001"};
            ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
            Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
            OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
            callableStatement.setDate(1,date);
            callableStatement.setDate(2,dateL);
           ((OracleCallableStatement)callableStatement).setARRAY(3,arr);
            callableStatement.setString(4,this.branchId);
            callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);

begin

FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);

-- test

RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
在这个过程中,我把日志放进去,以查看在执行这个过程之后,我得到了什么值。我总是得到空的数组元素,在这个过程中出现

         oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
            String [] name = new String[]{"20206643799002684001","20206643799002684001"};
            ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",connection.unwrap(oracle.jdbc.OracleConnection.class));
            Array arr = new ARRAY(arrDec,connection.unwrap(oracle.jdbc.OracleConnection.class),name);
            OracleCallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
            callableStatement.setDate(1,date);
            callableStatement.setDate(2,dateL);
           ((OracleCallableStatement)callableStatement).setARRAY(3,arr);
            callableStatement.setString(4,this.branchId);
            callableStatement.execute();
procedure ACC_STATEMENT
(
i_begin_date date,
i_end_date date,
i_ids array_varchar2,
i_mfo varchar2
)
is
o_ext_acc varchar2(20);
o_beginRest number;
o_endRest number;
o_name varchar2(100);
o_rest number;
o_type varchar2(100);

begin

FOR i IN 1.. i_ids.count LOOP
o_ext_acc := i_ids(i);

-- test

RAISE_ERROR(20000, 'o_ext_acc -' ||o_ext_acc);
执行此错误后,我看到空o_ext_acc显示此消息,我将其重定向到其他过程中

UPD 当我设置调试模式以查看arr的运行情况时,我注意到了这些数据。这意味着数组不会从中获取值,而是显示问号

UPD

我知道我正在使用sql数组,并将其更改为oracle.sql.array,并尝试使用以下代码创建,但它再次运行为空

 oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
            String [] name = new String[]{"20206643799002684001","20206643799002684001"};
            oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2",name);
            CallableStatement callableStatement = connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
            callableStatement.setDate(1,date);
            callableStatement.setDate(2,dateL);
           ((OracleCallableStatement)callableStatement).setArray(3,a);
            callableStatement.setString(4,this.branchId);
            callableStatement.execute();
UPD 3

        oracle.jdbc.OracleConnection connection = (OracleConnection) JdbcConnection.getInstance().createConnection();
        String [] name = new String[]{"20206643799002684001","20206643799002684001"};
        oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
        oracle.sql.ARRAY a = new ARRAY(arrayDescriptor,connection,name);
        OracleCallableStatement callableStatement = (OracleCallableStatement) connection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
        callableStatement.setDate(1,date);
        callableStatement.setDate(2,dateL);
        callableStatement.setARRAY(3,a);
        callableStatement.setString(4,this.branchId);
        callableStatement.execute();
UPD 4

在发送空的oracle.sql.Array之后,它给出了我的过程中的错误,并在打印部分显示空的sql数组元素

java.sql.SQLException: ORA-20000:

20000:o_ext_acc:/empty此处的发送数组元素为空。在这里 应该是发送数组的元素/ORA-06512:а “IBS上升误差”,第74行ORA-06512:ааa“IBS上升误差”,第30行 ORA-06512:1号线

位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:447) 位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:396) 位于的oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)

UPD 5

我修改它的程序

FOR i IN 1.. i_ids.count LOOP o_ext_acc := i_ids(i);

-- test

RAISE_ERROR(20000, 'date:' || i_begin_date || 'accountElement ' || o_ext_acc);
然后,我得到了以下错误,我可以看到日期,但有空的o_ext_acc

java.sql.SQLException:ORA-20000:20000:date:02.09.19accountElement

prolbem在过程中发送oracle.jdbc.Array时,我没法捕捉到,不知怎的,它是从jdbc发送到oracle过程中的,就像空数组一样,元素是空的


我从Oracle运行此过程,它运行正常,没有错误

使用
Oracle.sql.ARRAY
oracleConnection.setARRAY()
,而不是
java.sql.ARRAY
javaConnection.setARRAY()

Connection-Connection=JdbcConnection.getInstance().createConnection();
OracleConnection oconnection=(OracleConnection)connection.unwrap(oracle.jdbc.OracleConnection.class);
字符串[]名称=新字符串[]{“20206643799002684001”、“20206643799002684001”};
ArrayDescriptor arrDec=ArrayDescriptor.createDescriptor(“ARRAY_VARCHAR2”,occonnection);
ARRAY arr=新阵列(arrDec、occonnection、name);
/*
*或
*ARRAY arr=oconnection.createARRAY(“ARRAY_VARCHAR2”,name);
*/
OracleCallableStatement callableStatement
=(OracleCallableStatement)oconnection.prepareCall({call bss_acc.acc_STATEMENT(?,,,?)});
callableStatement.setDate(1,日期);
callableStatement.setDate(2,dateL);
setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();

另请参见:

使用
oracle.sql.ARRAY
oracleConnection.setARRAY()
而不是
java.sql.ARRAY
javaConnection.setARRAY()

Connection-Connection=JdbcConnection.getInstance().createConnection();
OracleConnection oconnection=(OracleConnection)connection.unwrap(oracle.jdbc.OracleConnection.class);
字符串[]名称=新字符串[]{“20206643799002684001”、“20206643799002684001”};
ArrayDescriptor arrDec=ArrayDescriptor.createDescriptor(“ARRAY_VARCHAR2”,occonnection);
ARRAY arr=新阵列(arrDec、occonnection、name);
/*
*或
*ARRAY arr=oconnection.createARRAY(“ARRAY_VARCHAR2”,name);
*/
OracleCallableStatement callableStatement
=(OracleCallableStatement)oconnection.prepareCall({call bss_acc.acc_STATEMENT(?,,,?)});
callableStatement.setDate(1,日期);
callableStatement.setDate(2,dateL);
setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();

另请参见:

经过两天的搜索,主要问题是datumnArray是???。这意味着oracld db和jdbc与其字符集不匹配。添加此代码后

 String s1 = new String(account.get(0).getBytes(), Charset.forName("ISO-8859-1"));
                String [] name = new String[]{s1};
                //oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
                oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2", name);

并将这个库添加到maven中

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>orai18n</artifactId>
        <version>11.1.0.7.0</version>
    </dependency>

com.oracle

经过两天的搜索,主要问题是datumnArray是???。这意味着oracld db和jdbc与其字符集不匹配。添加此代码后

 String s1 = new String(account.get(0).getBytes(), Charset.forName("ISO-8859-1"));
                String [] name = new String[]{s1};
                //oracle.sql.ArrayDescriptor arrayDescriptor = new ArrayDescriptor("ARRAY_VARCHAR2",connection);
                oracle.sql.ARRAY a = connection.createARRAY("ARRAY_VARCHAR2", name);

并将这个库添加到maven中

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>orai18n</artifactId>
        <version>11.1.0.7.0</version>
    </dependency>

com.oracle

Mister@MT0感谢您的回答,但我将其改为oracle.sql.Array,不管怎样,它都会给出空值。@MaksimVasilovich
setARRAY(3,arr)
not
setARRAY(3,arr)
。您能看看UPD3吗?它使用ojdbc6 11.2.0版在pom xml中给出了错误。不是错误,但它发送到过程空数组,这是我正在调用的error@MaksimVasilovich“它会出错”不是建设性的。什么错误?哪里请给出完整的堆栈跟踪,并突出显示与代码段中哪一行相关的行号。Mster@MT0感谢您的回答,但我将其更改为oracle.sql.Array。无论如何,它给出的是空值。@MaksimVasilovich
setARRAY(3,arr)
not
setARRAY(3,arr)
。您能看看UPD3吗?它使用ojdbc6 11.2.0版在pom xml中给出了错误。不是错误,但它发送到过程空数组,这是我正在调用的error@MaksimVasilovich“它会出错”不是建设性的。什么错误?哪里请给出完整的堆栈跟踪,并突出显示代码段中与哪一行相关的行号。