如何打印Oracle生成的大型XML字符串?

时间:2012-10-05 05:01:36

标签: xml oracle

我需要比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;

1 个答案:

答案 0 :(得分:2)

如果您的字符数超过4000,则需要使用CLOB,这是getxml返回的数据类型。 This question似乎正在接近同一个问题,并显示了一种简单的循环方式和打印方式,虽然它有一个缺陷 - 它应该使用dbms_output.put()而不是put_line(编辑:在循环之后可能有一个终端dbms_output.new_line;我很害怕,我很害怕。)

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

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 <some big number>才能看到这一切,并且(截至11g)你只需要2GB。 (我想你也想要设置反馈和标题,也许是长篇大论)。


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