Search code examples
javaprocedurecallable-statement

java callable statement help using package procedure


Currently i have this procedure under package that gets user_name when some selects user_id on web page but now i wanna change the format by adding ssn to the page so when some body selects user_id it loads user name as well as ssn on webpage textbox.. i am using callable statement to load data.. what can i change here to get both user name and ssn

    PROCEDURE get_User_name
  (
    return_code_out OUT VARCHAR2,
    return_msg_out OUT VARCHAR2,
    user_id_in IN user.user_id%TYPE,
    user_name_out OUT user.user_name%TYPE
  )
  IS

  BEGIN


    return_code_out := '0000';
    return_msg_out := 'OK';

    SELECT c.user_name INTO user_name_out 
      FROM user c
     WHERE c.user_id = user_in;

 END get_user_name;

and here is my load function

    public String load() {

        String retMsg = null;
        DbUtil db = null;
        java.sql.CallableStatement cstmt = null;

            try {
            db = new DbUtil();
            cstmt = db.prepareCall("{ call sample.PACK_USER.get_user_name(?, ?, ?, ?) }");

            cstmt.registerOutParameter(1,OracleTypes.VARCHAR);
            cstmt.registerOutParameter(2,OracleTypes.VARCHAR);
            cstmt.setString(3,this.getuserid());
            cstmt.registerOutParameter(4,OracleTypes.VARCHAR);

                cstmt.execute();

            if (cstmt.getString(1).equals(Constants.dbSuccess))
                myLog.log(myLog.INFORMATION, "UserBean.load() DB return code and message = " + retMsg);
            else {
                retMsg =  cstmt.getString(1) + " - " + cstmt.getString(2);
                myLog.log(myLog.ERROR, "UserBean.load() DB return code and message = " + retMsg);
            }

            this.setUserName(cstmt.getString(4));
return retMsg;
    }

Solution

  • So that is change your procedure as Rajesh suggested (though it does depend on which database server you are using):

    PROCEDURE get_User_name
    ( user_id_in IN user.user_id%TYPE, 
      user_name_out OUT user.user_name%TYPE,
      user_ssn_out  out user.ssn_type%TYPE ) IS
    
    BEGIN
    
    SELECT c.user_name, c.ssn 
      INTO user_name_out, ssn_out
      FROM user c
      WHERE c.user_id = user_in;
    
    END get_user_name;
    

    AND change the Java code as follows:

            cstmt = db.prepareCall("{ call sample.PACK_USER.get_user_name(?, ?, ?) }");
    
            cstmt.setString(1,this.getuserid());
            cstmt.registerOutParameter(2,OracleTypes.VARCHAR);
            cstmt.registerOutParameter(3,OracleTypes.VARCHAR);
            cstmt.execute();
    
            String userName = cstmt.getString(2);
            String ssnType = cstmt.getString(3);
    

    Your existing error code would never work - you must handle errors by catching an SQLException somewhere.