我需要比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;
答案 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这样的东西。