2

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

1 回答 1

2

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

如果您在 SQL*Plus 中执行此操作,则可以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 <some big number>查看所有内容,并且(从 11g 开始)您被限制为 2GB。(我想你还想设置反馈和标题,也许还有长块)。


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

于 2012-10-05T07:23:37.870 回答