Come dice Nicholas Karasnov, è necessario che gli argomenti nella chiamata corrispondano alla dichiarazione della procedura. In questo caso hai un OUT
parametro, quindi hai bisogno di un posto per i dati che stai selezionando, qualcosa che corrisponda a sys_refcursor
tipo di parametro.
Se stai usando SQL*Plus per testarlo, puoi dichiarare un Variabile SQL*Plus
per questo e poi passarlo come una variabile di collegamento, quindi utilizzare print
comando per visualizzare il contenuto del cursore:
variable rc refcursor
exec javao(1, :rc);
print rc
Funziona anche in SQL Developer. Quando chiami la procedura da altro codice, avrai una variabile dichiarata in un blocco PL/SQL o in un'applicazione esterna (ad esempio tramite jdbc
), ma i dettagli di questi dipendono da cosa stai facendo.
Per chiamare da Java, faresti qualcosa del tipo:
// 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
}
... ma confina con lo pseudocodice e dovrai leggere la documentazione per riempire gli spazi vuoti (e correggere eventuali errori; probabilmente hai bisogno di tipi di istruzioni specifici di Oracle, ad esempio), e aggiungere la chiusura dell'oggetto e la gestione degli errori tutto quell'altra roba buona.