Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
如何在pl sql中将聚合xml元素分组到另一个父xml标记中_Xml_Oracle - Fatal编程技术网

如何在pl sql中将聚合xml元素分组到另一个父xml标记中

如何在pl sql中将聚合xml元素分组到另一个父xml标记中,xml,oracle,Xml,Oracle,我在oracle数据库中存储了以下类型的xml数据, 更新 但我希望它们采用以下格式更新: <employee> <id>123</id> <year>2016</year> <month>1</month> <head> <type>1</type> <paymstr_salhdnm>BASIC PAY</paymstr_salhdnm> <

我在oracle数据库中存储了以下类型的xml数据, 更新

但我希望它们采用以下格式更新:

<employee>
 <id>123</id>
 <year>2016</year>
 <month>1</month>
<head>
<type>1</type>
<paymstr_salhdnm>BASIC PAY</paymstr_salhdnm>
<paymstr_amount>440000</paymstr_amount>
</head>
<head>
<type>1</type>
<paymstr_salhdnm>ASSOCIATION SUBSCRIPTION</paymstr_salhdnm>
<paymstr_amount>240</paymstr_amount>
</head>
<head>
<type>1</type>
<paymstr_salhdnm>TELEPHONE ALLOWANCE</paymstr_salhdnm>
<paymstr_amount>800</paymstr_amount>
</head>
<head>
<type>1</type>
<paymstr_salhdnm>HOUSE RENT DEDUCTION</paymstr_salhdnm>
<paymstr_amount>2587.5</paymstr_amount>
</head>
<head>
<type>1</type>
<paymstr_salhdnm>MEDICAL ALLOWANCE</paymstr_salhdnm>
<paymstr_amount>700</paymstr_amount>
</head>
<head>
<type>1</type>
<paymstr_salhdnm>GAS BILL</paymstr_salhdnm>
<paymstr_amount>450</paymstr_amount>
</head>
</employee>
以下是我的pl sql代码更新:

      BEGIN   
   xmlData:=XMLType(master_file_data);
   employee_id := xmlData.extract('/employee_id/text()').getstringval();
   select   xmlElement(  "employee",
              xmlelement("id", e.PAYMSTR_EMPID),
              xmlelement("year", e.PAYMSTR_SALYR),
              xmlelement("month", e.PAYMSTR_SALMT),
              (select  XMLAGG(                
               xmlforest(  PAYMSTR_SALHDNM, PAYMSTR_AMOUNT  )                     
                 )
               from TBL_PAYROLL_MASTER_FILE s where  s.PAYMSTR_EMPID = e.PAYMSTR_EMPID and 
                  s.PAYMSTR_SALYR = e.PAYMSTR_SALYR and s.PAYMSTR_SALMT = e.PAYMSTR_SALMT)      
                      )   AS clob into ret
    from  
       ( select distinct PAYMSTR_EMPID, PAYMSTR_SALYR, PAYMSTR_SALMT 
         from  TBL_PAYROLL_MASTER_FILE where  PAYMSTR_EMPID = employee_id ) e;

 RETURN '<result><status >success</status>'||ret.getClobval()||'</result>';
我如何才能做到这一点。请帮助我找到简单的解决方案。请让我知道更多信息。谢谢-

 select 
        xmlagg
             (
              xmlelement("employee",
                    xmlelement("id", e.PAYMSTR_EMPID),
                    xmlelement("year", e.PAYMSTR_SALYR),
                    xmlelement("month", e.PAYMSTR_SALMT),
                    XMLAGG(
                        xmlelement("head",
                           xmlelement("type", 1), 
                           xmlelement("paymstr_salhdnm", salhdnm), 
                           xmlelement("paymstr_amount", amount))
                        )
                       )
              )
  into ret
  FROM tbl_payroll_master_file e
 WHERE e.PAYMSTR_EMPID = employee_id 
 GROUP BY e.PAYMSTR_EMPID, e.PAYMSTR_SALYR, e.PAYMSTR_SALMT;
例如:

declare 
    ret CLOB;
begin
    with e as
    (
        select 123 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'BASIC PAY' as salhdnm, 440000 as amount from dual union all
        select 123 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'ASSOCIATION SUBSCRIPTION' as salhdnm, 240 as amount from dual union all
        select 345 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'BASIC PAY' as salhdnm, 440000 as amount from dual union all
        select 345 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'ASSOCIATION SUBSCRIPTION' as salhdnm, 240 as amount from dual
    )
    select 
     xmlroot(
            XMLElement("result",
              XMLElement("status", 'success'),
                      XMLAGG
                         (
                          XMLElement("employee",
                                xmlelement("id", e.PAYMSTR_EMPID),
                                xmlelement("year", e.PAYMSTR_SALYR),
                                xmlelement("month", e.PAYMSTR_SALMT),
                                XMLAGG(
                                    xmlelement("head",
                                       xmlelement("type", 1), 
                                       xmlelement("paymstr_salhdnm", salhdnm), 
                                       xmlelement("paymstr_amount", amount))
                                    )
                                   )
                          )
                      ),
                  version '1.0" encoding="utf-8'
           ).getClobVal() as xml_data
    into ret
    from e
    group by e.PAYMSTR_EMPID, e.PAYMSTR_SALYR, e.PAYMSTR_SALMT;
   dbms_output.put_line(ret);
end;

非常感谢@Stawros。不过,我认为我可以在现有代码中添加您的解决方案。但是,很难理解xml标记的安排。请查看我的最新更新,并向我推荐任何更新的解决方案。这对我和其他初学者都非常有用。Thanks@user5005768更新了我的答案,我希望这足以理解这些原则。非常感谢@Stawros。但我不想使用xmlementresult、xmlementstatus、“success”,和版本“1.0 encoding=utf-8”。我只是将XMLElementemployee作为最外层的标记。我尝试了一下,但显示错误精确获取返回的行数超过了请求的行数。我从查询中删除结果和状态,它对我来说运行良好。更新我的答案,不带他们。如果它不起作用,请在with子句或sqlfiddle.comIn中添加数据样本,如果一名员工的PAYMSTR\u EMPID有几年的PAYMSTR\u SALYR+月PAYMSTR\u SALMT组合。按表达式检查分组。
declare 
    ret CLOB;
begin
    with e as
    (
        select 123 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'BASIC PAY' as salhdnm, 440000 as amount from dual union all
        select 123 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'ASSOCIATION SUBSCRIPTION' as salhdnm, 240 as amount from dual union all
        select 345 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'BASIC PAY' as salhdnm, 440000 as amount from dual union all
        select 345 as paymstr_empid, 2016 as paymstr_salyr, 1 as paymstr_salmt, 'ASSOCIATION SUBSCRIPTION' as salhdnm, 240 as amount from dual
    )
    select 
     xmlroot(
            XMLElement("result",
              XMLElement("status", 'success'),
                      XMLAGG
                         (
                          XMLElement("employee",
                                xmlelement("id", e.PAYMSTR_EMPID),
                                xmlelement("year", e.PAYMSTR_SALYR),
                                xmlelement("month", e.PAYMSTR_SALMT),
                                XMLAGG(
                                    xmlelement("head",
                                       xmlelement("type", 1), 
                                       xmlelement("paymstr_salhdnm", salhdnm), 
                                       xmlelement("paymstr_amount", amount))
                                    )
                                   )
                          )
                      ),
                  version '1.0" encoding="utf-8'
           ).getClobVal() as xml_data
    into ret
    from e
    group by e.PAYMSTR_EMPID, e.PAYMSTR_SALYR, e.PAYMSTR_SALMT;
   dbms_output.put_line(ret);
end;