2016-07-06 13 views
2

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?

+0

Bitte geben Sie eine Version Ihrer Datenbank und eine Version Ihres JDBC-Treibers an. – krokodilko

+0

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

+0

Können Sie für den Test nur ändern, CHAR (06) bis varchar2 (200) für Beispiel- und Verwendungssubstr. Insert – Mottor

Antwort

1

Ich denke, wenn ein Array (assoziatives Array) kommt aus Java. Ihr Index beginnt bei 0. Sie können den Bereich der Änderungsschleife ausprobieren oder den Typ der Schleife ändern. Für ein Array ist die while-Schleife geeigneter. Überprüfen Sie das Beispiel.

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; 
+0

Vielen Dank. Deine Vermutung war total richtig. Das hat mein Problem behoben. – Veilchen4ever