当我传递服务器上的一个文件名(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;
将适用于一个文件的匿名块转化为一个过程,然后为不同的文件名调用它。
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;
/