【问题标题】:ORACLE BLOB to FILEORACLE BLOB 到文件
【发布时间】:2013-12-04 18:16:52
【问题描述】:

我正在编写一些 pl/sql 来生成 pdf 报告,这些报告作为 blob 存储在 oracle 表中。我需要遍历该表,该表具有文件名和 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;

【问题讨论】:

  • alter session set current_schema = sims_prod; 将消除在匿名块中包含模式的声明必要性。

标签: sql oracle plsql blob blobs


【解决方案1】:

尝试将第 13 行替换为:

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

【讨论】:

    【解决方案2】:

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

    FOR X IN (SELECT a, b from table) LOOP

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

    因此,在您的代码中,您必须将 SIMS_PROD.publish_rpt_new.RPT_CONTENTS 更改为 X.SIMS_PROD.publish_rpt_new.RPT_CONTENTS。

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

    【讨论】:

      【解决方案3】:

      最近做过类似的事情, 联系我了解更多详细信息

      但要点是这样的

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

      【讨论】:

        猜你喜欢
        • 2015-12-07
        • 2015-02-06
        • 2019-01-22
        • 2018-10-27
        • 1970-01-01
        • 2016-02-22
        • 2012-09-18
        • 2013-11-08
        • 2011-07-02
        相关资源
        最近更新 更多