如何解决Oracle中复杂的XMLELEMENT
问题 XML如何解决Oracle中复杂的XMLELEMENT,xml,plsql,oracle11g,Xml,Plsql,Oracle11g,问题 XML 有人能建议我如何使用xmlelement解决多个xml元素吗 输入是XML,解析后的XML输出应该是XML 如果我有需求动态XML,我可以使用下面的代码 select xmltype(cursor(select * from view )) from dual; 光标在循环中 任何建议都欢迎 如果我理解您的意图,您将从XML文档的字符串版本开始,如: <logs><log><ID>123456</ID></log>&
- 有人能建议我如何使用xmlelement解决多个xml元素吗
- 输入是XML,解析后的XML输出应该是XML
- 如果我有需求动态XML,我可以使用下面的代码
select xmltype(cursor(select * from view )) from dual;
- 光标在循环中
- 任何建议都欢迎
<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>
作为纯SQL的演示,从字符串开始,用CTE表示视图:
-- CTE to represent your view
with your_view (id, name) as (
select 123456, 'TEST' from dual
union all
select 1234567, 'TEST1' from dual
)
-- actual query
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name)))).getclobval()
from xmltable(
'/logs/log'
passing xmltype('<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>')
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
XMLELEMENT("LOGS",XMLAGG(XMLELEMENT("LOG",XMLFOREST(V.ID,V.NAME)))).GETCLOBVAL()
-----------------------------------------------------------------------------------------------------
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
但避免光标循环并只连接一次更简单:
declare
in_xml clob := '<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>';
v_output clob;
begin
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name)))).getclobval()
into v_output
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
dbms_output.put_line (v_output);
end;
/
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
PL/SQL procedure successfully completed.
声明
in_xml clob:=“1234561234567”;
v_输出clob;
开始
选择xmlement(“logs”,xmlagg(xmlement(“log”,xmlforest(v.id,v.name)))。getclobval()
输入v_输出
从xmltable(
“/logs/log”
传递xmltype(在xml中)
列id编号路径“id”
)x
在v.id=x.id上加入您的_视图v;
dbms_output.put_行(v_output);
结束;
/
123456TEST1234567TEST1
PL/SQL过程已成功完成。
如果我理解您的意图,那么您将从XML文档的字符串版本开始,如:
<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>
作为纯SQL的演示,从字符串开始,用CTE表示视图:
-- CTE to represent your view
with your_view (id, name) as (
select 123456, 'TEST' from dual
union all
select 1234567, 'TEST1' from dual
)
-- actual query
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name)))).getclobval()
from xmltable(
'/logs/log'
passing xmltype('<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>')
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
XMLELEMENT("LOGS",XMLAGG(XMLELEMENT("LOG",XMLFOREST(V.ID,V.NAME)))).GETCLOBVAL()
-----------------------------------------------------------------------------------------------------
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
但避免光标循环并只连接一次更简单:
declare
in_xml clob := '<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>';
v_output clob;
begin
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name)))).getclobval()
into v_output
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
dbms_output.put_line (v_output);
end;
/
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
PL/SQL procedure successfully completed.
声明
in_xml clob:=“1234561234567”;
v_输出clob;
开始
选择xmlement(“logs”,xmlagg(xmlement(“log”,xmlforest(v.id,v.name)))。getclobval()
输入v_输出
从xmltable(
“/logs/log”
传递xmltype(在xml中)
列id编号路径“id”
)x
在v.id=x.id上加入您的_视图v;
dbms_output.put_行(v_output);
结束;
/
123456TEST1234567TEST1
PL/SQL过程已成功完成。
第一个“XML”无效,不能被视为XMLType,因此您向我们展示的内容有点不清楚-如果这是您当前的输出,那么输入是什么(_XML
)?或者ID和name值来自哪里?什么是视图
?什么是cursorname
?不必担心xml验证,请提供解决方案如果我不理解您的问题,我无法提供解决方案,初始数据和您尝试执行的操作。在xml 123456 1234567中,我试图通过访问id并使用游标按id获取数据来获取详细信息第一个“xml”无效,不能被视为XMLType,因此,现在还不清楚您向我们展示了什么—如果这是您当前的输出,那么输入是什么((在xml中)
)?或者ID和name值来自哪里?什么是视图
?什么是cursorname
?不必担心xml验证,请提供解决方案如果我不理解您的问题,我无法提供解决方案,在xml 123456 1234567中,我试图通过访问id并使用光标按id获取数据来获取详细信息。我的问题与输入相关,我以xml获取id,然后我需要获取id(123312344)等位置的记录我已经用xml显示了示例xml[id,name],但没有更多的了。@afeef-好吧,只有当您想让代码变得更复杂,并且可能比需要的慢时;您不需要对视图使用循环或单独的查询…@afeef-如果需要包含更多的元素,并且它们都来自同一个视图,那么只需将这些列名添加到xmlforest()中即可
call?非常感谢您的帮助,我将尝试解决方案并让您知道。我的问题与输入有关,我在xml中获取id,然后我需要获取记录,例如id(123312344),我在xml中显示了示例xml[id,name],但没有更多。@afeef-嗯,只有当你想让你的代码更复杂,可能比它需要的慢;您不需要对视图使用循环或单独的查询…@afeef-如果需要包含更多的元素,并且它们都来自同一个视图,那么只需将这些列名添加到xmlforest()
调用中即可。非常感谢您的帮助,我将尝试解决方案并让您知道。
-- CTE to represent your view
with your_view (id, name) as (
select 123456, 'TEST' from dual
union all
select 1234567, 'TEST1' from dual
)
-- actual query
select xmlserialize(document
xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name))))
indent) as out_xml
from xmltable(
'/logs/log'
passing xmltype('<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>')
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
OUT_XML
--------------------------------------------------------------------------------
<logs>
<log>
<ID>123456</ID>
<NAME>TEST</NAME>
</log>
<log>
<ID>1234567</ID>
<NAME>TEST1</NAME>
</log>
</logs>
declare
in_xml clob := '<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>';
out_xml clob;
v_output clob;
begin
v_output := '<logs>';
for r in (
select id
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'ID'
)
)
loop
select xmlelement("log", xmlforest (id, name)).getclobval()
into out_xml
from your_view where id = r.id;
v_output := v_output || out_xml;
end loop;
v_output := v_output || '</logs>';
dbms_output.put_line (v_output);
end;
/
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
PL/SQL procedure successfully completed.
declare
in_xml clob := '<logs><log><ID>123456</ID></log><log><ID>1234567</ID></log></logs>';
v_output clob;
begin
select xmlelement("logs", xmlagg(xmlelement("log", xmlforest(v.id, v.name)))).getclobval()
into v_output
from xmltable(
'/logs/log'
passing xmltype(in_xml)
columns id number path 'ID'
) x
join your_view v on v.id = x.id;
dbms_output.put_line (v_output);
end;
/
<logs><log><ID>123456</ID><NAME>TEST</NAME></log><log><ID>1234567</ID><NAME>TEST1</NAME></log></logs>
PL/SQL procedure successfully completed.