JDBC Callable Statement Casting Exception

I am trying to execute an ORACLE Funtion using a JDBC Callable statement.  The function returns a Varchar.  When I execute, I get a ClassCastException.  The funtion statment and the method are both below.  What am I doing wrong, JDBC will handle a Varchar, correct?
Oracle Function: 
CREATE OR REPLACE FUNCTION OMSOWNER.PRC_CCA_DELETE_INMATE_FUNCTION (INJLOCAT VARCHAR2, BOOKNUM VARCHAR2, TICKETNUM VARCHAR2)
return varchar2
 
Code:
    public void execute(String jlocat, String booknum, String ticketnum)
        throws SQLException {
 
        String query = useOracleQuery ? oracleQuery : genericQuery;
        System.out.println("Query: " + query + "\n");
        CallableStatement stmt = conn.prepareCall(query);
 
        // register the type of the out param - an Oracle specific type
        stmt.registerOutParameter(1, OracleTypes.VARCHAR);
        //stmt.registerOutParameter(1, OracleTypes.CURSOR);
 
        // set the in param
        stmt.setString(2, jlocat);
        stmt.setString(3, booknum);
        stmt.setString(4, ticketnum);
 
        // execute and retrieve the result set
        stmt.execute();
        ResultSet rs = (ResultSet)stmt.getObject(1);
 
        // print the results
        while (rs.next()) {
            System.out.println(rs.getString(1));
            
        }
 
        rs.close();
        stmt.close();
    }

Open in new window

sf_grayAsked:
Who is Participating?
 
Gibu GeorgeConnect With a Mentor Chief Technology OfficerCommented:
You have registered out parameter as VARCHAR, then you are trying to cast the object to result set.
String rs = (String)stmt.getObject(1);
0
 
CEHJCommented:
What does the following give?
System.out.println(stmt.getObject(1).getClass());

Open in new window

0
 
pellepConnect With a Mentor Commented:
What does the actualy query look like you're executing (String query = useOracleQuery ? oracleQuery : genericQuery)?

If it's something like:
"begin ? := OMSOWNER.PRC_CCA_DELETE_INMATE_FUNCTION(?,?,?); end;"
And the function returns a VARCHAR, then your code should work fine if you change
ResultSet rs = (ResultSet)stmt.getObject(1);
to
String s = stmt.getString(1);
(like gibu_george alerady suggested).

Also, if you're returning a simple VARCHAR, you shouldn't mess around with OracleTypes, just specify it as java.sql.Types.VARCHAR and let the JDBC driver worry about type marshalling.

If, on the other hand, you want a resultset to work with, the Oracle-function will have to return a REFCURSOR.
0
 
sf_grayAuthor Commented:
Thank you, so much.  I really appreciate it.  I hope my point split was fair.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.