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
通过Oracle XML函数生成嵌套XML_Xml_Oracle_Plsql - Fatal编程技术网

通过Oracle XML函数生成嵌套XML

通过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

我试图从Oracle中的HR模式中获取数据,生成一个嵌套的XML。XML应该如下所示。在本例中,数据驻留在Oracle PLSQL对象中,而不是employees和departments表中

<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;