Справка по вызываемому выражению Java с использованием процедуры пакета - PullRequest
1 голос
/ 08 апреля 2011

В настоящее время у меня есть эта процедура в пакете, который получает имя_пользователя, когда кто-то выбирает идентификатор_пользователя на веб-странице, но теперь я хочу изменить формат, добавив ssn на страницу, поэтому, когда какое-то тело выбирает user_id, он загружает имя пользователя, а также ssn на текстовое поле веб-страницы... я использую вызываемый оператор для загрузки данных .. что я могу изменить здесь, чтобы получить как имя пользователя, так и 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;
    }

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Итак, измените вашу процедуру, как предложил Раджеш (хотя это зависит от того, какой сервер базы данных вы используете):

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;

И изменить код 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 где-то.

0 голосов
/ 08 апреля 2011

Процедуру необходимо изменить на ...

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, чтобы перехватить исключение sqlException в Java и выполнить необходимые действия.

...