piernik wrote:
> Hello I'm trying to learn how to work with stored procedures in
> Oracle and java. I deal fine with ResultSets and PreparedStatement
> now I want to use functions and CallableStatement.
> I wrote my code looking at this sites:
>
>
http://andrej.racchvs.com/archives/2...rsors-in-java/ > http://www.samspublishing.com/articl...26251&seqNum=7 > http://www.cs.bris.ac.uk/maintain/Or...54/samapp2.htm > http://www.enterprisedt.com/publicat...esult_set.html >
> I've created a package with a function to find buss connection
> between 2 cities CREATE OR REPLACE PACKAGE cursors_pkg
> AS
> type dire_city_curs is record (
> bus_id Bus_Schedule.bus_id%TYPE,
> station_name Station.station_name%TYPE,
> arrival_tim Bus_Schedule.arrival_time%TYPE,
> departure_time Bus_Schedule.departure_time%TYPE,
> station_nr Bus_Schedule.station_nr%TYPE);
> TYPE refcursortype IS REF CURSOR return dire_city_curs;
> FUNCTION getdirect(from_city varchar2, to_city varchar2) RETURN
> refcursortype; END cursors_pkg;
>
> CREATE OR REPLACE PACKAGE BODY cursors_pkg IS
> FUNCTION getdirect(from_city varchar2, to_city varchar2) RETURN
> refcursortype IS
> mycursor refcursortype;
> BEGIN
> OPEN kurszor FOR
> select **bla bla**
> RETURN mycursor;
> END;
> END cursors_pkg;
>
> now java
>
> String usersSql = "{ call ? = cursors_pkg.getdirect(?,?) }";
> CallableStatement stmt = db.prepareCall(usersSql);
> stmt.registerOutParameter(1,OracleTypes.CURSOR);
> stmt.setString(new String("from_city"),"London");
> stmt.setString(new String("to_city"),"Paris");
>
> stmt.execute();
> ResultSet rset = (ResultSet) stmt.getObject(1);
> //or ResultSet rset = ((OracleCallableStatement)stmt).getCursor (1);
> while (rset.next()){
> System.out.println( rset.getDouble(1) +" "+ rset.getString(2));
> }
> and the effect of my efforts:
> SQLException: Incorrectly set or registered parameters.:null
> I'm puzzled. I don't understand what goes wrong. Can you give me any
> hints?
> I was sent to
> http://www.oracle.com/technology/tec...s/jdbc_faq.htm > but I find there nothing interesting.
>
> thank you for help
I'm just thinking on-line here... try
String usersSql = "{ call ? = cursors_pkg.getdirect( from_city ?, to_city
?) }";
CallableStatement stmt = db.prepareCall(usersSql);
stmt.registerOutParameter(1,OracleTypes.CURSOR);
stmt.setString(2,"London");
stmt.setString(3,"Paris");
stmt.execute();
ResultSet rset = (ResultSet) stmt.getObject(1);
//or ResultSet rset = ((OracleCallableStatement)stmt).getCursor (1);
while (rset.next()){
System.out.println( rset.getDouble(1) +" "+ rset.getString(2));
}
based on the premise that you only want to substitute the data via the
parameters, not the parameter names.
A little further looking on the net tells me that the use of named
parameters is part of JDBC 3.0 and older drivers may not support the use of
named parameters.
--
Virgil
==========https://forums.oracle.com/forums/thread.jspa?threadID=2153866