0

繰り返しノードを取得するために使用したいこのコードがあります。これまでのところ、部分文字列をハードコーディングして、名前の種類が「スペルのバリエーション」である FirstName と Surname から値を見つけることしかできませんでした。私の他のすべての試みは、さまざまなエラーと null 値が返されて失敗しました。[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;
4

1 に答える 1