【问题标题】:Print CLOB content out as is in Oracle SQL script在 Oracle SQL 脚本中按原样打印 CLOB 内容
【发布时间】:2010-12-07 06:47:26
【问题描述】:

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

我现在遇到的问题是 XML 代码的内容(存储在 CLOB 中)必须为 DBMS_OUTPUT.PUT_LINE 拆分成更小的块,并且每个块都以换行符结束,从而破坏了XML 代码。我想知道是否有办法在屏幕上打印 BLOB 的内容?

这是 SQL 脚本的示例:

将 SERVEROUTPUT 设置为 WRAPPED 格式; 关闭反馈 宣布 v_ctx DBMS_XMLGen.ctxHandle; v_xml CLOB; v_xslt CLOB; l_offset 数:= 1; 开始 v_ctx := DBMS_XMLGen.newContext('SELECT * FROM TABLE'); -- DBMS_XMLGen.setXSLT(v_ctx, v_xslt); --这里不相关 v_xml := BMS_XMLGen(v_ctx); DBMS_XMLGen.closeContext(v_ctx); 当 l_offset > dbms_lob.getlength(v_xml) 时循环退出; DBMS_OUTPUT.PUT_LINE (dbms_lob.substr(v_xml, 255, l_offset)); l_offset := l_offset + 255; 结束循环; 例外 其他时候 DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM,1,255)); 增加; 结尾; /

除了每 255 个符号后的换行符之外,我得到的输出是正确的。而且我不能稍后删除行尾,我需要 XML 可读

有什么想法吗?

干杯, 狮子座

【问题讨论】:

  • 最终不得不编写一个 java 程序来做我需要的事情。感谢大家的帮助!

标签: sql oracle newline


【解决方案1】:

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

  1. 创建具有 CLOB 类型的单列和单行的数据库表。
  2. 在服务器上,将生成的 XML 插入到该表中。
  3. 在客户端运行 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 删除该行,表格也不会缩小。

【讨论】:

  • +1 在 OP 提供的代码中,将 dbms_output 的用法替换为在建议的输出表中插入语句。您可能希望在该表中添加第二列“line_number”并从序列中填充它,以便能够以正确的顺序选择行。
  • erm,当然这只有在你实际生产多行时才有意义:)
  • 你不能从 CLOB 列中选择...反正我已经放弃了这种方法
【解决方案2】:

检查 APC 的 CLOB 解决方法以获取 dbms_output on http://forums.oracle.com/forums/thread.jspa?threadID=306557

【讨论】:

    【解决方案3】:

    您可以添加一个分隔符并打印出 254 个字符,然后在 notepad++(在扩展模式 ~\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;
    

    【讨论】:

      【解决方案4】:

      为什么不使用DBMS_OUTPUT.PUT 而不是DBMS_OUTPUT.PUT_LINE?试一试。诀窍是在打印内容后添加换行符。你可以通过拨打DBMS_OUTPUT.NEW_LINE来完成。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        相关资源
        最近更新 更多