DB2 SQL Web 分页 - 如何判断我到达了 EOF

DB2 SQL Web Pagination - How to tell I reach EOF

朋友们, 我正在尝试找到一个非常简单的解决方案来告诉我我已经使用 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)                                               

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

exec sql get diagnostics
  :cnt = row_count;

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

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

看看SQLERRD(2)

For an OPEN statement, if the cursor is insensitive to changes, SQLERRD(2) contains the actual number of rows in the result set. If the cursor is sensitive to changes, SQLERRD(2) contains an estimated number of rows in the result set.

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

DB2_NUMBER_ROWS
If the previous SQL statement was an OPEN or a FETCH which caused the size of the result table to be known, returns the number of rows in the result table. For SENSITIVE cursors, this value can be thought of as an approximation since rows inserted and deleted will affect the next retrieval of this value. Otherwise, the value zero is returned.

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