有没有一种简单的方法来抑制 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(&lt;query&gt;) 并得到类似的结果。

我知道我可以进行 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 行标记?的主要内容,如果未能解决你的问题,请参考以下文章

Java 9中集合的重载便利工厂方法有啥意义

Java中集合的概述

Java中集合的一些初始化写法

Python3中集合的混合使用

Java中集合的理解

javascript 如何删除MongoDb中集合的所有文档?