请参阅本文末尾的 pl/sql 代码块
我正在编写一些 pl/sql 代码来从 zip 中提取某些文件。我正在使用http://technology.amis.nl/wp-content/uploads/2010/06/as_zip7.txt中的“as_zip”包来获取 zip ( ) 中的文件名AS_ZIP.GET_FILE_LIST
并提取某些文件名放入BLOB
( AS_ZIP.GET_FILE
) 中,然后使用 . 将其写入文件UTL_FILE
。
第一个问题
据我在监控中看到的,UNDO TABLESPACE
在此过程中似乎没有被写入,但我想与其他人确认这是真的……如果我只是将特定文件的内容提取到然后将BLOB
其写入文件,会UNDO TABLESPACE
受到影响吗?企业在他们收费的数据库上使用的每一兆字节,所以我们需要尽可能地寻找减少表空间的方法......
第二个问题
就将 blob 写入文件而言,是否有比我如何完成它更有效的方法?第一个文件(碰巧是最大的 3.03GB)写入文件系统的速度很快,但随后每个文件的写入速度似乎越来越慢。我是否需要释放资源或以不同方式分配它们或......
SET SERVEROUTPUT ON
declare
zip_files as_zip.file_list;
l_file UTL_FILE.FILE_TYPE;
L_BUFFER RAW (32767);
L_AMOUNT BINARY_INTEGER := 32767;
l_pos INTEGER;
L_BLOB BLOB;
l_blob_len INTEGER;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
ZIP_FILES := AS_ZIP.GET_FILE_LIST( 'MY_DIR', 'MY_FILE.zip' );
for i in zip_files.first() .. zip_files.last
LOOP
FOR EXT_TABLE_REC IN (SELECT LOCATION FROM USER_EXTERNAL_LOCATIONS) LOOP
-- Check if there's a match between what's in the zip file and what the external table name is
IF (INSTR(TRIM(LOWER(ZIP_FILES(I))),TRIM(LOWER(EXT_TABLE_REC.LOCATION || '__'))) > 0) THEN
DBMS_OUTPUT.PUT_LINE('Match found on ' || ZIP_FILES(I) || ', ' || EXT_TABLE_REC.LOCATION || ' - processing...');
L_BLOB := AS_ZIP.GET_FILE('MY_DIR', 'MY_FILE.zip', zip_files(i));
-- Open the destination file. Note the third parameter "wb"
l_file := UTL_FILE.FOPEN ('MY_DIR', EXT_TABLE_REC.LOCATION, 'wb');
l_blob_len := DBMS_LOB.getlength (l_blob);
-- Read chunks of the BLOB and write them to the file until complete.
l_pos := 1;
WHILE l_pos < l_blob_len
LOOP
DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
UTL_FILE.put_raw(l_file, l_buffer, FALSE);
l_pos := l_pos + l_amount;
END LOOP;
-- Close the file.
UTL_FILE.FCLOSE (L_FILE);
end if;
end loop;
end loop;
END;
/
如果有人想知道,这是我登录时返回的数据库信息:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, Oracle Label Security,
OLAP, Data Mining, Oracle Database Vault and Real Application Testing options
编辑 1
我已经EXCEPTION WHEN OTHERS
根据我在 Oracle 网站上找到的信息删除了该块。现在,这个过程似乎只是挂起,所以不确定问题现在发生在哪里......