将空 sql 数组发送到 oracle 过程

Sending empty sql Array into oracle procedure

我正在尝试将 sql.Array 发送到过程中,但不知何故它在 oracle 过程中变空了。

我的 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);

我看到在用空 o_ext_acc 执行此错误后显示此消息我将其重定向到其他过程

java.sql.SQLException: ORA-20000: 
20000:  o_ext_acc -
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
  at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
  at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
  at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
  at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
  at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
  at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:205)
  at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043)
  at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
  at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
  at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714)
  at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755)
  at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378)
  at com.uzb.bank.demo.service.impl.GenerateIntoXmlImpl.accountStatement(GenerateIntoXmlImpl.java:414)
  at com.uzb.bank.demo.controller.Controller.accountStatement(Controller.java:72)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

UPD 当我进入调试模式以查看 arr 发生了什么时,我注意到这个 data.Which 意味着数组不从中获取值并且它显示问号而不是它。

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 sending array element here is empty. Here should be element of sending array/ORA-06512: на "IBS.RAISE_ERROR", line 74 ORA-06512: на "IBS.BSS_ACC", line 30 ORA-06512: на line 1

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) at 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

我无法在过程中发送 oracle.jdbc.Array 的问题它以某种方式从 jdbc 进入 oracle 过程,如空数组和元素为空

我 运行 来自 Oracle 的这个程序,它工作正常没有错误

使用oracle.sql.ARRAYoracleConnection.setARRAY()而不是java.sql.ArrayjavaConnection.setArray()

Connection connection = JdbcConnection.getInstance().createConnection();
OracleConnection oconnection = (OracleConnection) connection.unwrap( oracle.jdbc.OracleConnection.class );

String [] name = new String[]{"20206643799002684001","20206643799002684001"};
ArrayDescriptor arrDec = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR2",oconnection);
ARRAY arr = new ARRAY(arrDec,oconnection,name);
/*
 * Or
 * ARRAY arr = oconnection.createARRAY("ARRAY_VARCHAR2", name);
 */
OracleCallableStatement callableStatement
  = (OracleCallableStatement) oconnection.prepareCall("{call bss_acc.ACC_STATEMENT(?,?,?,?)}");
callableStatement.setDate(1,date);
callableStatement.setDate(2,dateL);
callableStatement.setARRAY(3,arr);
callableStatement.setString(4,this.branchId);
callableStatement.execute();

另请参阅:我在 Java 中对“插入到 Oracle 嵌套 Table”的回答 "

经过两天的搜索主要问题是 datumnArray 是 ???。这意味着 oracld db 和 jdbc 与添加此代码的 characterset.After 不匹配。

 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>

这对我有用。我认为他们两个都对解决 problem.At 下图的开头起着至关重要的作用。