Java SQLException:ORA-01403:将数组传递到StoredProcess时未找到数据
我试图将Java字符串数组传递给PLSQL存储过程。在网上搜索了很多次之后,我找到了一个不适合我的解决方案。 首先,这里是我用一个名为“CHAR\u Table”的PL/SQL表声明的包 包装: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
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()
类似的错误。驱动程序似乎对该类型执行某种元数据查找,但由于权限问题,无法找到元数据。如果异常包含查看所有符号的元数据查询,这可能就是问题所在。非常感谢。你的猜测完全正确。这解决了我的问题。