Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
函数/过程的XML输出不正确_Xml_Oracle_Function_Stored Procedures - Fatal编程技术网

函数/过程的XML输出不正确

函数/过程的XML输出不正确,xml,oracle,function,stored-procedures,Xml,Oracle,Function,Stored Procedures,我已经做了一个查询,以从数据库中获取XML,并且XML数据正确地来自该查询。 但是,当我试图将该查询放入一个过程/函数以从一个函数/过程中获取XML数据时,结果包括一些垃圾数据和XML数据。 这使得XML毫无用处,因为XSLT无法将其用于垃圾数据 你能检查一下我哪里做错了吗 SELECT XMLELEMENT( "department", XMLFOREST( e.dept_id AS "dept_id", d.de

我已经做了一个查询,以从数据库中获取XML,并且XML数据正确地来自该查询。 但是,当我试图将该查询放入一个过程/函数以从一个函数/过程中获取XML数据时,结果包括一些垃圾数据和XML数据。 这使得XML毫无用处,因为XSLT无法将其用于垃圾数据

你能检查一下我哪里做错了吗

SELECT XMLELEMENT(
         "department",
         XMLFOREST(
           e.dept_id AS "dept_id",
           d.dept_name AS "dept_name"
         ),
         XMLAGG(
           XMLELEMENT(
             "employee",
             XMLFOREST(
               emp_id AS "emp_id",
               emp_name AS "emp_name"
             )
           )
         )
       )
FROM   employees e
       INNER JOIN departments d
       on ( e.dept_id = d.dept_id )
WHERE  e.dept_id = 1
GROUP BY e.dept_id, d.dept_name;
此查询提供所需的XML数据

<department>
<dept_id>1</dept_id>
<dept_name>History</dept_name>
</department>
<employee>
<emp_id>1</emp_id>
<emp_name>Helen</emp_name>
</employee>
<employee>
<emp_id>2</emp_id>
<emp_name>Martha</emp_name>
</employee>
<employee>
<emp_id>3</emp_id>
<emp_name>John</emp_name>
</employee>
此过程的结果是来自查询的XML数据,但在开始时有一些垃圾值。
请帮助

XMLELEMENT
将创建一个
XMLTYPE
对象,该对象存储XML的结构,但不是字符串

您可能会发现,当您在SQL范围内运行查询时,您使用的任何IDE都会隐式地将
XMLTYPE
对象转换为字符串;但是,当您返回光标时,它并没有进行转换

您可能需要使用
getStringVal()
getClobVal()
成员函数显式返回
XMLTYPE
对象的字符串格式:

create or replace function test_cursor
return sys_refcursor
is
  c_result sys_refcursor;
  po       staging_orderheader.headerid%type;
begin
  select headerid
  into   po
  from   staging_orderheader
  where  rownum=1;

  open c_result for
  SELECT XMLELEMENT(
           "department",
           XMLFOREST(
             e.dept_id AS "dept_id",
             d.dept_name AS "dept_name"
           ),
           XMLAGG(
             XMLELEMENT(
               "employee",
               XMLFOREST(
                 emp_id AS "emp_id",
                 emp_name AS "emp_name"
               )
             )
           )
         ).getClobVal()                   -- Add it here
  FROM   employees e
         INNER JOIN departments d
         on ( e.dept_id = d.dept_id )
  WHERE  e.dept_id = 1
  GROUP BY e.dept_id, d.dept_name;

  return c_result;
end;

函数返回一个ref_游标,您不能将游标的结果解析回varchar2或clob并从函数中返回吗?为什么您希望从返回ref_游标的函数中获取有效的XML?请使用该函数生成的(格式错误)输出示例和用于调用过程的代码编辑您的问题。很抱歉,这也会给出与前面相同的结果。
create or replace function test_cursor
return sys_refcursor
is
  c_result sys_refcursor;
  po       staging_orderheader.headerid%type;
begin
  select headerid
  into   po
  from   staging_orderheader
  where  rownum=1;

  open c_result for
  SELECT XMLELEMENT(
           "department",
           XMLFOREST(
             e.dept_id AS "dept_id",
             d.dept_name AS "dept_name"
           ),
           XMLAGG(
             XMLELEMENT(
               "employee",
               XMLFOREST(
                 emp_id AS "emp_id",
                 emp_name AS "emp_name"
               )
             )
           )
         ).getClobVal()                   -- Add it here
  FROM   employees e
         INNER JOIN departments d
         on ( e.dept_id = d.dept_id )
  WHERE  e.dept_id = 1
  GROUP BY e.dept_id, d.dept_name;

  return c_result;
end;