Som Nicholas Karasnov säger behöver du argumenten i samtalet för att matcha förfarandedeklarationen. I det här fallet har du en OUT
parameter, så du behöver någonstans för att data du väljer ska gå - något som motsvarar sys_refcursor
parametertyp.
Om du använder SQL*Plus för att testa detta kan du deklarera en SQL*Plus-variabel
för detta och skicka det sedan som en bindningsvariabel och använd sedan print
kommando för att visa markörinnehållet:
variable rc refcursor
exec javao(1, :rc);
print rc
Detta fungerar också i SQL Developer. När du anropar proceduren från annan kod kommer du att ha en variabel deklarerad i ett PL/SQL-block, eller i en extern applikation (t.ex. via jdbc
), men detaljerna i dessa beror på vad du gör.
För att ringa från Java, skulle du göra något i stil med:
// 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 är på gränsen till pseudokod, och du måste läsa dokumentationen för att fylla i de tomma fälten (och korrigera eventuella fel, du behöver förmodligen Oracle-specifika satser till exempel), och lägga till objektstängning och felhantering alla alla det där andra bra.