Закрытие курсоров 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
}
}
}