Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler beim Ausführen von Stroredprocedure

Wie Nicholas Karasnov sagt, müssen die Argumente im Aufruf mit der Prozedurdeklaration übereinstimmen. In diesem Fall haben Sie einen OUT Parameter, also brauchen Sie einen Ort für die ausgewählten Daten - etwas, das dem sys_refcursor entspricht Parametertyp.

Wenn Sie SQL*Plus verwenden, um dies zu testen, können Sie ein SQL*Plus-Variable dafür und übergeben Sie das dann als Bindevariable und verwenden Sie dann print Befehl zum Anzeigen des Cursorinhalts:

variable rc refcursor
exec javao(1, :rc);
print rc

Dies funktioniert auch in SQL Developer. Wenn Sie die Prozedur aus anderem Code aufrufen, haben Sie eine Variable, die in einem PL/SQL-Block oder in einer externen Anwendung (z. B. über jdbc) deklariert ist ), aber die Details davon hängen davon ab, was Sie tun.

Um von Java aus anzurufen, würden Sie Folgendes tun:

// get connection
CallableStatement cStmt = conn.prepareCall("{ call javao(?, ?) }");
cStmt.setInt(1, 1);
cStmt.registerOutParameter(2, OracleTypes.cursor);
cStmt.execute();
ResultSet rSet = ((OracleCallableStatement) cStmt).getCursor(2);
while (rSet.next())
{
    // get columns from result set row and do something with the data
}

... aber das grenzt an Pseudocode, und Sie müssen die Dokumentation lesen, um die Lücken zu füllen (und etwaige Fehler zu korrigieren; Sie benötigen zum Beispiel wahrscheinlich Oracle-spezifische Anweisungstypen) und das Schließen von Objekten und die Fehlerbehandlung hinzufügen das andere gute Zeug.