如何在插入oracle数据库之前减小tif文件的大小

问题描述 投票:0回答:1

有数百个高容量的tif文件 我想在插入数据库之前减小它们的大小。 我能怎么做?我尝试了以下功能但文件但是 文件插入后消失并且没有大小

DECLARE
  vImageData BLOB;
  vSizedImage BLOB;
BEGIN
  SELECT file_blob
  INTO vImageData
  FROM adoption_pix
  WHERE ID = 529;
  DBMS_Lob.createTemporary(vSizedImage, FALSE, DBMS_LOB.CALL);
  ORDSYS.OrdImage.processCopy(vImageData, 'maxScale=75 75', vSizedImage);

  UPDATE ADOPTION_PIX SET FILE_BLOB = vSizedImage
  where id = 529;
EXCEPTION WHEN OTHERS THEN
  dbms_output.put_line('Error Msg '|| SQLERRM);
  commit;
END;
oracle oracle11g blob
1个回答
0
投票

如果这是一项一次性任务,最简单的方法是在操作系统级别执行此任务。

1 将 blob 提取到操作系统

declare
  l_blob      blob;
  l_len       int;
  l_os_file   utl_os_file.file_type;
  l_raw       raw(32767);
  l_size      int := 32767;
  l_idx       int;
begin
  for i in ( select MY_BLOB, MY_FILENAME from MY_TABLE ) 
  loop
    l_idx  := 1;
    l_blob := i.my_blob;
    l_len := dbms_lob.getlength(l_blob);
    l_os_file := utl_os_file.fopen('DIR',i.MY_FILENAME ,'wb', 32767);

    while l_idx <= l_len loop
        dbms_lob.read(l_blob, l_size, l_idx, l_raw);
        utl_os_file.put_raw(l_os_file, l_raw, true);
        l_idx := l_idx + l_size;
    end loop;
  
    utl_os_file.fclose(l_os_file);
  end loop;  
end;
/

2 使用“ffmpeg”之类的东西批量调整它们的大小

3 将它们重新装入

insert into MY_NEW_TABLE 
values ( to_blob(bfilename('DIR','each_file_name'));
© www.soinside.com 2019 - 2024. All rights reserved.