当我在网上搜索我的文本框时,如果没有结果,我想通知用户。我正在尝试使用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) 发布于 2018-08-11 01:51:19
根据上面的例子,我看不出应该设置SQLCODE的任何理由。即使没有返回任何结果,以下几行也应该成功。在查看结果集之前,您不会注意到缺少结果。
EXEC SQL SET RESULT SETS Cursor RSCURSOR;
...
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;SQLCODE是在每次SQL语句调用时设置的,所以即使前面的SQL语句失败了,您也不会注意到这里。您必须在每条SQL语句之后检查SQLCODE,以注意其中任何一条语句是否失败。
作为一些额外的改进提示,您应该使用SQLSTATE而不是SQLCODE。SQLSTATE是所有SQL数据库中最新的标准,尽管IBM目前还没有删除SQLCODE的计划,但SQLCODE在世界各地都遭到了抨击。
而且,似乎没有任何理由让它成为外部过程,而不是标准的SQL存储过程。考虑到您拥有的所有逻辑都是用SQL完成的,这似乎是一个不必要的包装。更多信息可以在here和here上找到。
发布于 2018-08-11 02:06:45
在您尝试读取结果集之前,您不会得到找不到记录的结果。代码中唯一可以设置SQLCODE或SQLSTATE的语句是OPEN和SET RESULT SETS。这两个都不会告诉您没有读取任何记录。您必须实际尝试从结果集读取才能获得该通知。如果SQL不能打开游标,OPEN将失败,如果没有打开的游标,SET RESULT SETS将失败,但这是您可能收到的唯一失败。
https://stackoverflow.com/questions/51791530
复制相似问题