Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决Oracle中复杂的XMLELEMENT_Xml_Plsql_Oracle11g - Fatal编程技术网

如何解决Oracle中复杂的XMLELEMENT

如何解决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>&

问题

XML

  • 有人能建议我如何使用xmlelement解决多个xml元素吗

  • 输入是XML,解析后的XML输出应该是XML

  • 如果我有需求动态XML,我可以使用下面的代码

    select xmltype(cursor(select * from view )) from dual;
    
  • 光标在循环中

  • 任何建议都欢迎


如果我理解您的意图,您将从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文档的字符串版本开始,如:

<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.