Проверка логов FreeFileSync с помощью plsql

create or replace procedure P_R_SYNC_LOG as

sDIR varchar2(1000) := 'D:\bcp\FreeFileSync\Logs';
sSQLCODE varchar2(1000);
SRC_LOC BFILE;
cCLOB CLOB;
bBLOB BLOB;
sMESSAGE VARCHAR2(1000);

/* DIRECTORY */
procedure P_R_FILESYNC_DIR(sDIR in varchar2) as
sDIREXIST varchar2(1000);
begin
begin
/* ищем по названию директории BCP_DIR */
SELECT directory_name
INTO sDIREXIST
FROM dba_directories
where directory_name = 'FILESYNC_DIR';
exception
when others then
sDIREXIST := '';
end;
/* если не найдена, то создаем директорию */
if (sDIREXIST is null) then
execute immediate 'CREATE OR REPLACE DIRECTORY FILESYNC_DIR AS ''' || sDIR || '''';
end if;
end P_R_FILESYNC_DIR;
/* Конвертация блоб в клоб */
FUNCTION blob_to_clob(plob IN BLOB) RETURN CLOB IS
lclob_Result CLOB := 'X';
l_dest_offsset INTEGER := 1;
l_src_offsset INTEGER := 1;
l_lang_context INTEGER := dbms_lob.default_lang_ctx;
l_warning INTEGER;
BEGIN
IF plob IS NOT NULL AND LENGTH(plob) > 0 THEN
dbms_lob.converttoclob(dest_lob => lclob_Result,
src_blob => plob,
amount => dbms_lob.lobmaxsize,
dest_offset => l_dest_offsset,
src_offset => l_src_offsset,
blob_csid => nls_charset_id('AL32UTF8'),
lang_context => l_lang_context,
warning => l_warning);
IF l_warning != 0 THEN
sSQLCODE:='Function blob_to_clob warning:' ||l_warning;
RETURN NULL;
END IF;
RETURN(lclob_Result);
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
sSQLCODE:='Function blob_to_clob error:' || SQLCODE;
RETURN NULL;
END blob_to_clob;

procedure P_R_FILESYNC_DIR_LOG as
sFILE_SYNC_LOG varchar2(1000);
sNAME_JOB varchar2(100):='SyncJob1';
nFOUND number:=0;
nERR number:=0;
begin
/* ищем файл */
for h in 0..24 loop /* цикл по часам*/
for m in 0..60 loop /* цикл по минутам*/
for s in 0..60 loop /* цикл по секундам*/
sFILE_SYNC_LOG:= sNAME_JOB||' '||to_char(sysdate, 'YYYY-MM-DD')||' '||trim(to_char(h, '09'))||trim(to_char(m, '09'))||trim(to_char(s, '09'))||'.log';

src_loc := BFILENAME('FILESYNC_DIR', sFILE_SYNC_LOG);

if (DBMS_LOB.FILEEXISTS(src_loc) = 1) then
DBMS_LOB.CREATETEMPORARY(bBLOB, TRUE, DBMS_LOB.SESSION);
DBMS_LOB.OPEN(src_loc, DBMS_LOB.LOB_READONLY);
DBMS_LOB.OPEN(bBLOB, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.LOADFROMFILE(dest_lob => bBLOB,
src_lob => src_loc,
amount => DBMS_LOB.getLength(src_loc));
DBMS_LOB.CLOSE(bBLOB);
DBMS_LOB.CLOSE(src_loc);
cCLOB := blob_to_clob(bBLOB);

if cCLOB is not null then
if (regexp_like(cCLOB, 'Ошибка')) then
nERR:=nERR+1;
end if;
nFOUND:=nFOUND+1;
end if;
end if;

end loop;
end loop;
end loop;

if (nFOUND<1) then sMESSAGE := 'Лог файл FreeFileSync не найден'; end if; if (nERR>0) then
if (nERR*100/nFOUND>60) then
sMESSAGE := 'Проверить синхронизацию бэкапа. В лог файле FreeFileSync Ошибка.';
end if;
end if;
if (sMESSAGE is not null) then

--записать в таблицу
P_R_SET_STAT(sMESSAGE, 14);
end if;

begin
DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
end;

end P_R_FILESYNC_DIR_LOG;

begin

P_R_FILESYNC_DIR(sDIR);
P_R_FILESYNC_DIR_LOG;

end P_R_SYNC_LOG;