gpt4 book ai didi

oracle - 使用 UTL_FILE 从 Oracle 表中提取 BLOB 文件,有些压缩了有些没有

转载 作者:行者123 更新时间:2023-12-01 12:36:17 26 4
gpt4 key购买 nike

我有一个脚本可以从 Oracle BLOB 表中提取大量文档。这对于从 Oracle 到 SQL 的大量重写和数据库转换是必要的,其中文件将存储在 SQL 文件表中。由于文档必须位于文件系统中,我必须将它们取出并作为文件写出。它适用于我的大部分文档。在我的 table 上敲了很多脑袋之后,我终于弄清楚了这是因为前端系统上有一些逻辑可以压缩一些文档——尽管我真的无法弄清楚它这样做的标准。无论如何,在我提取它们之前,我已经搜索和搜索了并且找不到任何类型的 bool 检查来查看它们是否被压缩在 Oracle BLOB 表中。如果我在提取它们时尝试将它们全部解压,我会在未压缩的那些上收到错误消息。所以现在我想我可以在解压的情况下运行它们,然后捕获异常并通过不解压导出来处理其他异常。我只是无法在我的脚本中获得正确的语法。这对我来说是一个新的挑战,我没有太多编写此类脚本的经验,所以请原谅我的无知。这是我尝试解压缩所有这些错误时遇到的错误,所以这就是我要捕获的错误:

ORA-29294: A data error occurred during compression or uncompression.
ORA-06512: at "SYS.UTL_SYS_COMPRESS", line 56
ORA-06512: at "SYS.UTL_SYS_COMPRESS", line 226
ORA-06512: at "SYS.UTL_COMPRESS", line 89
ORA-06512: at line 21

这是脚本:

DECLARE

CURSOR C1 IS Select FILE_ID || '---' || substr(DOCUMENTLOCATION,1,instr (DOCUMENTLOCATION,'.')-1)||'.doc' as FILE_NAME, FILE_BLOB, FILE_ID
From DOCUMENTS d inner join CASEJOURNAL c on d.FILE_ID = c.JOURNALENTRYID where (JOURNAL_ENTRY_TYPE = 117 or JOURNAL_ENTRY_TYPE = 3) AND c.DOCUMENTLOCATION Is Not Null AND d.MIME_TYPE = 'application/msword' AND FILE_ID between 1 and 10000;

v_blob_uncomp BLOB;
v_blob BLOB;
blob_length INTEGER;
out_file UTL_FILE.FILE_TYPE;
v_buffer RAW(32767);
chunk_size BINARY_INTEGER := 32767;
blob_position INTEGER := 1;
filename varchar2(255);

BEGIN
--Select BLOB file into variables
FOR I in C1
LOOP
filename := i.FILE_NAME;
v_blob_uncomp := UTL_COMPRESS.LZ_UNCOMPRESS(i.FILE_BLOB);
v_blob := i.FILE_BLOB;

-- Define the output directory
out_file := UTL_FILE.FOPEN('fileloc',filename,'wb',chunk_size);

--Get length of BLOB file and save to variable.
blob_length := DBMS_LOB.getlength(v_blob);

-- Write the data to the file
WHILE blob_position <= blob_length LOOP
IF blob_position + chunk_size - 1 > blob_length THEN
chunk_size := blob_length - blob_position + 1;
END IF;
DBMS_LOB.read(v_blob_uncomp, chunk_size, blob_position, v_buffer);
UTL_FILE.PUT_RAW(out_file, v_buffer, TRUE);
blob_position := blob_position + chunk_size;
END LOOP;
UTL_FILE.FCLOSE(out_file);

END LOOP;
END;

我知道当我不解压缩任何 blob 时脚本可以工作,但是压缩的 blob 打不开。当我对某些我知道已压缩的文件进行解压缩时,它也可以使用。我只是想让它以某种方式在我的所有文件循环中工作。 TIA!

最佳答案

当您想在 PL/SQL 中捕获特定的 Oracle 错误代码时,您基本上有两种选择:

A) 捕获所有异常;在处理程序中,测试错误消息是否与您要查找的消息匹配;如果是,处理它;如果没有,重新提高它。这看起来像:

BEGIN
v_blob := := UTL_COMPRESS.LZ_UNCOMPRESS(i.FILE_BLOB);
EXCEPTION
WHEN OTHERS THEN
IF sqlerrm LIKE 'ORA-29294%' THEN
v_blob := i.FILE_BLOB;
ELSE
RAISE;
END IF;
END;

B) 声明一个异常变量并将其映射到您关心的特定错误代码,然后只捕获该异常。这看起来像这样:

DECLARE
compression_error EXCEPTION;
pragma exception_init ( compression_error, -29294 );
BEGIN
v_blob := UTL_COMPRESS.LZ_UNCOMPRESS(i.FILE_BLOB);
EXCEPTION
WHEN compression_error THEN
v_blob := i.FILE_BLOB;
END;

无论哪种方式,我都建议将其包装在一个函数中。

我还注意到,您显示的代码在开始处理新 BLOB 时不会将 blob_position 重置为 1。

关于oracle - 使用 UTL_FILE 从 Oracle 表中提取 BLOB 文件,有些压缩了有些没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29477105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com