【问题标题】:DB2 SQL Web Pagination - How to tell I reach EOFDB2 SQL Web 分页 - 如何判断我到达 EOF
【发布时间】:2018-08-08 01:52:02
【问题描述】:

朋友们, 我试图找到一个非常简单的解决方案来告诉我我已经使用 Fetch Next 到达了带有 Web 分页的文件末尾。我正在使用上一个和下一个按钮来触发存储过程。

**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);                                                                          
    TotalRows CHAR(10);                                                                             
    RowCount CHAR(10);                                                                              
    Search CHAR(30);                                                                                
    EndOfFile CHAR(3);                                                                              
    BOF CHAR(1);                                                                                    
    EOF CHAR(1);                                                                                    
    RSL CHAR(2);                                                                                    
  END-PI;                                                                                           

  IF Search = '';                                                                                     

    EXEC SQL 
      Declare RSCURSOR cursor for                                                              
        SELECT CDEPT, CDESC, ROW_NUMBER() OVER(ORDER BY CDESC, CDEPT) as ROWNUMBER                        
          FROM CDPL03                                                                                       
          ORDER BY CDESC, CDEPT                                                                             
          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 CDEPT, CDESC, ROW_NUMBER() OVER(ORDER BY CDESC, CDEPT) as ROWNUMBER                        
          FROM CDPL03                                                                                       
          WHERE CDESC LIKE '%' concat trim(:Search) concat '%' OR                                           
                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;                                                                                              

  // Begin & End of File                                                                              
  IF StartingRow = 1;                                                                                 
    BOF = '1';                                                                                        
    EOF = '0';                                                                                        
  ELSE;                                                                                               
    BOF = '0';                                                                                        
    EOF = '0';                                                                                        
  ENDIF;                                                                                              

  // Validate for SQL errors                                                                          
  IF SQLSTATE = '00000';                                                                              
    RSL = '00';                                                                                       
    //TotalRows2 = %CHAR(TotalRows);                                                                  
  ELSEIF SQLSTATE = '02000';                                                                          
    RSL = '10';                                                                                       
  ELSE;                                                                                               
    RSL = '20';                                                                                       
  ENDIF;                                                                                              

  RETURN;                                                                                             

END-PROC PUR027;                                                                                    


// To create the service program:                                                                   
//           CRTSRVPGM SRVPGM(BPCSO/PUR027WS)                                                       
//            MODULE(BPCSO/PUR027W)                                                                 
//            SRCFILE(BPCSS/PURBNDF) SRCMBR(PUR027WB)                                               

【问题讨论】:

    标签: sql web pagination fetch db2-400


    【解决方案1】:

    在一个块中读取多条记录时,我检索使用GET DIAGNOSTICS 获取的记录数,如下所示:

    exec sql get diagnostics
      :cnt = row_count;
    

    然后如果获取的记录数小于请求的记录数,我知道我在最后一页。

    这种方法有问题。如果最后一页已满,直到您尝试阅读下一页时您才知道它是空的。因此,处理该问题的一种方法是请求比您在页面上显示的更多的记录。也就是说,如果您每页显示 25 条记录,则请求 26 条。如果您的结果集有 26 条记录,则下一页上至少有一条记录。仍然只显示 25 条记录,并且每次将偏移量增加 25 条记录,只需请求 26 条记录。如果记录集的记录少于 26 条,那么您就知道您在最后一页。

    【讨论】:

    • 我喜欢这样。简单的解决方案。我将在我的搜索中再添加一条记录,当我重新显示在网络上时,如果有一条,我将不会发布额外的记录。
    • 还有一个与此无关的问题。你知道我在哪里可以找到使我的查询动态化的文档吗?
    • 试试看,如果有更多问题,再问。如果问题涉及在 RPG 中嵌入 SQL,请使用 RPGLE 和 DB2-400 标记它
    • 太棒了。谢谢!
    【解决方案2】:

    看看SQLERRD(2)

    对于 OPEN 语句,如果游标对更改不敏感,则 SQLERRD(2) 包含结果集中的实际行数。如果游标对更改敏感,则 SQLERRD(2) 会在结果集中包含估计的行数。

    您也可以在打开后使用GET DIAGNOSTICS 获取相同的信息...

    DB2_NUMBER_ROWS
    如果前面的 SQL 语句是导致结果表大小已知的 OPEN 或 FETCH,则返回结果表中的行数。对于敏感游标,这个值可以被认为是一个近似值,因为插入和删除的行会影响下一次检索这个值。否则,返回零值。

    两者的关键点,要准确计数,您需要声明光标INSENSITIVE,它将创建所选行的副本,以便插入、删除和更新不会影响结果。性能也会受到影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2011-09-03
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多