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_Oracle - Fatal编程技术网

使用Oracle生成XML

使用Oracle生成XML,xml,oracle,Xml,Oracle,我正在尝试从oracle创建一个XML,它在它们之间具有父子关系 表中的数据如下所示。在这里,一名员工可以链接到一名或多名经理。 这里,empID 101链接到3管理器100102104 最后的XML应该是这样的 <view_hierarchy chm="com.hierarchy"> <link> <parentID ID="100"> <contains> <child ID="101"/&

我正在尝试从oracle创建一个XML,它在它们之间具有父子关系

表中的数据如下所示。在这里,一名员工可以链接到一名或多名经理。 这里,empID 101链接到3管理器100102104

最后的XML应该是这样的

<view_hierarchy chm="com.hierarchy">
<link>
    <parentID ID="100">
        <contains>
            <child ID="101"/>
            <containby>
                <parentID ID="102"/>
                <parentID ID="104"/>
            </containby>                    
        </contains>
        <contains>
            <child ID="105"/>             
        </contains>
    </parentID>
</link>
</view_hierarchy>

我想,这就是你想要的:

with employees as(
select 101 Employee_ID , 100 Manager_ID from dual
union all
select 105 Employee_ID , 100 Manager_ID from dual
union all
select 101  Employee_ID , 102 Manager_ID from dual
union all
select 101 Employee_ID , 104 Manager_ID from dual
)
SELECT XMLElement (
 "view_hierarchy",
                   XMLATTRIBUTES('com.hierarchy.mdm'as "chm"), 
                   XMLElement ("link", XMLAgg(
                   XMLElement("parentID", 
                   XMLAttributes(e1.manager_id as "GTIN"),  
                  XMLElement ("contains",XMLAgg
                                (   
                  XMLELEMENT (
                  "child", 
                            XMLAttributes(e1.employee_id as "GTIN"), e2.x                                 
                                         ))           
                  ) 
                                  )))
                )   ||''
  FROM employees e1
left join (select    
                            XMLElement ("containby"    , XMLAgg(XMLElement("parentID", XMLAttributes
            (e2.manager_id as "GTIN" )   )     
                                      ) )
                             x, employee_id   from employees e2
                             where e2.manager_id !=100
                            group by e2.employee_id) e2 on e2.employee_id=e1.employee_id 
where e1.manager_id=100 
group by e1.manager_id

这应该可以解决问题

      SELECT XMLELEMENT (
        "view_hierarchy",
        XMLATTRIBUTES ('com.hierarchy.mdm' AS "chm"),
        XMLELEMENT (
           "link",
           XMLELEMENT (
              "PARENT_ID",
              XMLAttributes (manager_id AS "GTIN"),
              XMLELEMENT (
                 "contains",
                 XMLAGG(XMLELEMENT (
                           "child",
                           XMLAttributes (emp.employee_id AS "GTIN"),
                           XMLELEMENT (
                              "contained_by",
                              (SELECT XMLAGG(XMLELEMENT (
                                                "parent_id",
                                                xmlattributes (
                                                   emp_p.manager_id AS "GTIN")))
                                 FROM employees emp_p
                                WHERE emp_p.manager_id <> emp.manager_id
                                      AND emp.employee_id =
                                            emp_p.employee_id))))))))
     || ' '
FROM employees emp
WHERE emp.manager_id = 100
GROUP BY emp.manager_id

我认为,您的数据是错误的,雇员101有3个经理。它可以有多个经理。containby part中也必须反映出这一点,在containby part中,它将显示除列出它的管理器之外的所有管理器。因此,主管理器是谁,还是随机的?主管理器强烈反对在语句的select部分使用子select。这可能会破坏您的性能。一个子选择是不必要的,我删除了,因为我认为xml的结构不好,但要实现xml,我认为这个查询是简单且更容易理解的。
with employees as(
select 101 Employee_ID , 100 Manager_ID from dual
union all
select 105 Employee_ID , 100 Manager_ID from dual
union all
select 101  Employee_ID , 102 Manager_ID from dual
union all
select 101 Employee_ID , 104 Manager_ID from dual
)
SELECT XMLElement (
 "view_hierarchy",
                   XMLATTRIBUTES('com.hierarchy.mdm'as "chm"), 
                   XMLElement ("link", XMLAgg(
                   XMLElement("parentID", 
                   XMLAttributes(e1.manager_id as "GTIN"),  
                  XMLElement ("contains",XMLAgg
                                (   
                  XMLELEMENT (
                  "child", 
                            XMLAttributes(e1.employee_id as "GTIN"), e2.x                                 
                                         ))           
                  ) 
                                  )))
                )   ||''
  FROM employees e1
left join (select    
                            XMLElement ("containby"    , XMLAgg(XMLElement("parentID", XMLAttributes
            (e2.manager_id as "GTIN" )   )     
                                      ) )
                             x, employee_id   from employees e2
                             where e2.manager_id !=100
                            group by e2.employee_id) e2 on e2.employee_id=e1.employee_id 
where e1.manager_id=100 
group by e1.manager_id
      SELECT XMLELEMENT (
        "view_hierarchy",
        XMLATTRIBUTES ('com.hierarchy.mdm' AS "chm"),
        XMLELEMENT (
           "link",
           XMLELEMENT (
              "PARENT_ID",
              XMLAttributes (manager_id AS "GTIN"),
              XMLELEMENT (
                 "contains",
                 XMLAGG(XMLELEMENT (
                           "child",
                           XMLAttributes (emp.employee_id AS "GTIN"),
                           XMLELEMENT (
                              "contained_by",
                              (SELECT XMLAGG(XMLELEMENT (
                                                "parent_id",
                                                xmlattributes (
                                                   emp_p.manager_id AS "GTIN")))
                                 FROM employees emp_p
                                WHERE emp_p.manager_id <> emp.manager_id
                                      AND emp.employee_id =
                                            emp_p.employee_id))))))))
     || ' '
FROM employees emp
WHERE emp.manager_id = 100
GROUP BY emp.manager_id