Сложная обработка XML в Oracle - PullRequest
2 голосов
/ 02 февраля 2011

Может кто-нибудь сказать, как я могу обрабатывать сложный XML в Oracle? Например, у меня есть XML ниже:

<?xml version="1.0" encoding="utf-8" ?> 
<UserEmailPreferences>
 <EmailOffering>
  <EmailGroupID>1</EmailGroupID> 
  <EmailOfferingID>0</EmailOfferingID> 
  <Service>
    <val>service-1</val>
    <val>service-2</val>
  </Service> 
  <Title>Clinical Focus</Title> 
  <SubscriptionOption>D</SubscriptionOption> 
  </EmailOffering>
</UserEmailPreferences>
<UserEmailPreferences>
 <EmailOffering>
  <EmailGroupID>1</EmailGroupID> 
  <EmailOfferingID>0</EmailOfferingID> 
  <Service>
    <val>service-1</val>
  </Service> 
  <Title>XYZ</Title> 
  <SubscriptionOption>D</SubscriptionOption> 
  </EmailOffering>
</UserEmailPreferences>

В приведенном выше XML у меня есть два <UserEmailPreferences> узла. Это может быть два, три или что угодно ... Это динамично.

В узле <UserEmailPreferences> у меня есть блок <Service>, который снова является динамическим для соответствующего узла <EmailOffering>.

Может кто-нибудь помочь мне, как я могу обработать такой XML в Oracle?

1 Ответ

2 голосов
/ 02 февраля 2011

вы можете использовать метод, описанный в вопросе SO "Oracle Pl / SQL: цикл по узлам XMLTYPE" , например:

SQL> SELECT extractvalue(column_value,'/EmailOffering/EmailGroupID') "GrpID",
  2         extractvalue(column_value,'/EmailOffering/EmailOfferingID')"OfrID",
  3         extractvalue(column_value,'/EmailOffering/Title') "Title",
  4         extractvalue(column_value,'/EmailOffering/SubscriptionOption')"Op",
  5         extract(COLUMN_VALUE, '/EmailOffering/Service') service
  6    FROM TABLE(XMLSequence(XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
  7  <document>
  8     <UserEmailPreferences>
  9      <EmailOffering>
 10       <EmailGroupID>1</EmailGroupID>
 11       <EmailOfferingID>0</EmailOfferingID>
 12       <Service>
 13         <val>service-1</val>
 14         <val>service-2</val>
 15       </Service>
 16       <Title>Clinical Focus</Title>
 17       <SubscriptionOption>D</SubscriptionOption>
 18       </EmailOffering>
 19     </UserEmailPreferences>
 20     <UserEmailPreferences>
 21      <EmailOffering>
 22       <EmailGroupID>1</EmailGroupID>
 23       <EmailOfferingID>0</EmailOfferingID>
 24       <Service>
 25         <val>service-1</val>
 26       </Service>
 27       <Title>XYZ</Title>
 28       <SubscriptionOption>D</SubscriptionOption>
 29       </EmailOffering>
 30     </UserEmailPreferences>
 31  </document>').extract('/document/UserEmailPreferences/EmailOffering'))) t;

GrpID  OfrID  Title                Op     SERVICE
------ ------ -------------------- ------ -------------------------------------
1      0      Clinical Focus       D      <Service>
                                            <val>service-1</val>
                                            <val>service-2</val>
                                          </Service>

1      0      XYZ                  D      <Service>
                                            <val>service-1</val>
                                          </Service>

Обратите внимание, что ваш XML не был действительным документом, так как в нем отсутствовал тег (в нем я добавил тег /document)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...