Почему параметр IN OUT возвращает значение без регистрации для вызываемого оператора? - PullRequest
2 голосов
/ 25 апреля 2019

Я вызываю pk_adduser.pr_checkuser () из Java, используя CallableStatement, который содержит два параметра IN и один параметр IN OUT. Я не зарегистрировал параметр IN OUT, используя CallableStatement.registerOutParameter (int параметрIndex, int sqlType). Но все же я могу получить выходное значение с помощью параметра IN OUT, если длина возвращаемого значения совпадает с длиной входного значения, в противном случае я получаю исключение SQL, например ORA-06502: PL / SQL: ошибка числового значения или значения.

Я использую Java 1.7 и Oracle 12c.

мой пакет, как показано ниже: Я использовал параметр p_user_login_id, но не включен в данный код, только данный фрагмент кода.

create or replace PACKAGE BODY pk_adduser
AS
PROCEDURE pr_checkuser (
      p_first_name          IN       VARCHAR,
      p_last_name           IN       VARCHAR,
      p_user_login_id       IN OUT   VARCHAR);

/

PROCEDURE pr_checkuser (
      p_first_name          IN       VARCHAR,
      p_last_name           IN       VARCHAR,
      p_user_login_id       IN OUT   VARCHAR)
IS

BEGIN
    SELECT user_login_id
    INTO p_user_login_id
    FROM user_account
    WHERE first_name = p_first_name
    AND last_name    = p_last_name;
END pr_checkuser;
END;

Мой код Java, как показано ниже:

String getcall = "{call pk_adduser.pr_checkuser (?,?,?)}";
CallableStatement callsts = connect.prepareCall(getcall);
callsts.setString(1, "Ramesh");
callsts.setString(2, "Nuvvula");
callsts.setString(3, "RamN");
callsts.execute();
String user_id = callsts.getString(3);
System.out.println("user_id: "+user_id);

p_user_login_id = 'RamN', который я передаю параметру IN OUT, запрос на выборку возвращает 'RameshN', доступный в базе данных, и пытается присвоить p_user_login_id.

Если я передаю p_user_login_id = 'RamN123', он успешно возвращает 'RameshN'.

Я думаю, что Передача значения параметра является проблемой. Но мой вопрос, как это может вести себя так?

1 Ответ

0 голосов
/ 25 апреля 2019

Делая дикие предположения здесь, но попробуйте это:

String result = "RamN";
String getcall = "{call pk_adduser.pr_checkuser (?,?,?)}";
CallableStatement callsts = connect.prepareCall(getcall);
callsts.setString(1, "Ramesh");
callsts.setString(2, "Nuvvula");
callsts.setString(3,  result);
callsts.execute();
String user_id = callsts.getString(3);

Однако в коде pl / sql нет смысла передавать параметр in / out, значение которого никогда не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...