триггер оракула для экспорта BLOB-объектов - PullRequest
0 голосов
/ 14 ноября 2018

Пожалуйста, помогите мне решить следующую проблему:

У меня проблема с триггером для экспорта данных BLOB-объектов из oracle db в каталог.«Экспортный скрипт», который запускается с помощью триггера, работает нормально, поэтому мои данные BLOB-объектов экспортируются в виде файла изображения.Но каждый раз, когда используется триггер, экспортируется не текущий файл изображения, а предпоследняя запись большого двоичного объекта в БД.Вот код для триггера:

create or replace TRIGGER EXP_IMG AFTER INSERT OR UPDATE OF LAST_UPDATE
ON baeume 
for each row
    when (OLD.LAST_UPDATE != NEW.LAST_UPDATE OR NEW.LAST_UPDATE is not null)
declare
    PRAGMA AUTONOMOUS_TRANSACTION;      

BEGIN
        DECLARE               
        t_blob BLOB;
        t_len NUMBER;
        t_file_name VARCHAR2(1000);
        t_output UTL_FILE.FILE_TYPE;
        t_TotalSize NUMBER;
        t_position NUMBER := 1;
        t_chucklen NUMBER := 32767;
        t_chuck RAW(32767);
        t_remain NUMBER;

        BEGIN                                   
          FOR var_a IN
          (                                     
            SELECT GUID, last_update
            FROM baeume
            WHERE image IS NOT NULL
            ORDER BY guid
          )
          LOOP 

          BEGIN
          --t_blob BLOB;
          t_len := 0;
          t_file_name := '';
          --t_output UTL_FILE.FILE_TYPE;
          t_TotalSize := 0;
          t_position  := 1;
          t_chucklen  := 32767;
          --t_chuck := (4096);
          t_remain := 0; 

              SELECT DBMS_LOB.GETLENGTH (image), TO_CHAR (guid) || '.jpg'
              INTO t_TotalSize, t_file_name
              FROM baeume
              WHERE guid = var_a.guid;

              t_remain := t_TotalSize;
              t_output := UTL_FILE.FOPEN ('DIR_IMG', t_file_name, 'wb', 32760);

              SELECT image
              INTO t_blob 
              FROM baeume
              WHERE guid= var_a.guid;

              WHILE t_position < t_TotalSize
                LOOP
                DBMS_LOB.READ (t_blob, t_chucklen, t_position, t_chuck);
                UTL_FILE.PUT_RAW (t_output, t_chuck);
                UTL_FILE.FFLUSH (t_output);
                t_position := t_position + t_chucklen;
                t_remain := t_remain - t_chucklen;
                  IF t_remain < 4096
                    THEN
                    t_chucklen := t_remain;
                  END IF;

                END LOOP;
                UTL_FILE.FCLOSE (t_output);

              END;  

          END LOOP;

        END;
END;

thx chsc

...