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.

在尝试读取结果集之前,您不会收到未找到记录的信息。您的代码中唯一设置 SQLCODESQLSTATE 的语句是 OPENSET RESULT SETS。这些都不会告诉您没有读取记录。您必须实际尝试从结果集中读取才能获得该通知。如果 SQL 无法打开游标,OPEN 将失败,如果没有打开的游标,SET RESULT SETS 将失败,但这些是您可能收到的唯一失败。