Oracle表结果集以xml格式设置

时间:2017-09-15 06:46:24

标签: xml oracle select stored-procedures

环境:Oracle Express 11g

我开发了一个Oracle存储过程,以xml格式从表中返回多个记录。不幸的是,它适用于单个记录。对于多个记录,它返回错误

  

ORA-01427:单行子查询返回多行

请建议如何修复错误。

存储过程

create or replace function view_to_xml return clob as
  xml xmltype;
 data clob;
begin
select XMLELEMENT("PERSONS",
   (
     select XMLELEMENT("PERSON",
                 XMLELEMENT("SNO",SNO),
                 XMLELEMENT("NAME",name),
                 XMLELEMENT("AGE",AGE) 
   ) as "result" from person 
   )
   ) into xml from dual;

 SELECT XMLSerialize(DOCUMENT xml AS CLOB) into data FROM DUAL;

return data;
end ;

2 个答案:

答案 0 :(得分:0)

而不是将每个元素从查询包装到人

select XMLELEMENT("PERSONS", XMLAGG(person_))
into xml 
from
(
  select XMLELEMENT("PERSON",
                 XMLELEMENT("SNO",SNO),
                 XMLELEMENT("NAME",name),
                 XMLELEMENT("AGE",AGE)) as person_
   from person 
);

你应该使用enter image description here将它们聚合到一个元素:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test checkbox</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<script src="js/1.9.2/jquery-ui-min.js"></script>
</head>

<body>
<input type="checkbox" class="example" />
<input type="checkbox" class="example" />
<input type="checkbox" class="example" />
<input type="checkbox" class="example" />
<script language="JavaScript" type="text/JavaScript">
$('input.example').on('change', function() {
    $('input.example').not(this).prop('checked', false);  
});
</script>
</body>
</html>

答案 1 :(得分:0)

Stawros,谢谢你的建议。我尝试过但无法使用XMLAGG解决问题。我能够以不同的方式解决问题。这是解决方案

create or replace function view_to_xml return clob as
  xml xmltype;
  ctx dbms_xmlgen.ctxhandle;
  resultset sys_refcursor;

begin

 open resultset for
 select * from PERSONS;
 ctx := dbms_xmlgen.newcontext(resultset);
 dbms_xmlgen.setrowsettag(ctx, 'PERSONS');
 dbms_xmlgen.setrowtag(ctx, 'PERSON');

 xml:= dbms_xmlgen.getxmltype(ctx);
 dbms_xmlgen.closecontext(ctx);
 close resultset;

 return xml.getStringVal();
end