我正在使用包含两个 IN 参数和一个 IN OUT 参数的 CallableStatement 从 Java 调用 pk_adduser.pr_checkuser()。我没有使用 CallableStatement.registerOutParameter(int parameterIndex, int sqlType) 注册 IN OUT 参数。 但如果返回值长度与输入值长度相同,我仍然能够使用 IN OUT 参数获取输出值,否则我将收到 SQL 异常,如 ORA-06502: PL/SQL: numeric or value error。
我正在使用 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'。
我认为传递参数值的长度是问题所在。但我的问题是它怎么会这样?
最佳答案
在这里大胆猜测,但试试这个:
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 值的 in/out 参数是没有意义的。
关于java - 为什么 IN OUT 参数返回值而不注册可调用语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55850653/