使用包过程的java可调用语句帮助

使用包过程的java可调用语句帮助,java,procedure,callable-statement,Java,Procedure,Callable Statement,目前,我有一个程序包,当一些人在网页上选择用户id时,它会获取用户名,但现在我想通过向网页添加ssn来更改格式,以便当一些人选择用户id时,它会在网页文本框中加载用户名和ssn。。我正在使用callable语句加载数据。。我可以在这里更改什么来获取用户名和ssn PROCEDURE get_User_name ( return_code_out OUT VARCHAR2, return_msg_out OUT VARCHAR2, user_id_in IN u

目前,我有一个程序包,当一些人在网页上选择用户id时,它会获取用户名,但现在我想通过向网页添加ssn来更改格式,以便当一些人选择用户id时,它会在网页文本框中加载用户名和ssn。。我正在使用callable语句加载数据。。我可以在这里更改什么来获取用户名和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;
这是我的加载函数

    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;
    }

程序需要更改为

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

---return_code_out := '0000';  /*catch sql exception in java instead..*/
---return_msg_out := 'OK';     /*catch sql exception in java instead..*/

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;

从您的代码中,看起来您希望从过程中返回错误代码和错误消息。相反,使用try-catch块捕获Java中的sqlException并采取必要的操作。

因此,这就是按照Rajesh的建议更改您的过程(尽管它确实取决于您使用的数据库服务器):

并按如下方式更改Java代码:

        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);

您现有的错误代码永远不会工作-您必须通过在某处捕获SQLException来处理错误。

如果我们这样做,是否工作选择c.user\u name,c.ssn到user\u name\u out,ssn\u out。。这里发生了什么。。c、 用户名分配给用户名输出,c.ssn分配给ssn输出。。因为我在java方面没有得到任何结果。。plz HELP我将修改我的解决方案,以显示您如何读取参数。在整理代码时,我们删除了一些参数,因此
getString(4)
方法不再有效,并且忽略了告诉您。哦-我还应该补充一点,
retMsg
总是设置为
0000-OK
。你现在可以硬编码了。
        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);