通过Oracle XML函数生成嵌套XML
我试图从Oracle中的HR模式中获取数据,生成一个嵌套的XML。XML应该如下所示。在本例中,数据驻留在Oracle PLSQL对象中,而不是employees和departments表中通过Oracle XML函数生成嵌套XML,xml,oracle,plsql,Xml,Oracle,Plsql,我试图从Oracle中的HR模式中获取数据,生成一个嵌套的XML。XML应该如下所示。在本例中,数据驻留在Oracle PLSQL对象中,而不是employees和departments表中 <Departments> <department id = "department_id" name = "department_name" > <employees> <employee id = "employ
<Departments>
<department id = "department_id" name = "department_name" >
<employees>
<employee id = "employee_id">
<employee_name> </employee_name>
<salary> </salary>
</employee>
<employee id = "employee_id">
<employee_name> </employee_name>
<salary> </salary>
</employee>
</employees>
</department>
</Departments>
下面是我到目前为止所做的尝试,下面的代码执行以下操作-
1.填充PLSQL对象
2.使用这些对象中的数据生成XML Clob。->在这里,我面临着一个问题。请只考虑未经注释的代码
经过多次下面的代码测试,最终,给出者得到了预期的输出
DECLARE
l_message DEPS_T;
l_employee_t emp_ot;
l_xml_clob CLOB;
BEGIN
SELECT deps_o(
d.department_id,
d.department_name,
emp_ot(emp_o(
e.employee_id,
e.first_name || ' ' || e.last_name,
e.salary
)
)
)
BULK COLLECT INTO l_message
FROM departments d , employees e
where e.department_id = d.department_id ;
SELECT XMLELEMENT("Departments",
(
SELECT XMLAGG(XMLELEMENT("department",
xmlattributes(t.department_id AS "id", t.department_name AS "name"),
XMLELEMENT("employees",
XMLAGG(XMLELEMENT("employee",
xmlattributes(g.employee_id AS "id"),
xmlforest(g.employee_name as "employee_name") ) )
)
))
FROM TABLE(cast(l_message AS deps_t)) t,
TABLE(cast(t.emp_tab AS emp_ot)) g
GROUP BY t.department_id,t.department_name) ).getclobval()
INTO l_xml_clob
FROM dual;
DBMS_OUTPUT.PUT_LINE(l_xml_clob);
END;
你能删除我们不应该看的代码吗?谢谢另外,请告诉我们你得到的错误,因为我在这里面临的问题并没有告诉我们太多。不是错误。我没有得到所需的xml结构,所以问题出在哪里?请运行您将理解的代码。
DECLARE
l_message DEPS_T;
l_employee_t emp_ot;
l_xml_clob CLOB;
BEGIN
SELECT deps_o(
d.department_id,
d.department_name,
emp_ot(emp_o(
e.employee_id,
e.first_name || ' ' || e.last_name,
e.salary
)
)
)
BULK COLLECT INTO l_message
FROM departments d , employees e
where e.department_id = d.department_id and d.department_id =20;
--Print the content
-- for i in 1..l_message.COUNT
-- loop
-- DBMS_OUTPUT.PUT_LINE(l_message(i).department_id);
-- DBMS_OUTPUT.PUT_LINE(l_message(i).department_name);
-- l_employee_t := l_message(i).emp_tab;
-- for j in 1..l_employee_t.COUNT
-- loop
-- DBMS_OUTPUT.PUT_LINE('Employee Name:'||l_employee_t(j).employee_name);
-- end loop;
-- end loop;
--Generate XML
-- <Departments>
-- <department id = "department_id" name = "department_name" >
-- <employees>
-- <employee id = "employee_id">
-- <employee_name> </employee_name>
-- <salary> </salary>
-- </employee>
-- </employees>
-- </department>
-- </Departments>
-- select XMlelement("Departments",XMLElement("department",
-- XMLAttributes(t.department_name as "id", t.department_name as "name"),
-- XMLElement("employees",
-- XMLElement("employee",
-- XMLAttributes(g.employee_id as "employee_id"),
-- XMLForest(g.employee_name,g.salary)
-- )
-- )
--
-- )).getClobval() into l_xml_clob
--
-- from TABLE(CAST(l_message as deps_t)) t,
-- TABLE(CAST(t.emp_tab as emp_ot)) g;
select XMLELEMENT("Departments",
(SELECT XMLAGG(XMLELEMENT("department",
XMLATTRIBUTES(t.department_name as "id", t.department_name as "name"),
(select XMLelement("employees",XMLAGG(XMLelement("employee",
XMLAttributes(g.employee_id as "id"),
XMlForest(g.employee_name as "employee_name")
))) ---"employees" end
from TABLE(CAST(t.emp_tab as emp_ot)) g
) ---end of inner select
)
)
from TABLE(CAST(l_message as deps_t)) t
group by t.department_id)
).getClobval() into l_xml_clob
from dual;
-- group by t.department_id;
--for rec1 in (
--select t.department_id||','
-- ||t.department_name||','
-- ||g.employee_id||','
-- ||g.employee_name||','
-- ||g.salary as r
--from TABLE(CAST(l_message as deps_t)) t
-- ,TABLE(CAST(t.emp_tab as emp_ot)) g )
-- loop
---- DBMS_OUTPUT.PUT_LINE(rec1.department_id);
---- DBMS_OUTPUT.PUT_LINE(rec1.department_name);
---- DBMS_OUTPUT.PUT_LINE(rec1.employee_id);
---- DBMS_OUTPUT.PUT_LINE(rec1.employee_name);
---- DBMS_OUTPUT.PUT_LINE(rec1.salary);
-- DBMS_OUTPUT.PUT_LINE(rec1.r);
-- end loop;
DBMS_OUTPUT.PUT_LINE(l_xml_clob);
END;
/
DECLARE
l_message DEPS_T;
l_employee_t emp_ot;
l_xml_clob CLOB;
BEGIN
SELECT deps_o(
d.department_id,
d.department_name,
emp_ot(emp_o(
e.employee_id,
e.first_name || ' ' || e.last_name,
e.salary
)
)
)
BULK COLLECT INTO l_message
FROM departments d , employees e
where e.department_id = d.department_id ;
SELECT XMLELEMENT("Departments",
(
SELECT XMLAGG(XMLELEMENT("department",
xmlattributes(t.department_id AS "id", t.department_name AS "name"),
XMLELEMENT("employees",
XMLAGG(XMLELEMENT("employee",
xmlattributes(g.employee_id AS "id"),
xmlforest(g.employee_name as "employee_name") ) )
)
))
FROM TABLE(cast(l_message AS deps_t)) t,
TABLE(cast(t.emp_tab AS emp_ot)) g
GROUP BY t.department_id,t.department_name) ).getclobval()
INTO l_xml_clob
FROM dual;
DBMS_OUTPUT.PUT_LINE(l_xml_clob);
END;