2017-04-27 428 views
0

我们有一个SQLJ文件,我们在其中指定一个迭代器来从表中提取多个记录。目前,我们试图从一张中间表格上传300条记录到实际表格中,每次从300条记录中取出50条记录。通过SQLJ文件关闭OPEN-RECURSIVE和DICTIONARY LOOKUP CURSOR CACHED游标

我们正面临的问题是,每个提取都创建了50个迭代器,其中1个游标是DICTIONARY LOOKUP CURSOR CACHED和49个是OPEN-RECURSIVE。在遍历迭代器后,我们在finally块中关闭了一个关闭对象,但是这会关闭一个游标,我们剩下48个OPEN-RECURSIVE游标和1个DICTIONARY LOOKUP CURSOR CACHED。我想知道是否有任何具体的方法来关闭所有这些。我试图在网络上看,但在这种情况下并没有真正遇到。

#sql public static iterator UploadDetailsList(BigDecimal ID, String FUNCTION_ID,String TABLE_NAME) 
#sql public static iterator UploadDetailsListAnother(BigDecimal ID, String FUNCTION_ID,String TABLE_NAME) 
public List<UploadDto> getRecords(UploadDto newDto,int fromRowNo){ 
    //fromRowNo is sent as 0 
    int maxResults=50; 
    int toRowNum= fromRowNo + maxResults; 
    UploadDetailsList uploadDetailsList=null; 
    UploadDetailsListAnother uploadDetailsListAnother=null; 
    try{ 
     #sql uploadDetailsList = {SELECT ID,FUNCTION_ID,TABLE_NAME FROM UPLOAD_TABLE WHERE STATUS= 'U' AND ROWNUM BETWEEN :fromRowNo AND :toRowNum}; 
     while(uploadDetailsList.next()){ 
      //populate details to Dto object 
      try{ 
       #sql uploadDetailsListAnother = {SELECT ID,FUNCTION_ID,TABLE_NAME FROM UPLOAD_TABLE WHERE STATUS= 'U' AND ROWNUM BETWEEN :fromRowNo AND :toRowNum}; 
       while(uploadDetailsListAnother.next()){ 
        //populate details to Dto object 
       } 
      } 
      catch(Exception e){ 
       //print error 
      } 
     } 
    } 
    catch(Exception e){ 
     //print error 
    } 
    finally{ 
     try{ 
      dbg("Inside finally in List<UploadDto> getRecords(UploadDto newDto,int fromRowNo)"); 
      if(uploadDetailsList != null){ 
       dbg("Closing uploadDetailsList"); 
       uploadDetailsList.close(); 
      } 
      if(uploadDetailsListAnother != null){ 
       dbg("Closing uploadDetailsListAnother"); 
       uploadDetailsListAnother.close(); 
      } 
     } 
     catch(Exception e){ 
      //print error 
     } 
    } 
} 

有人可以让我知道我哪里出错或有什么我可能会失踪?

回答

0

发现我犯的最愚蠢的错误。第一个while循环中的第二个迭代器应该在那个迭代器的try catch后面,然后用finally块关闭。这对我有效。如果别人犯了同样的错误,请留下问题。 这里是代码

#sql public static iterator UploadDetailsList(BigDecimal ID, String FUNCTION_ID,String TABLE_NAME) 
#sql public static iterator UploadDetailsListAnother(BigDecimal ID, String FUNCTION_ID,String TABLE_NAME) 
public List<UploadDto> getRecords(UploadDto newDto,int fromRowNo){ 
    //fromRowNo is sent as 0 
    int maxResults=50; 
    int toRowNum= fromRowNo + maxResults; 
    UploadDetailsList uploadDetailsList=null; 
    UploadDetailsListAnother uploadDetailsListAnother=null; 
    try{ 
     #sql uploadDetailsList = {SELECT ID,FUNCTION_ID,TABLE_NAME FROM UPLOAD_TABLE WHERE STATUS= 'U' AND ROWNUM BETWEEN :fromRowNo AND :toRowNum}; 
     while(uploadDetailsList.next()){ 
      //populate details to Dto object 
      try{ 
       #sql uploadDetailsListAnother = {SELECT ID,FUNCTION_ID,TABLE_NAME FROM UPLOAD_TABLE WHERE STATUS= 'U' AND ROWNUM BETWEEN :fromRowNo AND :toRowNum}; 
       while(uploadDetailsListAnother.next()){ 
        //populate details to Dto object 
       } 
      } 
      catch(Exception e){ 
       //print error 
      } 
      //moved the finally here with closing of the inner iterator 
      finally{ 
       try{ 
        if(uploadDetailsListAnother != null){ 
         dbg("Closing uploadDetailsListAnother"); 
         uploadDetailsListAnother.close(); 
        } 
       } 
       catch(Exception e){ 
        //print error 
       } 
      } 
     } 
    } 
    catch(Exception e){ 
     //print error 
    } 
    finally{ 
     try{ 
      dbg("Inside finally in List<UploadDto> getRecords(UploadDto newDto,int fromRowNo)"); 
      if(uploadDetailsList != null){ 
       dbg("Closing uploadDetailsList"); 
       uploadDetailsList.close(); 
      } 

     } 
     catch(Exception e){ 
      //print error 
     } 
    } 
}