0

如果收到的输入文件有无效记录或没有数据,则尝试处理异常。即使输入文件只有 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);
4

1 回答 1

2

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;
于 2019-11-12T12:47:57.507 回答