Ich versuche, ein Java String-Array an eine PLSQL-Stored-Procedure zu übergeben. Nach langem Suchen im Internet fand ich eine Lösung, die für mich nicht funktioniert. Vor allem hier ist das Paket i mit einem PL/SQL-Tabelle deklariert als „CHAR_TABLE“SQLException: ORA-01403: Beim Übergeben eines Arrays an einen StoredProcedure wurden keine Daten gefunden
Paket:
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;
Und hier ist der Körper (auch ist es nicht wichtig): erstellen oder ersetzen PAKET BODY MyPackage IST
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;
der Java-Kodex, die ist die folgende im Internet gefunden If:
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();
Aber das Problem ist, dass ich die folgende Ausnahme erhalten:
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)
nur zum Testen (um zu sehen, ob der Aufruf der StoredProcedure funktioniert) habe ich versucht, den folgenden Code:
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();
Und diesen funktioniert. Aber ich brauche die erste Lösung, um ein Java String Array an den Eingabeparameter der Stored Procedure zu binden. Wie kann ich das erreichen? Oder was ist mein Fehler?
Bitte geben Sie eine Version Ihrer Datenbank und eine Version Ihres JDBC-Treibers an. – krokodilko
Oracle Database Enterprise Edition 12c Veröffentlichung 12.1.0.2.0 - 64-Bit-Produktion com.oracle.ojdbc ojdbc7 12.1.0.1.0 –
Veilchen4ever
Können Sie für den Test nur ändern, CHAR (06) bis varchar2 (200) für Beispiel- und Verwendungssubstr. Insert – Mottor