有没有一种简单的方法来抑制 Oracle 中集合的 XML 行标记?
Posted
技术标签:
【中文标题】有没有一种简单的方法来抑制 Oracle 中集合的 XML 行标记?【英文标题】:Is there a easy way to suppress the XML row tags of a collection in Oracle? 【发布时间】:2009-02-09 19:06:06 【问题描述】:我有一个查询,我正在使用 DBMS_XMLGEN 包从 Oracle 中生成 XML。
例如,我使用的光标如下:
SELECT
A.NAME primaryName,
(CURSOR(SELECT B.NAME AS NAME FROM B WHERE B.ID=A.ID)) SYNONYMS
FROM
A
我有一个查询上下文 qtx,并针对该上下文将查询设置为上述内容。调用:
result := DBMS_XMLGEN.getXML(qryCtx);
从生成的 XML 的角度来看,我几乎可以到达我想去的地方:
<PRIMARYNAME>Main Name</PRIMARYNAME>
<SYNONYMS>
<SYNONYMS_ROW>
<NAME>Synonym1</NAME>
</SYNONYMS_ROW>
<SYNONYMS_ROW>
<NAME>Synonym2</NAME>
</SYNONYMS_ROW>
</SYNONYMS>
我真正想做的是取消SYNONYMS_ROW
标签。我也尝试过 (CAST(MULTISET(<query>
) 并得到类似的结果。
我知道我可以进行 CLOB 搜索和替换,但似乎应该有一种更简单或设计更好的方法(即,我是否应该定义所需的 xsd 并以某种方式使用它?)。我也可以做一个完整的存储过程,并使用游标在运行中根据需要构建标签,但最好有一个单独的 SQL 语句来代替。感谢您的任何建议
谢谢尼克 - 事实证明,解决我描述的问题的最简单方法是使用 XMLAGG 函数并稍微不同地生成我的 XML 结果。
select
XMLELEMENT("primaryName",A.Name),
xmlelement("synonyms",
(SELECT XMLAGG(XMLELEMENT("name",b.name) ) from b
where b.id=a.id and b.type='S') )
from
A
【问题讨论】:
我同意,使用 xml* 标签几乎总是最好的方法。但是,我确实想明确地回答你的问题,以防你想坚持使用 DBMS_XMLGEN 包。 是的,xml* 标签运行良好。我需要相当深入地嵌套一堆 XMLAgg 调用以满足我的查询需求。就像对任何最终看到这个的人的仅供参考一样,将它们封装在函数中似乎比在选择中使用子查询构建一些巨大的 SQL 更容易。 【参考方案1】:您需要下拉到 PL/SQL,您可以在其中更好地控制 dbms_xmlgen 包。例如,您可以通过以下方式更改它设置的行标签的行为。
declare
qryctx DBMS_XMLGEN.ctxhandle;
results xmltype;
begin
qryctx := dbms_xmlgen.newcontext('select foo from bar where id = my_id');
dbms_xmlgen.SETBINDVALUE(qryctx,'my_id',id);
dbms_xmlgen.setRowTag(qryCtx,NULL);
dbms_xmlgen.setRowSetTag(qryCtx,NULL);
results := dbms_xmlgen.getxmltype(qryctx);
dbms_xmlgen.closecontext(qryctx);
return results;
end;
这个包不仅可以让你改变行标签,还可以改变所有行的标签。在上面的示例中,我通过将 NULL 作为第二个参数传递给 dbms_xmlgen.setRowTag 调用来抑制行标记。我希望这会有所帮助。
【讨论】:
【参考方案2】:请参阅我在问题末尾添加的 cmets,了解我最终决定如何去。
【讨论】:
以上是关于有没有一种简单的方法来抑制 Oracle 中集合的 XML 行标记?的主要内容,如果未能解决你的问题,请参考以下文章