Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Загрузка файла в blob  [new]
slavamonster2
Member

Откуда:
Сообщений: 39
Всем добрый день! У меня есть процедура ниже. Она работает корректно, при условии что файлы располагаются в указанной директории. Но проблема заключается в следующем: это процедура должна запускаться раз 5 минут и не факт, что в директории находятся необходимые файлики). Если же их нет, то выводится вполне стандартная ошибка ORA-22288: file or LOB operation FILEOPEN failed.

Как мне обойти эту ситуацию? Проверка на null lFile не помогает.

CREATE OR REPLACE PROCEDURE BLOB_LOAD(dir in varchar2) AS

  lBlob         BLOB;
  lFile         BFILE;
  i             number(1);
  sproduct_file varchar2(30);

BEGIN

  for cur in (select q.name sproduct_name, q.sync_id nproduct
                from is_nsi_product q) loop
  
    lFile := BFILENAME(dir, cur.sproduct_name || '.xlsx');
    if lFile is not null then
      i := null;
      select nvl(max(qw.a), 0) + 1
        into i
        from (select my_to_number(REGEXP_REPLACE(t.blob_name,
                                                 '(.*)-(.*)$',
                                                 '\2')) a
                from is_blob t
               where t.product = cur.nproduct) qw;
    
      sproduct_file := cur.sproduct_name || '-' || i;
    
      insert into is_blob
        (sync_id,
         blob_file,
         blob_name,
         create_date,
         sign_block,
         author,
         product,
         status)
      values
        (seq_id.nextval,
         empty_blob(),
         sproduct_file,
         sysdate,
         0,
         'dir',
         cur.nproduct,
         0)
      
      RETURNING blob_file INTO lBlob;
    
      DBMS_LOB.OPEN(lFile, DBMS_LOB.LOB_READONLY);
    
      DBMS_LOB.OPEN(lBlob, DBMS_LOB.LOB_READWRITE);
    
      DBMS_LOB.LOADFROMFILE(DEST_LOB => lBlob,
                            SRC_LOB  => lFile,
                            AMOUNT   => DBMS_LOB.GETLENGTH(lFile));
    
      DBMS_LOB.CLOSE(lBlob);
      UTL_FILE.FREMOVE(dir, cur.sproduct_name || '.xlsx');
      COMMIT;
    end if;
    DBMS_LOB.CLOSE(lFile);
  end loop;
END;
23 мар 15, 12:08    [17418495]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка файла в blob  [new]
exception_init
Guest
slavamonster2,

так а что в результате "обойти" должно получиться?
23 мар 15, 12:15    [17418554]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка файла в blob  [new]
slavamonster2
Member

Откуда:
Сообщений: 39
Ничего. просто должно дальше пойти по курсору cur
23 мар 15, 12:16    [17418564]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка файла в blob  [new]
123йй
Member

Откуда:
Сообщений: 1635
slavamonster2,
dbms_lob.fileexists
23 мар 15, 12:18    [17418575]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка файла в blob  [new]
slavamonster2
Member

Откуда:
Сообщений: 39
То, что надо. спс.

CREATE OR REPLACE PROCEDURE BLOB_LOAD(dir in varchar2) AS

  lBlob         BLOB;
  lFile         BFILE;
  i             number(1);
  sproduct_file varchar2(30);
  file_exists   BOOLEAN := FALSE;

BEGIN

  for cur in (select q.name sproduct_name, q.sync_id nproduct
                from is_nsi_product q) loop
  
    lFile       := BFILENAME(dir, cur.sproduct_name || '.xlsx');
    file_exists := DBMS_LOB.FILEEXISTS(lFile) = 1;
  
    if file_exists then
      select nvl(max(qw.a), 0) + 1
        into i
        from (select my_to_number(REGEXP_REPLACE(t.blob_name,
                                                 '(.*)-(.*)$',
                                                 '\2')) a
                from is_blob t
               where t.product = cur.nproduct) qw;
    
      sproduct_file := cur.sproduct_name || '-' || i;
    
      insert into is_blob
        (sync_id,
         blob_file,
         blob_name,
         create_date,
         sign_block,
         author,
         product,
         status)
      values
        (seq_id.nextval,
         empty_blob(),
         sproduct_file,
         sysdate,
         0,
         'dir',
         cur.nproduct,
         0)
      
      RETURNING blob_file INTO lBlob;
    
      DBMS_LOB.OPEN(lFile, DBMS_LOB.LOB_READONLY);
    
      DBMS_LOB.OPEN(lBlob, DBMS_LOB.LOB_READWRITE);
    
      DBMS_LOB.LOADFROMFILE(DEST_LOB => lBlob,
                            SRC_LOB  => lFile,
                            AMOUNT   => DBMS_LOB.GETLENGTH(lFile));
    
      DBMS_LOB.CLOSE(lBlob);
    
      DBMS_LOB.CLOSE(lFile);
    
      UTL_FILE.FREMOVE(dir, cur.sproduct_name || '.xlsx');
      COMMIT;
    end if;
  end loop;
END;
23 мар 15, 12:35    [17418714]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить