【问题标题】:How can I print large XML string generated by Oracle?如何打印 Oracle 生成的大型 XML 字符串?
【发布时间】:2012-10-05 05:01:35
【问题描述】:

我需要比 varchar2(2000) 更大的东西才能打印我生成的 XML。要么推荐比 dbms_output.put_line(x) 更好的方法,要么推荐不同的数据类型来存储结果然后打印。我是 Oracle 新手,全职工作是 UI 开发。

declare
    v_ctx dbms_xmlgen.ctxHandle;
    x varchar2(2000); -- I need something bigger than varchar2(2000)
begin
    v_ctx := DBMS_XMLGen.newContext('
        select
            baz as "Baz"
        from schema.table_with_10000_rows');
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo');
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar');
    x := dbms_xmlgen.getxml(v_ctx);
    dbms_output.put_line(x);
end;

【问题讨论】:

  • 我以前去过那里。转换为BLOB/CLOB 原则上似乎很好,但实际上我们在堆栈的所有层都遇到了各种问题:OCI 段错误、静默截断、字符集问题。我希望其他人有一个好的解决方案。

标签: xml oracle


【解决方案1】:

如果您有超过 4000 个字符,则需要使用 CLOB,这就是 getxml 返回的数据类型。 This question 似乎正在解决同样的问题,并显示了一种简单的循环和打印块的方法,尽管它有一个缺陷 - 它应该使用 dbms_output.put() 而不是 put_line (编辑:可能使用终端 @ 987654329@ 循环后;恐怕未经测试)。

如果您在 SQL*Plus 中执行此操作,则可以使用 client bind variable 完全避免 dbms_output

var x clob;

declare
    v_ctx dbms_xmlgen.ctxHandle;
begin
    v_ctx := DBMS_XMLGen.newContext('
        select table_name as "Baz"
        from all_tables');
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo');
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar');
    :x := dbms_xmlgen.getxml(v_ctx);
end;
/

print x

x 在 PL/SQL 块之外声明,并与它一起用作绑定变量 - 请注意赋值中的冒号 :x := ...

X
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<Foo>
 <Bar>
  <Baz>DUAL</Baz>
 </Bar>
 <Bar>
  <Baz>SYSTE

默认情况下,您可能只会看到 XML 的开头;你需要set long &lt;some big number&gt; 才能看到这一切,并且(从 11g 开始)你被限制为 2GB。 (我想你还想设置反馈和标题,也许还有长块)。


我会质疑为什么您要像这样将其打印到屏幕上,而不是存储在表格中。如果最终目标是将其放入文件中,utl_file 可能更合适;可能是this

【讨论】:

  • 刚刚看到你的答案。今天或明天将尝试并可能标记为答案。似乎它应该工作。谢谢。
  • @JohnZabroski - 想一想,如果你只是在我链接到的问题中使用dbms_output.put,你会得到没有或不完整的输出;我认为您在循环之后还需要一个dbms_output.new_line。您可能还会遇到缓冲区大小问题。您是从 SQL*Plus 执行此操作吗?如果是这样,可能会有不同的方法......
  • 我正在从 SQL Navigator 执行此操作。我是一名 UI 开发人员。我曾经用 SQL Server 做过 DBA 类型的东西,但不是 Oracle。 5 或 6 年前在大学上过 Oracle 课程。
  • 抱歉,延迟将此标记为答案。我确定的是,我可以从 SQL Navigator 访问用于将信息输出到文件的 SQL*PLUS 原语。这极大地简化了弄清楚如何序列化事物的任务,并且是解决方案的关键。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2023-03-07
  • 2010-11-10
相关资源
最近更新 更多