I’m a beginner of writing JDBC stored procedures. I created the stored procedure successfully. If I find the record, I couldn’t find it. I get the error:
Check connectionjava.sql.SQLException: Can’t set IN parameter for return value of stored function call.
I attached the code that I tried so far
public class JdbcFind { public static void main(String[] args) { Connection con=null; String id,fname,lname; try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost/abclibrary", "root",""); CallableStatement stat1 = con.prepareCall("{?=call authors(?,?)}"); stat1.registerOutParameter(1,Types.VARCHAR); stat1.setString(2, "1"); stat1.registerOutParameter(3,Types.VARCHAR); stat1.execute(); int k = stat1.getInt(1); if(k == 0) { System.out.println("Customer id Not FOund"); System.exit(0); } System.out.println(stat1.getString(1)); System.out.println(" "); System.out.println(stat1.getString(2)); }catch(ClassNotFoundException cle) { System.out.println("check your jdbc connection" ); }catch(SQLException sqe) { System.out.println("Check connection" +sqe); }finally{ try{ if(con != null) con.close(); }catch(Exception e){} } }
Stored procedure:
String str = "CREATE PROCEDURE authors (p_auth_id varchar(15), OUT p_auth_fname varchar(20), OUT p_auth_lname varchar(20))n" + "BEGINn" + " SELECT auth_fname, auth_lname INTO p_auth_fname, p_auth_lname FROM authors where auth_id = p_auth_id;n" + "END;";
Advertisement
Answer
Your callable statement has three parameters (question marks). According to the JavaDoc you are using the form with a result parameter, which means that you must set it as an OUT parameter.
To clarify I’ve numbered the parameters for you:
{?=call authors(?,?)} 1 2 3
Without knowing the definition of your stored procedure I would guess that it takes one IN parameter, has one OUT parameter and returns a result. In that case you should set the parameters as follows:
stat1.registerOutParameter(1,Types.VARCHAR); stat1.setString(2, "1"); stat1.registerOutParameter(3,Types.VARCHAR);
Edit:
With the stored procedure defined as
CREATE PROCEDURE authors (p_auth_id varchar(15), OUT p_auth_fname varchar(20), OUT p_auth_lname varchar(20))
it has three parameters (the first one in IN parameter, the second and third are OUT parameters).
Therefore the correct way to call it is:
CallableStatement stat1 = con.prepareCall("{call authors(?,?,?)}"); stat1.setString(1, "1"); stat1.registerOutParameter(2,Types.VARCHAR); stat1.registerOutParameter(3,Types.VARCHAR);
You will also have to drop these lines:
/* int k = stat1.getInt(1); if(k == 0) { System.out.println("Customer id Not FOund"); System.exit(0); } */
because the parameter 1 is an IN-only parameter (and your stored procedure doesn’t return any other value besides the OUT-parameters).
To read the result from the OUT-parameters you also have to adapt the parameter numbers:
System.out.println(stat1.getString(2)); System.out.println(" "); System.out.println(stat1.getString(3));
Unfortunately I don’t know enough about stored procedures to tell you how you can find out if there was any row found at all.
I could imagine that if the query in your stored procedure didn’t find any rows then both OUT parameters would return null
.