从Oracle数据库中提取BLOB数据并转换为原始文件

时间:2013-08-20 17:38:18

标签: oracle plsql blob oracle9i

我正在尝试提取BLOB数据并将其转换为原始文件(pdf,rtf,doc等)。以下是我的代码:

DECLARE
  l_file      UTL_FILE.FILE_TYPE;
  l_buffer    RAW(32767);
  l_amount    BINARY_INTEGER := 32767;
  l_pos       NUMBER := 1;
  l_blob      BLOB;
  l_blob_len  NUMBER;
BEGIN

  SELECT file_contents
    INTO   l_blob
    FROM   irb_files
   WHERE  FILE_NAME = 'STD_FlipBook_Religion2013.doc';

  l_blob_len := DBMS_LOB.getlength(l_blob);

  -- Open the destination file.
  l_file := UTL_FILE.fopen('IRB','STD_FlipBook_Religion2013.doc','wb','W');


  DBMS_LOB.read(l_blob, l_amount, l_pos, l_buffer);
  UTL_FILE.put_raw(l_file, l_buffer, TRUE);
  l_pos := l_pos + l_amount;

  -- Close the file.
  UTL_FILE.fclose(l_file);

END;

我对所有这些都比较新,所以如果我的代码有点偏,我很抱歉。我一直得到的错误是:

Error report:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 18
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

非常感谢任何帮助。

数据库信息: Oracle9i企业版9.2.0.5.0版

1 个答案:

答案 0 :(得分:2)

问题在于这一行:

l_file := UTL_FILE.fopen('IRB','STD_FlipBook_Religion2013.doc','wb','W');

文档显示下面函数的签名。你拥有的最后一个参数'W'对应于'max_linesize',它应该是一个数字。因此,您无法将“W”转换为数字。我认为你可以简单地使用你的情况下的默认值,所以只需删除'W'参数。

(来自Oracle 9.2文档)

FOPEN功能 此功能打开一个文件。您可以指定最大行大小,并且最多同时打开50个文件。另请参见“FOPEN_NCHAR函数”。

语法 UTL_FILE.FOPEN(    位置IN VARCHAR2,    filename IN VARCHAR2,    open_mode IN VARCHAR2,    max_linesize IN BINARY_INTEGER)   RETURN file_type;

参数 表95-3 FOPEN功能参数 参数说明 地点  文件的目录位置。

文件名  文件名,包括扩展名(文件类型),没有目录路径。在Unix中,文件名不能以/.

结尾

open_mode  指定文件的打开方式。模式包括:

r - 阅读文字

w - 写文字

a - 追加文字

如果尝试使用open_mode的值打开不存在的文件,则以写入模式创建文件。

max_linesize  此文件的每行最大字符数,包括换行符。 (最小值1,最大值32767)。默认值约为1000字节。