首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLCODE SQL - DB2问题

SQLCODE SQL - DB2问题
EN

Stack Overflow用户
提问于 2018-08-11 01:37:38
回答 2查看 739关注 0票数 1

当我在网上搜索我的文本框时,如果没有结果,我想通知用户。我正在尝试使用SQLCODE保留字段,但它不起作用。当我运行调试器时,它总是被设置为000。我没有收到错误消息。

我做了一些研究,我认为您需要在存储过程中添加保留字段。我确实做到了。我不确定我做错了什么。

存储过程:

代码语言:javascript
复制
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)'    

模块:

代码语言:javascript
复制
**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)                                               
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-11 01:51:19

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

代码语言:javascript
复制
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完成的,这似乎是一个不必要的包装。更多信息可以在herehere上找到。

票数 1
EN

Stack Overflow用户

发布于 2018-08-11 02:06:45

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51791530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档