为什么在不注册可调用语句的情况下IN OUT参数返回值?

时间:2019-04-25 13:39:11

标签: java oracle

我正在使用CallableStatement从Java调用pk_adduser.pr_checkuser(),其中包含两个IN参数和一个IN OUT参数。我尚未使用CallableStatement.registerOutParameter(int parameterIndex,int sqlType)注册IN OUT参数。 但是,如果返回值的长度与输入值的长度相同,我仍然能够使用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 :(得分:0)

在这里进行疯狂的猜测,但是尝试一下:

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参数,而该参数的in值从未使用过。