UTL_COMPRESS 多个文件

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

当我传递服务器上的一个文件名(test.txt.2023)时,它就起作用了。 但是如何使其适用于服务器上以单词 test 开头的多个文件呢? 我得到以下文件: 测试.txt.2023 测试.txt.2026 测试.txt.2028

DECLARE
in_filename VARCHAR2(100);
src_file   BFILE;
v_content  BLOB;
v_blob_len INTEGER;
v_file     utl_file.file_type;
v_buffer   RAW(32767);
v_amount   BINARY_INTEGER := 32767;
v_pos      INTEGER := 1;
l_file_handler   UTL_FILE.file_type;

BEGIN
in_filename := 'test.txt.2023';
src_file := bfilename('DMPS', in_filename);
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
v_content  := utl_compress.lz_compress(src_file, 1);
v_blob_len := dbms_lob.getlength(v_content);
v_file     := utl_file.fopen('DMPS',
                            in_filename || '.gz',
                            'wb');
WHILE v_pos < v_blob_len LOOP
dbms_lob.READ(v_content, v_amount, v_pos, v_buffer);
utl_file.put_raw(v_file, v_buffer, TRUE);
v_pos := v_pos + v_amount;
END LOOP;
utl_file.fclose(v_file);

EXCEPTION
WHEN OTHERS THEN
IF utl_file.is_open(v_file) THEN
utl_file.fclose(v_file);
END IF;
RAISE;
END;
oracle compression utl-file
1个回答
0
投票

将适用于一个文件的匿名块转化为一个过程,然后为不同的文件名调用它。

DECLARE
  PROCEDURE compress_file(
    in_filename VARCHAR2
  )
  IS
    src_file   BFILE;
    v_content  BLOB;
    v_blob_len INTEGER;
    v_file     utl_file.file_type;
    v_buffer   RAW(32767);
    v_amount   BINARY_INTEGER := 32767;
    v_pos      INTEGER := 1;
    l_file_handler   UTL_FILE.file_type;
  BEGIN
    src_file := bfilename('DMPS', in_filename);
    dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
    v_content  := utl_compress.lz_compress(src_file, 1);
    v_blob_len := dbms_lob.getlength(v_content);
    v_file     := utl_file.fopen('DMPS', in_filename || '.gz', 'wb');
    WHILE v_pos < v_blob_len LOOP
      dbms_lob.READ(v_content, v_amount, v_pos, v_buffer);
      utl_file.put_raw(v_file, v_buffer, TRUE);
      v_pos := v_pos + v_amount;
    END LOOP;
    utl_file.fclose(v_file);
  EXCEPTION
    WHEN OTHERS THEN
      IF utl_file.is_open(v_file) THEN
        utl_file.fclose(v_file);
      END IF;
      RAISE;
  END;
BEGIN
  compress_file('test.txt.2023');
  compress_file('test.txt.2026');
  compress_file('test.txt.2028');
END;
/
© www.soinside.com 2019 - 2024. All rights reserved.