从 xml 插入到两个不同的表

insert from xml to two different tables

我想插入一个 xml 到 2 个不同的表格。

table是:

create table PersonUmfrage(
  PersonenId  INTEGER NOT NULL,
  Nachname    VARCHAR2 (30),
  Vorname     VARCHAR2 (30),
  PLZ         INTEGER,
  GebDat      DATE);

create table VersicherungUmfrage(
  PersonenId           INTEGER NOT NULL,
  Bezeichnung          VARCHAR2 (30),
  Wert                 INTEGER,
  monatlicher_Beitrag  NUMBER,
  Abschlussdatum       DATE,
  LaufzeitJahre        INTEGER);

xml内容:

<Versicherungsnehmer>
  <Person Bundesland="Oberösterreich">
    <Vorname>Reinhard</Vorname>
    <Nachname>Schütz</Nachname>
    <PLZ>4567</PLZ>
    <Geburtsdatum>1991-05-03</Geburtsdatum>

    <Versicherung>
        <Wert>20000</Wert>
        <monatlicher_Beitrag>60</monatlicher_Beitrag>
        <Abschlussdatum>1991-05-03</Abschlussdatum>
        <Laufzeit>25</Laufzeit>
    </Versicherung>
  </Person>
</Versicherungsnehmer>

元素 <Person> 应保存在与元素 <Versicherung> 不同的 table 中。可能是,一个人将拥有更多 <Versicherung> 个元素。

如何将信息插入到不同的 table 中?

取决于 PersonenId 的解析方式,但在 Oracle 中,您可以使用一个馈送查询插入到多个表中:

INSERT ALL
    WHEN ROWNUM = 1 THEN
        INTO PersonUmfrage (PersonenId, Nachname, Vorname, PLZ, GebDat) VALUES (PersonenId, Nachname, Vorname, PLZ, Geburtsdatum)
    WHEN 1 = 1 THEN
        INTO VersicherungUmfrage (PersonenId, Wert, monatlicher_Beitrag, Abschlussdatum, LaufzeitJahre) VALUES (PersonenId, Wert, monatlicher_Beitrag, Abschlussdatum, Laufzeit)
SELECT
    1 PersonenId, Vorname, Nachname, PLZ, Geburtsdatum, Wert, monatlicher_Beitrag, Abschlussdatum, Laufzeit
FROM
    XMLTABLE(
        'let $person := $DATA/Versicherungsnehmer/Person
         for $versicherung in $DATA/Versicherungsnehmer/Person/Versicherung
         return
            <data>
                {$person/Vorname}
                {$person/Nachname}
                {$person/PLZ}
                {$person/Geburtsdatum}
                {$versicherung/Wert}
                {$versicherung/monatlicher_Beitrag}
                {$versicherung/Abschlussdatum}
                {$versicherung/Laufzeit}
            </data>'
            PASSING
               XMLTYPE('<Versicherungsnehmer>
  <Person Bundesland="Oberösterreich">
    <Vorname>Reinhard</Vorname>
    <Nachname>Schütz</Nachname>
    <PLZ>4567</PLZ>
    <Geburtsdatum>1991-05-03</Geburtsdatum>

    <Versicherung>
        <Wert>20000</Wert>
        <monatlicher_Beitrag>60</monatlicher_Beitrag>
        <Abschlussdatum>1991-05-03</Abschlussdatum>
        <Laufzeit>25</Laufzeit>
    </Versicherung>
    <Versicherung>
        <Wert>20001</Wert>
        <monatlicher_Beitrag>61</monatlicher_Beitrag>
        <Abschlussdatum>1991-05-04</Abschlussdatum>
        <Laufzeit>26</Laufzeit>
    </Versicherung>
  </Person>
</Versicherungsnehmer>') AS data
            COLUMNS
                Vorname VARCHAR2(30) PATH 'Vorname',
                Nachname VARCHAR2(30) PATH 'Nachname',
                PLZ NUMBER PATH 'PLZ',
                Geburtsdatum DATE PATH 'Geburtsdatum',
                wert NUMBER PATH 'Wert',
                monatlicher_Beitrag NUMBER PATH 'monatlicher_Beitrag',
                Abschlussdatum DATE PATH 'Abschlussdatum',
                Laufzeit NUMBER PATH 'Laufzeit'
    );