Bartosz O.

Bartosz O. Administrator
systemów

Temat: PostgreSQL - pętla do pliku XML

Witam
Mam problem. Potrzebuje zrobić plik xml z poziomu SQLa z pętlą i potrafię sobie z tym poradzić :(

Muszę otrzymać plik o następującej strukturze:
<faktura>
<odbiorca>
<nazwa>firma1</nazwa>
<adres>Kielce</adres>
</odbiorca>
<pozycje>
<towar>
<indeks>towar1</indeks>
<ilosc>5</ilosc>
</towar>
<towar>
<indeks>towar2</indeks>
<ilosc>7</ilosc>
</towar>
</pozycje
</faktura>

I tak jak z "nagłówkiem" sobie poradziłem, tak mam problem z pozycjami. Próbowałem już z XMLFOREST, XMLAGG - możliwe, że źle ich używałem - ale za każdym razem pętla odnosi się do całego dokumentu a nie tylko do segmentu pozycje. Czy jest możliwe stworzenie takiego pliku bez PL/pgSQL czy będę musiał z niego skorzystać i dopiero tam utworzyć pętle?
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: PostgreSQL - pętla do pliku XML

Wersja PostgreSQL?
Struktura z jakiej chcesz osiągnąć XML'a?
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: PostgreSQL - pętla do pliku XML

Przy strukturze w PostgreSQL 9.5:
DROP TABLE IF EXISTS faktury_pozycje;
DROP TABLE IF EXISTS faktury;
DROP TABLE IF EXISTS odbiorca;


CREATE TABLE odbiorca (
id int,
nazwa text,
adres text,
CONSTRAINT odbiorca_pkey PRIMARY KEY (id)
);

CREATE TABLE faktury (
id int,
id_odbiorca int,
CONSTRAINT faktury_pkey PRIMARY KEY (id),
CONSTRAINT faktury_fkey FOREIGN KEY (id_odbiorca)
REFERENCES odbiorca (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT
);

CREATE TABLE faktury_pozycje (
id int,
lp int,
indeks text,
ilosc int,
CONSTRAINT faktury_pozycje_pkey PRIMARY KEY (id, lp),
CONSTRAINT faktury_pozycje_fkey FOREIGN KEY (id)
REFERENCES faktury (id) MATCH SIMPLE
ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO odbiorca VALUES (1, 'odbiorca 1', 'adres 1');
INSERT INTO odbiorca VALUES (2, 'odbiorca 2', 'adres 2');

INSERT INTO faktury VALUES (1, 1);
INSERT INTO faktury VALUES (2, 2);
INSERT INTO faktury VALUES (3, 1);

INSERT INTO faktury_pozycje VALUES (1, 1, 'indeks 1', 1);
INSERT INTO faktury_pozycje VALUES (2, 1, 'indeks 2', 3);
INSERT INTO faktury_pozycje VALUES (2, 2, 'indeks 4', 7);
INSERT INTO faktury_pozycje VALUES (3, 1, 'indeks 1', 1);
INSERT INTO faktury_pozycje VALUES (3, 2, 'indeks 2', 2);
INSERT INTO faktury_pozycje VALUES (3, 3, 'indeks 3', 3);
INSERT INTO faktury_pozycje VALUES (3, 4, 'indeks 4', 7);
wystarczy SQL:
SELECT 
f.id,
xmlelement(name faktura,
xmlelement(
name odbiorca,
xmlelement(name nazwa, o.nazwa),
xmlelement(name adres, o.adres)
),
xmlelement(
name pozycje,
xmlagg(
xmlelement(
name towar,
concat(
xmlelement(name indeks, indeks),
xmlelement(name ilosc, ilosc)
)::xml
)
)
)
) AS faktura
FROM faktury_pozycje fp
JOIN faktury f ON fp.id = f.id
JOIN odbiorca o ON f.id_odbiorca = o.id
GROUP BY f.id, o.nazwa, o.adres;

konto usunięte

Temat: PostgreSQL - pętla do pliku XML

Bardzo ładne :)
Bartosz O.

Bartosz O. Administrator
systemów

Temat: PostgreSQL - pętla do pliku XML

Działa idealnie. Bardzo dziękuję za pomoc i nową wiedzę :) W moich zapytaniach brakowało concata

konto usunięte

Temat: PostgreSQL - pętla do pliku XML

Ja bym pewnie stringi po staremu kleił, a tu proszę. :D

Następna dyskusja:

Konwersja do XMl i zapis do...




Wyślij zaproszenie do