我已经进行了查询以从数据库中获取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数据,但在开始时具有一些垃圾值。 请帮忙
答案 0 :(得分:0)
XMLELEMENT
将创建一个XMLTYPE
对象,用于存储XML的结构,但不是字符串。
您可能会发现,在SQL范围内运行查询时,您使用的任何IDE都会隐式将XMLTYPE
对象转换为字符串;但是,当你返回光标时,它没有进行那种转换。
您可能需要做的是使用XMLTYPE
或getStringVal()
成员函数显式返回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;