GET_FILE 中的 PLSQL 异常处理
Posted
技术标签:
【中文标题】GET_FILE 中的 PLSQL 异常处理【英文标题】:PLSQL Exception handling in GET_FILE 【发布时间】:2019-11-11 21:50:45 【问题描述】:如果收到的输入文件有无效记录或没有数据,则尝试处理异常。即使输入文件只有 1 条记录,以下异常也会循环运行。
LOOP
BEGIN
UTL_FILE.GET_LINE(a_UIN_input_file,a_UIN_file);
a_rec := substr(a_uin_file,1,9);
EXCEPTION
WHEN NO_DATA_FOUND THEN
a_error_file := utl_file.fopen('TAMUOUT','PWT_TEST5_ERROR.txt','w');
utl_file.put_line(a_error_file,'Bad UIN Read ' ||SQLERRM||'\n');
utl_file.fclose(a_error_file);
-- EXIT;
END;
END LOOP;
FOR rec IN get_details_4_uin_c(a_rec) LOOP
a_pidm :=fwt_get_pidm_from_uin(a_rec);
a_bill_hours := fwt_get_enrolled_hours(a_pidm,in_term_code);
utl_file.put_line(a_out_file,a_parm,
autoflush=>TRUE);
END LOOP;
utl_file.fclose(a_uin_input_file);
【问题讨论】:
你为什么注释掉 EXIT 调用? 如果我使用退出而不是写入错误文件,它可以工作。 我尝试退出以检查它为什么进入循环 “进入循环”是什么意思。请编辑问题并更好地解释。 我的问题是正确的。一旦读取到错误记录,此逻辑会继续写入错误文件而不关闭文件。 【参考方案1】:UTL_FILE.GET_LINE 会在您到达文件末尾并继续尝试阅读更多内容时引发 NO_DATA_FOUND 异常。
所以你的 NO_DATA_FOUND 异常处理程序应该退出循环。但是在循环中,如果您成功读取了一行,则在其上运行您的循环。
我相信代码会帮助您找到解决方案。
BEGIN
LOOP
BEGIN
UTL_FILE.get_line (a_uin_input_file, a_uin_file);
a_rec := SUBSTR (a_uin_file, 1, 9);
FOR rec IN get_details_4_uin_c (a_rec)
LOOP
a_pidm := fwt_get_pidm_from_uin (a_rec);
a_bill_hours := fwt_get_enrolled_hours (a_pidm, in_term_code);
UTL_FILE.put_line (a_out_file, a_parm, autoflush => TRUE);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
UTL_FILE.fclose (a_uin_input_file);
EXIT;
END;
END LOOP;
END;
【讨论】:
谢谢。我应该关闭错误文件 (a_error_file) 还是我的输入文件 (a_uin_input_file)。以上是关于GET_FILE 中的 PLSQL 异常处理的主要内容,如果未能解决你的问题,请参考以下文章