Som Nicholas Karasnov siger, skal du have argumenterne i opfordringen til at matche procedureerklæringen. I dette tilfælde har du en OUT
parameter, så du skal bruge et sted for de data, du vælger at gå - noget, der svarer til sys_refcursor
parametertype.
Hvis du bruger SQL*Plus til at teste dette, kan du erklære en SQL*Plus-variabel
for dette, og send det derefter som en bindevariabel, og brug derefter print
kommando for at vise markørens indhold:
variable rc refcursor
exec javao(1, :rc);
print rc
Dette virker også i SQL Developer. Når du kalder proceduren fra anden kode, vil du have en variabel deklareret i en PL/SQL-blok eller i en ekstern applikation (f.eks. via jdbc
), men detaljerne i dem afhænger af, hvad du laver.
For at ringe fra Java skal du gøre noget som:
// 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
}
... men det grænser op til pseudokode, og du bliver nødt til at læse dokumentationen for at udfylde de tomme felter (og rette eventuelle fejl; du har sandsynligvis brug for Oracle-specifikke sætningstyper for eksempel), og tilføje objektlukning og fejlhåndtering alle alle de andre gode ting.