函数/过程的XML输出不正确
我已经做了一个查询,以从数据库中获取XML,并且XML数据正确地来自该查询。 但是,当我试图将该查询放入一个过程/函数以从一个函数/过程中获取XML数据时,结果包括一些垃圾数据和XML数据。 这使得XML毫无用处,因为XSLT无法将其用于垃圾数据 你能检查一下我哪里做错了吗函数/过程的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
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;