首页 文章

按照Oracle SQL脚本中的方式打印CLOB内容

提问于
浏览
1

从这里开始是我正在努力完成的任务的更大图景 . 我需要根据特定SQL请求的结果创建一个xml文件,并将其存储在客户端计算机上的文件中 . 为此,我有一个使用xslt执行DBMS_XMLGen的SQL脚本,我将使用sqlplus从命令行运行并将输出传输到文件中 .

我现在遇到的问题是XML代码(存储在CLOB中)的内容必须分成较小的块用于DBMS_OUTPUT.PUT_LINE,并且每个块最终都有一个新的行字符,从而破坏了XML代码的结构 . 我想知道是否有办法在屏幕上打印BLOB的内容?

这是SQL脚本的示例:

SET SERVEROUTPUT ON FORMAT WRAPPED;
set feedback off
DECLARE
 v_ctx   DBMS_XMLGen.ctxHandle;
 v_xml   CLOB;
 v_xslt  CLOB;
 l_offset number := 1;
BEGIN
  v_ctx := DBMS_XMLGen.newContext('SELECT * FROM TABLE');

--  DBMS_XMLGen.setXSLT(v_ctx, v_xslt); --not relevant here

  v_xml := BMS_XMLGen(v_ctx);
  DBMS_XMLGen.closeContext(v_ctx);

  loop exit when l_offset > dbms_lob.getlength(v_xml);
   DBMS_OUTPUT.PUT_LINE (dbms_lob.substr( v_xml, 255, l_offset));
   l_offset := l_offset + 255;
  end loop;


EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM,1,255));
 raise;
END;
/

除了每255个符号后的新行字符外,我得到的输出是正确的 . 我不能在以后删除行尾,我需要XML可读

有任何想法吗?

干杯,狮子座

4 回答

  • 0

    为什么不使用 DBMS_OUTPUT.PUT 而不是 DBMS_OUTPUT.PUT_LINE ?试试看 . 诀窍是在打印内容后添加换行符 . 你可以通过调用 DBMS_OUTPUT.NEW_LINE 来做到这一点 .

  • 2

    http://forums.oracle.com/forums/thread.jspa?threadID=306557上检查APC的CLOB解决方法是否为dbms_output

  • 1

    一种可能的方法是执行以下操作:

    • 使用CLOB类型的单列和行创建数据库表 .

    • 在服务器上,将生成的XML插入该表 .

    • 在客户端上运行SQL * PLus脚本,如下所示:

    SET WRAP OFF  
    SET HEADING OFF  
    SET ECHO OFF  
    SPOOL file_name.xml
    
    SELECT your\_clob\_column FROM your\_table;
    
    SPOOL OFF
    

    这会将您的XML转储到file_name.xml之后,您需要通过发出以下命令来截断表:

    TRUNCATE TABLE your\_table DROP STORAGE;
    

    否则即使您删除CLOB行,表也不会收缩 .

  • 0

    您可以添加分隔符并打印出254个字符,然后在记事本中(在扩展模式 ~\r\n 中)替换此分隔符:

    loop exit when l_offset > dbms_lob.getlength(v_xml);
       DBMS_OUTPUT.PUT_LINE (dbms_lob.substr( v_xml, 254, l_offset) || '~');
       l_offset := l_offset + 255;
      end loop;
    

相关问题