ORACLE BLOB到文件

时间:2013-11-20 16:22:54

标签: sql oracle plsql blob blobs

我正在编写一些pl / sql来生成pdf报告,这些报告在oracle表中存储为blob。我需要遍历这个包含filename和blob列的表,并将blob作为文件写入操作系统,并在表中显示相应的文件名。我几乎完成了这段代码,但遇到了麻烦:

ORA-06550: line 13, column 59:
PL/SQL: ORA-00904: "SIMS_PROD"."PUBLISH_RPT_NEW"."RPT_FILE_NAME": invalid identifier
ORA-06550: line 13, column 12:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
Cause:    Usually a PL/SQL compilation error.
Action:

我确实阅读了网站上的帖子:How can I extract files from an Oracle BLOB field? - 但是 - 这仅适用于一个文件 - 我的表包含数百行,每行包含一个blob和相关的文件名 - 它通过此表循环我悲伤。

我需要显式地为模式名称,表和列添加前缀,因为我以DBA用户身份登录,而不是作为模式本身的所有者。这是我的代码 - 我在这里错过了什么或做错了什么。提前感谢社区的任何帮助 - 非常感谢。

DECLARE 
t_blob BLOB; 
t_len NUMBER; 
t_file_name VARCHAR2(100); 
t_output utl_file.file_type; 
t_totalsize NUMBER; 
t_position NUMBER := 1; 
t_chucklen NUMBER := 4096; 
t_chuck RAW(4096); 
t_remain NUMBER; 

BEGIN
  FOR X IN (SELECT SIMS_PROD.publish_rpt_new.RPT_FILE_NAME,     SIMS_PROD.publish_rpt_new.RPT_CONTENTS FROM SIMS_PROD.PUBLISH_RPT)

  LOOP
    -- Get length of blob 
    SELECT dbms_lob.Getlength (SIMS_PROD.publish_rpt_new.RPT_CONTENTS),     SIMS_PROD.publish_rpt_new.RPT_FILE_NAME INTO t_totalsize, t_file_name FROM     SIMS_PROD.publish_rpt_new;
    t_remain := t_totalsize; 

    -- The directory TEMPDIR should exist before executing 
    t_output := utl_file.Fopen ('PDF_REP', t_file_name, 'wb', 32760); 

    -- Get BLOB 
    SELECT SIMS_PROD.publish_rpt_new.RPT_CONTENTS INTO t_blob FROM       SIMS_PROD.publish_rpt_new;

    -- Retrieving BLOB  
    WHILE t_position < t_totalsize 
      LOOP 
        dbms_lob.READ (t_blob, t_chucklen, t_position, t_chuck); 
        utl_file.Put_raw (t_output, t_chuck); 
        utl_file.Fflush (t_output); 
        t_position := t_position + t_chucklen; 
        t_remain := t_remain - t_chucklen; 

        IF t_remain < 4096 THEN t_chucklen := t_remain; 
        END IF; 
      END LOOP; 

    END LOOP;
END;

3 个答案:

答案 0 :(得分:0)

尝试用以下代码替换第13行:

FOR X IN (SELECT RPT_FILE_NAME, RPT_CONTENTS FROM SIMS_PROD.PUBLISH_RPT)

答案 1 :(得分:0)

这将是一个太迟的答案,但至少你会知道你在哪里做错了。问题是如果你使用:

X.a

您必须在此循环的下一个语句中使用SIMS_PROD.publish_rpt_new.RPT_CONTENTS才能正确引用所选行的值。

因此,在您的代码中,您必须将X.SIMS_PROD.publish_rpt_new.RPT_CONTENTS更改为app.use('/', require('./routes/user')); app.use('/api/user/load_user_list', require('./routes/user')); app.use('/api/user/get_user_detail', require('./routes/user'));

我还没有读过你的其余代码,所以也许可能会有更多的错误。

答案 2 :(得分:0)

最近做了类似的事情, ping我以获取其他详细信息

但是要旨是这个

  1. 将Excel或pdf创建/构建为blob并存储到blob列中
  2. 使用base 64转换器功能将相同的数据存储到clob中(作为文本)
  3. 在Windows / linux中使用sqlplus从Clob列中后台处理文本
  4. 使用os工具将Clob转换为具有所需文件名的blob(ssl / certificate可能具有将b64 t0二进制转换回实用程序的功能)