Закрытие курсоров OPEN-RECURSIVE и DICTIONARY LOOKUP CURSOR CACHED через файл SQLJ

У нас есть файл SQLJ, в котором мы указали итератор для извлечения нескольких записей из таблицы. В настоящее время мы пытаемся загрузить 300 записей из промежуточной таблицы в фактическую таблицу, выбирая 50 записей из 300 записей одновременно.

Проблема, с которой мы сталкиваемся, заключается в том, что каждая выборка создает 50 итераторов, из которых 1 курсор является CURCOR DOCTIONARY LOOKUP CURSOR, а 49 - OPEN-RECURSIVE. После того, как мы перебрали итератор, у нас есть вызов close в блоке 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
        }
    }
}

Может кто-нибудь сообщить мне, где я иду не так или есть что-то, что я могу пропустить?

1 ответ

Нашел самую глупую ошибку, которую я сделал. 2-й итератор внутри 1-го цикла while должен был быть тут же закрыт с блоком finally после перехвата try для этого итератора. Это сработало для меня. Оставив здесь вопрос на случай, если кто-то еще совершит ту же ошибку. Вот код

#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
        }
    }
}
Другие вопросы по тегам