2009-02-09 53 views
0

我有一个查询,我正在使用DBMS_XMLGEN包在Oracle中生成XML。是否有一种简单的方法来抑制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结果略有不同

+0

我同意,使用xml *标记几乎总是最好的方法。不过,我确实想明确回答你的问题,以防万一你想坚持使用DBMS_XMLGEN包。 – Nick 2009-02-11 22:41:04

回答

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调用来抑制行标记。我希望这有帮助。

0

查看评论我在问题结尾添加了如何最终决定去。

相关问题