DB2 SQL - SQLCODE 问题
DB2 SQL - Issue with SQLCODE
当我在网络上的文本框上进行搜索时,如果没有结果,我想通知用户。我正在尝试使用 SQLCODE 保留字段,但它不起作用。当我 运行 调试器时,它总是设置为 000。我没有收到任何错误消息。
我做了一些研究,我认为您需要将保留字段添加到存储过程中。我做到了。我不确定我做错了什么。
存储过程:
drop procedure BPCSO/TEST_MB
create procedure BPCSO/TEST_MB
(
InOut DEC(3,0),
InOut DEC(3,0),
In CHAR(30),
In DEC(3,0),
Out CHAR(02)
)
language rpgle
parameter style general
not deterministic
READS SQL DATA
result sets 1
external name 'BPCSO/PUR027WS(PUR027)'
模块:
**FREE
// RFC Main Grid
CTL-OPT NOMAIN OPTION (*SRCSTMT : *NODEBUGIO);
DCL-PROC PUR027 EXPORT;
DCL-PI PUR027 EXTPROC(*DCLCASE);
StartingRow PACKED(3:0);
NbrOfRows PACKED(3:0);
Search CHAR(30);
SQLCODE PACKED(3:0);
RSL CHAR(2);
END-PI;
IF Search = '';
EXEC SQL Declare RSCURSOR cursor for
SELECT *
FROM CDPL03
ORDER BY CDEPT, CDESC
OFFSET (:StartingRow - 1) * :NbrOfRows ROWS
FETCH NEXT :NbrOfRows ROWS ONLY;
EXEC SQL Open RSCURSOR;
EXEC SQL SET RESULT SETS Cursor RSCURSOR;
ELSE;
EXEC SQL Declare RSCURSOR2 cursor for
SELECT *
FROM CDPL03
WHERE CDESC LIKE '%' concat trim(:Search) concat '%' AND
CDEPT LIKE '%' concat trim(:Search) concat '%'
ORDER BY CDESC, CDEPT
OFFSET (:StartingRow - 1) * :NbrOfRows ROWS
FETCH NEXT :NbrOfRows ROWS ONLY;
EXEC SQL Open RSCURSOR2;
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;
ENDIF;
// Validate for SQL errors
IF SQLCODE = 0;
RSL = '00';
ELSEIF SQLCODE > 0;
RSL = '10';
ELSEIF SQLCODE < 0;
RSL = '20';
ENDIF;
//EXEC SQL SELECT COUNT(*)
// INTO :RowCount
// FROM CDPL03;
RETURN;
END-PROC PUR027;
// To create the service program:
// CRTSRVPGM SRVPGM(BPCSO/PUR027WS)
// MODULE(BPCSO/PUR027W)
// SRCFILE(BPCSS/PURBNDF) SRCMBR(PUR027WB)
我看不出有任何理由 SQLCODE
应该根据给出的示例进行设置。即使没有返回结果,以下几行也应该成功。在查看结果集之前,您不会注意到缺少结果。
EXEC SQL SET RESULT SETS Cursor RSCURSOR;
...
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;
SQLCODE 是在每个 SQL 语句调用时设置的,因此即使先前的 SQL 语句失败,您也不会在此处注意到。您必须在每个 SQL 语句之后检查 SQLCODE,以注意是否有任何语句失败。
作为一些额外的改进提示,您应该使用 SQLSTATE 而不是 SQLCODE。 SQLSTATE 是所有 SQL 数据库中的最新标准,并且 SQLCODE 在所有地方都被弃用,尽管 IBM i 目前没有计划实际删除它。
此外,似乎没有任何理由将其设为外部过程而不是标准 SQL 存储过程。考虑到您拥有的所有逻辑无论如何都是在 SQL 中完成的,这似乎是一个不必要的包装。可以找到更多信息 here and here.
在尝试读取结果集之前,您不会收到未找到记录的信息。您的代码中唯一设置 SQLCODE
或 SQLSTATE
的语句是 OPEN
和 SET RESULT SETS
。这些都不会告诉您没有读取记录。您必须实际尝试从结果集中读取才能获得该通知。如果 SQL 无法打开游标,OPEN
将失败,如果没有打开的游标,SET RESULT SETS
将失败,但这些是您可能收到的唯一失败。
当我在网络上的文本框上进行搜索时,如果没有结果,我想通知用户。我正在尝试使用 SQLCODE 保留字段,但它不起作用。当我 运行 调试器时,它总是设置为 000。我没有收到任何错误消息。
我做了一些研究,我认为您需要将保留字段添加到存储过程中。我做到了。我不确定我做错了什么。
存储过程:
drop procedure BPCSO/TEST_MB
create procedure BPCSO/TEST_MB
(
InOut DEC(3,0),
InOut DEC(3,0),
In CHAR(30),
In DEC(3,0),
Out CHAR(02)
)
language rpgle
parameter style general
not deterministic
READS SQL DATA
result sets 1
external name 'BPCSO/PUR027WS(PUR027)'
模块:
**FREE
// RFC Main Grid
CTL-OPT NOMAIN OPTION (*SRCSTMT : *NODEBUGIO);
DCL-PROC PUR027 EXPORT;
DCL-PI PUR027 EXTPROC(*DCLCASE);
StartingRow PACKED(3:0);
NbrOfRows PACKED(3:0);
Search CHAR(30);
SQLCODE PACKED(3:0);
RSL CHAR(2);
END-PI;
IF Search = '';
EXEC SQL Declare RSCURSOR cursor for
SELECT *
FROM CDPL03
ORDER BY CDEPT, CDESC
OFFSET (:StartingRow - 1) * :NbrOfRows ROWS
FETCH NEXT :NbrOfRows ROWS ONLY;
EXEC SQL Open RSCURSOR;
EXEC SQL SET RESULT SETS Cursor RSCURSOR;
ELSE;
EXEC SQL Declare RSCURSOR2 cursor for
SELECT *
FROM CDPL03
WHERE CDESC LIKE '%' concat trim(:Search) concat '%' AND
CDEPT LIKE '%' concat trim(:Search) concat '%'
ORDER BY CDESC, CDEPT
OFFSET (:StartingRow - 1) * :NbrOfRows ROWS
FETCH NEXT :NbrOfRows ROWS ONLY;
EXEC SQL Open RSCURSOR2;
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;
ENDIF;
// Validate for SQL errors
IF SQLCODE = 0;
RSL = '00';
ELSEIF SQLCODE > 0;
RSL = '10';
ELSEIF SQLCODE < 0;
RSL = '20';
ENDIF;
//EXEC SQL SELECT COUNT(*)
// INTO :RowCount
// FROM CDPL03;
RETURN;
END-PROC PUR027;
// To create the service program:
// CRTSRVPGM SRVPGM(BPCSO/PUR027WS)
// MODULE(BPCSO/PUR027W)
// SRCFILE(BPCSS/PURBNDF) SRCMBR(PUR027WB)
我看不出有任何理由 SQLCODE
应该根据给出的示例进行设置。即使没有返回结果,以下几行也应该成功。在查看结果集之前,您不会注意到缺少结果。
EXEC SQL SET RESULT SETS Cursor RSCURSOR;
...
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;
SQLCODE 是在每个 SQL 语句调用时设置的,因此即使先前的 SQL 语句失败,您也不会在此处注意到。您必须在每个 SQL 语句之后检查 SQLCODE,以注意是否有任何语句失败。
作为一些额外的改进提示,您应该使用 SQLSTATE 而不是 SQLCODE。 SQLSTATE 是所有 SQL 数据库中的最新标准,并且 SQLCODE 在所有地方都被弃用,尽管 IBM i 目前没有计划实际删除它。
此外,似乎没有任何理由将其设为外部过程而不是标准 SQL 存储过程。考虑到您拥有的所有逻辑无论如何都是在 SQL 中完成的,这似乎是一个不必要的包装。可以找到更多信息 here and here.
在尝试读取结果集之前,您不会收到未找到记录的信息。您的代码中唯一设置 SQLCODE
或 SQLSTATE
的语句是 OPEN
和 SET RESULT SETS
。这些都不会告诉您没有读取记录。您必须实际尝试从结果集中读取才能获得该通知。如果 SQL 无法打开游标,OPEN
将失败,如果没有打开的游标,SET RESULT SETS
将失败,但这些是您可能收到的唯一失败。