我给出了下表。该表包含xml标签和值以及可选的对父标签的引用。如何选择xmltree递归?
CREATE GLOBAL TEMPORARY TABLE XML_TAG_VAL
(
OBJ_ID NUMBER, -- unique for one whole xml document
ID NUMBER, -- unique for every tag
TAG VARCHAR2(1000 BYTE), -- tags name
VAL CLOB, -- tags value
LVL NUMBER, -- depth of the tag
ATTR_ID NUMBER, -- foreign key to tag_attr table (do this later)
PARENT_ID NUMBER -- id of parent tag (xml_tag_val.id)
)
ON COMMIT DELETE ROWS
NOCACHE;
让一些很简单的测试数据插入到这个表...
insert into xml_tag_val values(1,1,'a',null,1,null,null);
insert into xml_tag_val values(1,2,'b','b-value',2,null,1);
insert into xml_tag_val values(1,3,'b','b-value 2',2,null,1);
我有什么现在要做的是产生一个给定的客户端界面中的XML。所以结果应该是:
<a>
<b>b-value</b>
<b>b-value 2</b>
</a>
因此,对于这个特定的情况手工制作使用xmlelement的sql将不成问题。但是如何在不知道路径有多深的情况下选择xml树?我所知道的只是每个孩子都指向其父母。
编辑1:
我发现有使用递归查询来构建XML的方式,我有以下查询:
declare
l_qry_ctx dbms_xmlgen.ctxhandle;
l_result clob;
l_obj_id number := 1;
begin
l_qry_ctx := dbms_xmlgen.newcontextFromHierarchy('
select level,xmlelement(tag, val)
from oranetted_plugin.xml_tag_val
where obj_id = ' || l_obj_id || '
start with parent_id is null
connect by parent_id = prior id'
);
l_result:=dbms_xmlgen.getxml(l_qry_ctx);
dbms_output.put_line(l_result);
end;
/
的问题是,标签名称不能来自sqls的结果。标签显示为“标签”,而不是“a”或“b”。
<TAG>
<TAG>b-value</TAG>
<TAG>b-value 2</TAG>
</TAG>
任何想法解决这个问题?
你有可能的标签名称列表? – 2011-03-17 13:49:37
@Marcin Wroblewski:不是最后,但我可以动态生成一个'从xml_tag_val中选择不同的标记,其中obj_id = 1' – chris 2011-03-17 14:51:41