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.