【问题标题】:DB2 SQL - Issue with SQLCODEDB2 SQL - SQLCODE 问题
【发布时间】:2018-08-10 17:37:38
【问题描述】:

当我在网络上搜索我的文本框时,如果没有结果,我想通知用户。我正在尝试使用 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)                                               

【问题讨论】:

  • 谢谢大家。得到结果后,我处理了它,并且效果很好。 JMarkMurphy,Player1 第一个回答,我认为标记为回答才公平。对不起。感谢您抽出宝贵时间再次回答我的问题。

标签: sql ibm-midrange db2-400 rpgle


【解决方案1】:

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

【讨论】:

  • 您也许可以使用我对您其他问题的回答中提到的 SQLERR(2) 或 GET DIAGNOSTICS
  • 但是这些数字只是开盘时的估计,根据我的经验,并不是很准确。
【解决方案2】:

我看不出有任何理由应该根据给出的示例设置SQLCODE。即使没有返回结果,以下行也应该成功。在查看结果集之前,您不会注意到缺少结果。

EXEC SQL SET RESULT SETS Cursor RSCURSOR;
...
EXEC SQL SET RESULT SETS Cursor RSCURSOR2;

在每个 SQL 语句调用上都设置了 SQLCODE,因此即使前面的 SQL 语句失败,您也不会在这里注意到。您必须在每个 SQL 语句之后检查 SQLCODE,以了解其中是否有任何失败。

作为一些额外的改进提示,您应该使用 SQLSTATE 而不是 SQLCODE。 SQLSTATE 是所有 SQL 数据库中的最新标准,尽管 IBM i 目前没有计划实际删除它,但 SQLCODE 在所有地方都已被弃用。

此外,似乎没有任何理由将此作为外部过程而不是标准 SQL 存储过程。考虑到您拥有的所有逻辑无论如何都是在 SQL 中完成的,这似乎是一个不必要的包装。更多信息可以在herehere找到。

【讨论】:

  • 我不确定您对外部程序的意思。我在 Lotus Notes 中从 Web 调用。不知道如何做你的建议。
  • 我之前使用的是 SQLSTATE。我只是去尝试了一下。即使我知道搜索中没有记录,它也总是说“00000”。如果 SQLSTATE = '00000'; RSL = '00'; ELSEIF SQLSTATE = '02000'; RSL = '10';别的; RSL = '20'; ENDIF;
  • 我想我理解你在这里所说的关于 SQLSTATE 的内容。当我从网络调用返回结果时,如果结果为空/null,那么此时执行我必须指定的操作,没有记录。对吗?
  • 正如预期的那样。 EXEC SQL SET RESULT SETS Cursor RSCURSOR' 行没有理由返回 0 以外的 SQLSTATE。如果您想知道返回了多少行,可以尝试从游标中读取,也可以在从 SQLERRD( 3).
  • 是的。在这种情况下,在获得结果后采取行动是一个完全可行的解决方案。如果你想在服务器端做,你也可以使用我上次评论中的建议。
猜你喜欢
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2014-11-16
相关资源
最近更新 更多