gpt4 book ai didi

java - DB2 java 存储过程调用返回错误 SQLCODE=-440, SQLSTATE=42884

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:04 26 4
gpt4 key购买 nike

我正在对 DB2 执行一个简单的存储过程调用。当它调用存储过程时,它总是返回此错误:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MEDIAN_RESULT_SET;PROCEDURE, DRIVER=3.66.46

==========Java代码:

String JDBC_DRIVER = "com.ibm.db2.jcc.DB2Driver";
// STEP 2: Register JDBC driver
Class.forName(JDBC_DRIVER);

// STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);

// to execute the stored procedure.
System.out.println("CALL median_result_set(?)");
String sql = "CALL median_result_set(?)";
CallableStatement stmt1 = conn.prepareCall(sql);
stmt1.registerOutParameter(1, Types.DOUBLE);

stmt1.execute();
System.out.println("jdbcadapter->callproc after execute " + sql);
stmt1.close();

conn.close();

==============db2 clp 命令行有效:

c:SP>db2 call median_result_set(?)
Value of output parameters
--------------------------
Parameter Name : MEDIANSALARY
Parameter Value : +7.68582000000000E+004

Result set 1
--------------
NAME JOB SALARY
--------- ----- ---------
Marenghi Mgr 77506.75
O'Brien Sales 78006.00

================存储过程定义:

CREATE PROCEDURE median_result_set
-- Declare medianSalary as OUT so it can be used to return values
(OUT medianSalary DOUBLE)
RESULT SETS 2
LANGUAGE SQL
BEGIN

DECLARE v_numRecords INT DEFAULT 1;
DECLARE v_counter INT DEFAULT 0;

DECLARE c1 CURSOR FOR
SELECT salary FROM staff
ORDER BY CAST(salary AS DOUBLE);

-- use WITH RETURN in DECLARE CURSOR to return a result set
DECLARE c2 CURSOR WITH RETURN FOR
SELECT name, job, salary
FROM staff
WHERE CAST(salary AS DOUBLE) > medianSalary
ORDER BY salary;

-- use WITH RETURN in DECLARE CURSOR to return another result set
DECLARE c3 CURSOR WITH RETURN FOR
SELECT name, job, salary
FROM staff
WHERE CAST(salary AS DOUBLE) < medianSalary
ORDER BY SALARY DESC;

DECLARE CONTINUE HANDLER FOR NOT FOUND
SET medianSalary = 6666;

-- initialize OUT parameter
SET medianSalary = 0;

SELECT COUNT(*) INTO v_numRecords FROM STAFF;

OPEN c1;

WHILE v_counter < (v_numRecords / 2 + 1) DO
FETCH c1 INTO medianSalary;
SET v_counter = v_counter + 1;
END WHILE;
CLOSE c1;

-- return 1st result set, do not CLOSE cursor
OPEN c2;

-- return 2nd result set, do not CLOSE cursor
OPEN c3;
END @

最佳答案

基本上“SQLCODE=-440, SQLSTATE=42884”就是找不到存储过程。

我看到一个很常见的原因是参数不匹配。

对于我的情况,我注意到在 java 代码中,我必须将模式名称放在存储过程名称的前面,例如,我应该做 SCHEMANAME.median_result_set(?) 而不是 median_result_set(?)

可以使用一些数据库管理工具找到此 SP 的 SCHEMANAME。

我不需要从命令行指定模式名称的原因:似乎当我从创建该 SP 时使用同一用户从 CLP 命令行调用 SP 时,不需要模式名称(因为它们在内部匹配)。当然,如果在命令行指定schema 总是对的。我观察到 DB2 在内部使用用户名作为模式名称。例如,如果“ADMINISTRATOR”创建了一个 SP,字符串“ADMINISTRATOR”就是它的模式名称,只要我在 Windows 上看到。

关于java - DB2 java 存储过程调用返回错误 SQLCODE=-440, SQLSTATE=42884,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com