从xml插入到两个不同的表

时间:2015-12-15 08:44:29

标签: sql xml oracle sql-insert

我想将xml插入2个不同的表。

表格是:

# import matplotlib as mpl
# from matplotlib import pyplot as plt

def plot_ellpises(ell_groups):
    print 'GMM Plot Result'
    fig, ax = plt.subplots()
    for ell in ell_groups:
        xy, width, height, angle = ell
        ell = mpl.patches.Ellipse(xy=xy, width=width, height=height, angle = angle)
        ell.set_alpha(0.5)
        ax.add_patch(ell)
    ax.autoscale()
    ax.set_aspect('equal')
    return plt.show() 

ell1= [-7.13529086, 5.28809598], 4.42823535, 5.97527801,107.60800706
ell2= [.96850139, 1.33792516], 5.73498868,8.98934084,97.8230716191
ell3= [1.43665497, 3.87692805], 1.42859078, 1.95525638,83.135072216
ell_groups = [ell1,ell2,ell3]
plot_ellpises(ell_groups)

xml内容:

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);

元素<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>元素。

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

1 个答案:

答案 0 :(得分:1)

取决于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'
    );