从函数/过程中得不到正确的XML输出

时间:2017-07-10 05:04:57

标签: xml oracle function stored-procedures

我已经进行了查询以从数据库中获取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>

但是当我们将此查询放入过程/函数时,它会显示错误的数据

create  or replace function test_cursor     return sys_refcursor
            is
                    c_result sys_refcursor;
                    po varchar2(20);
            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"
             )
           )
         )
       )
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;

此过程的结果是来自查询的XML数据,但在开始时具有一些垃圾值。 请帮忙

1 个答案:

答案 0 :(得分:0)

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

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

您可能需要做的是使用XMLTYPEgetStringVal()成员函数显式返回getClobVal()对象的String格式:

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;