我有这段代码,我想用它来获取重复节点。到目前为止,我只设法对子字符串进行硬编码,以从名字类型为 = 'Spelling Variation' 的名字和姓氏中找到一个值。我所有其他尝试都失败了,并返回了各种错误和空值。有没有办法做到这一点而无需提供 [1]、[2]、[3]、[?]。
非常感谢您传递的任何信息。
--------------------------------------------------------------------------------------
declare
x xmltype := xmltype('<?xml version="1.0" ?>
<Records>
<Person id="34463" action="chg" date="23-Nov-2009">
<Gender>Female</Gender>
<ActiveStatus>Inactive</ActiveStatus>
<Deceased>No</Deceased>
<NameDetails>
<Name NameType="Primary Name">
<NameValue>
<FirstName>34463FirstName</FirstName>
<Surname>34463Surname</Surname>
</NameValue>
</Name>
<Name NameType="Spelling Variation">
<NameValue>
<FirstName>34463FirstnameVar1</FirstName>
<Surname>34463SurnameVar1</Surname>
</NameValue>
<NameValue>
<FirstName>34463FirstNameVar2</FirstName>
<Surname>34463SurnameVar2</Surname>
</NameValue>
</Name>
</NameDetails>
</Person>
<Person id="34464" action="chg" date="23-Nov-2009">
<Gender>Male</Gender>
<ActiveStatus>Inactive</ActiveStatus>
<Deceased>No</Deceased>
<NameDetails>
<Name NameType="Primary Name">
<NameValue>
<FirstName>34464FirstName</FirstName>
<Surname>34464Surname</Surname>
</NameValue>
</Name>
<Name NameType="Spelling Variation">
<NameValue>
<FirstName>34464FirstnameVar1</FirstName>
<Surname>34464SurnameVar1</Surname>
</NameValue>
<NameValue>
<FirstName>34464FirstnameVar2</FirstName>
<Surname>34464SurnameVar2</Surname>
</NameValue>
</Name>
</NameDetails>
</Person>
</Records>');
begin
for get_id in (select extractvalue(value(id),'/Person/@id') as id
from table(xmlsequence(extract(x,'/Records/Person'))) id ) loop
-- dbms_output.put_line(get_id.id);
for get_gender in (select extractvalue(value(gender),'/Person/Gender') as gender
from table(xmlsequence(extract(x,'/Records/Person'))) gender
where extractValue(value(gender),'/Person/@id') =get_id.id)
loop
dbms_output.put_line(get_gender.gender);
end loop;
for get_name in (select extractvalue(value(fname),'/NameValue/FirstName') as fname
from table(xmlsequence(extract
(x,'/Records/Person/NameDetails/Name/NameValue'))) fname
where extractValue(value(fname),'/Person/@id') = get_id.id) loop
dbms_output.put_line('Name is '||get_name.fname);
end loop;
for get_name in
(--Pick out primary name
SELECT extractvalue(value(xname),'/Name/NameValue/FirstName') fname
,extractvalue(value(xname),'/Name/NameValue/Surname') sname
,extractvalue(value(xname),'/Name/NameValue/OriginalScriptName') oname
FROM table(xmlsequence(extract(
(--Get person TAG
select xmltype(xperson.OBJECT_VALUE.getstringval() )
from table(xmlsequence(extract(x,'/Records/Person'))) xperson
where extractValue(value(xperson),'/Person/@id') = get_id.id
)
,'Person/NameDetails/Name'))) xname
WHERE extractValue(value(xname),'/Name/@NameType') in ('Primary Name')
)
loop
dbms_output.put_line(get_name.fname||' '||get_name.sname||' '||get_name.oname);
dbms_output.put_line(' ');
end loop;
for get_name in
(--Pick out Spelling Variation
SELECT extractvalue(value(xname),'/Name/NameValue[1]/FirstName') fname1
,extractvalue(value(xname),'/Name/NameValue[1]/Surname') sname1
,extractvalue(value(xname),'/Name/NameValue[2]/FirstName') fname2
,extractvalue(value(xname),'/Name/NameValue[2]/Surname') sname2
,extractvalue(value(xname),'/Name/NameValue[3]/FirstName') fname3
,extractvalue(value(xname),'/Name/NameValue[3]/Surname') sname3
FROM table(xmlsequence(extract(
(--Get person TAG
select xmltype(xperson.OBJECT_VALUE.getstringval() )
from table(xmlsequence(extract(x,'/Records/Person'))) xperson
where extractValue(value(xperson),'/Person/@id') = get_id.id
)
,'Person/NameDetails/Name'))) xname
WHERE extractValue(value(xname),'/Name/@NameType') in ('Spelling Variation')
)
loop
dbms_output.put_line(get_name.fname1||' '||get_name.sname1);
dbms_output.put_line(get_name.fname2||' '||get_name.sname2);
dbms_output.put_line(get_name.fname3||' '||get_name.sname3);
dbms_output.put_line(' ');
end loop;
dbms_output.put_line(' ');
end loop;
end;