1

我正在尝试提取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 Enterprise Edition Release 9.2.0.5.0

4

1 回答 1

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 ( location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER) RETURN file_type;

参数 表 95-3 FOPEN 函数参数 参数 说明 location 文件的目录位置。

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

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

r——阅读文本

w——写文本

a--附加文本

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

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

于 2013-08-20T18:06:16.453 回答