如何在pl sql中将聚合xml元素分组到另一个父xml标记中
我在oracle数据库中存储了以下类型的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> <
<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;