Java SQLException:ORA-01403:将数组传递到StoredProcess时未找到数据

Java SQLException:ORA-01403:将数组传递到StoredProcess时未找到数据,java,oracle,stored-procedures,jdbc,plsql,Java,Oracle,Stored Procedures,Jdbc,Plsql,我试图将Java字符串数组传递给PLSQL存储过程。在网上搜索了很多次之后,我找到了一个不适合我的解决方案。 首先,这里是我用一个名为“CHAR\u Table”的PL/SQL表声明的包 包装: create or replace PACKAGE MYPACKAGE IS TYPE CHAR_TABLE IS TABLE OF CHAR(06) INDEX BY BINARY_INTEGER; PROCEDURE MYPROCEDURE( p_strings CHAR_TAB

我试图将Java字符串数组传递给PLSQL存储过程。在网上搜索了很多次之后,我找到了一个不适合我的解决方案。 首先,这里是我用一个名为“CHAR\u Table”的PL/SQL表声明的包

包装:

create or replace PACKAGE MYPACKAGE IS 
TYPE CHAR_TABLE IS TABLE OF CHAR(06) INDEX BY BINARY_INTEGER;
PROCEDURE MYPROCEDURE(
    p_strings      CHAR_TABLE
);
END MYPACKAGE;
这是身体(也不重要): 创建或替换包体MYPACKAGE是

  PROCEDURE MYPROCEDURE(
    p_strings      CHAR_TABLE
) AS
  BEGIN
    FOR i IN 1..p_strings.COUNT
    LOOP
      INSERT INTO myTable (s) VALUES (p_strings(i));
    END LOOP;
  END MYPROCEDURE;

END MYPACKAGE;
如果在internet上找到Java代码,则会显示以下内容:

OracleCallableStatement stmt = (OracleCallableStatement)oracleConnection.prepareCall("{call MYPACKAGE.MYPROCEDURE(?)}");



    String[] data = { "one", "two", "three" };
    Array array = oracleConnection.createOracleArray("MYPACKAGE.CHAR_TABLE", data);

    stmt.setArray(1, array);
    stmt.execute();

    conn.commit();
    conn.close();
但问题是我得到了以下例外:

Exception in thread "main" java.sql.SQLException: ORA-01403: no data found

ORA-06512: at "BERNHARD.MYPACKAGE", line 9
ORA-06512: at line 1

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3923)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)
为了测试(看看对StoredProcess的调用是否有效),我尝试了以下代码:

OracleCallableStatement stmt = (OracleCallableStatement)oracleConnection.prepareCall("        DECLARE var BERNHARD.MYPACKAGE.CHAR_TABLE;\n" +
                "BEGIN\n" +
                "\n" +
                "var(1) := 'a';\n" +
                "var(2) := 'b';\n" +
                "MYPACKAGE.MYPROCEDURE(var);\n" +
                "END;");
stmt.execute();
这是有效的。但我需要第一个解决方案,将Java字符串数组绑定到存储过程的输入参数。我怎样才能做到这一点?或者我的错误是什么?

我猜a-array(关联数组)是否来自java。它的索引从0开始。 您可以尝试更改循环范围或根本更改循环类型。对于a阵列,更合适的是while循环。 检查示例

declare 
 type CHAR_TABLE IS TABLE OF CHAR(06) INDEX BY BINARY_INTEGER;
 p_strings  CHAR_TABLE;
 idx BINARY_INTEGER;
begin 
 p_strings(0) := 'aaaa';
 p_strings(1) := 'bbbb';
 p_strings(2) := 'cccc';
 -- 1-st option
 FOR i IN 0..p_strings.last  loop
  dbms_output.put_line(p_strings(i));
 end loop;
 -- 2-nd option
 idx := p_strings.first;
 while idx is not null
 loop
  dbms_output.put_line(p_strings(idx));
  idx := p_strings.next(idx);
 end loop;

end; 

请公开数据库的版本和JDBC驱动程序的版本。Oracle database 12c Enterprise Edition 12.1.0.2.0-64位生产版com.Oracle.ojdbc ojdbc7 12.1.0.1.0能否在测试时将CHAR(06)更改为varchar2(200)对于INSERTR上的sample和use substr,是否需要通过二进制整数传递CHAR(06)索引的关联数组
?或者一个简单的数组(嵌套表或varray)就足够了?我在自定义类型上没有
grant execute
时看到了与
getArray()
类似的错误。驱动程序似乎对该类型执行某种元数据查找,但由于权限问题,无法找到元数据。如果异常包含查看所有符号的元数据查询,这可能就是问题所在。非常感谢。你的猜测完全正确。这解决了我的问题。