mehrere Querys in einer Function

Kampfgummibaerlie

Datenbank-Guru
Beiträge
728
Vielleicht kam die Frage schonmal vor, aber ich habe auf die Schnelle das ganze nicht gefunden ;)

Ich hätte folgendes Problem:
Ich bin gerade am arbeiten mit Lagerstand und so, und würde gerne:

1.: Die Bestellung eintragen
und
2.: Das entsprechende Produkt vom Lagerstand abziehen

Ich habe mir daweil (bisher) eine kleine Datenbank gebaut, wo ich mich ein wenig spielen kann. (Damit ich nicht die echte Datenbank verpfuschen muss ^^)

Geht das mittels einer Function, oder muss ich mir dafür entsprechend 2 Functions bauen, und dann auch entsprechend beide abrufen? Sprich, in einer absoluten Query, die auf beide Functions zugreift.

Idee, die mir gerade einfällt:
Warum baue ich nicht einfach eine 3. Functon, die die ersten beiden Functions selected, beide mit dem selben Parametern, die der 3. Function mitgegeben wurden, und einfach in die Bestellungen eintragen und halt auch vom Lagerstand abzuziehen.

Da fällt mir eine weitere Frage ein:
Wie könnte ich, falls eine Bestellung mehrere Produkte enthält, auch diese mehreren Produkte, die bestellt wurden, alle in die Tabelle "Bestellungen" eintragen? Sprich, her Hans bestellt 3 Paar Socken und 1 Haube. Sprich in die Tabelle Bestellungen sollten 2 Zeilen eingetragen werden, die eine eben mit 3 Paar Socken, die andere eben diese 1 Haube.

Ginge das irgendwie, wenn ja, würde mich interessieren, wie....
 
Werbung:
Code:
test=# create table artikel (id int primary key, name text);
CREATE TABLE
test=# create table bestand(artikel int references artikel, menge int, check(menge >= 0));
CREATE TABLE
test=# create table bestellung(artikel int references artikel, anzahl int);
CREATE TABLE
test=# insert into artikel values (1, 'artikel 1');
INSERT 0 1
test=# insert into bestand values (1, 20);
INSERT 0 1
test=# with b as (insert into bestellung values (1,5) returning *) update bestand set menge=menge-b.anzahl from b where bestand.artikel=b.artikel;
UPDATE 1
test=# with b as (insert into bestellung values (1,50) returning *) update bestand set menge=menge-b.anzahl from b where bestand.artikel=b.artikel;
ERROR:  new row for relation "bestand" violates check constraint "bestand_menge_check"
DETAIL:  Failing row contains (1, -35).

Du brauchst nicht für jede Kleinigkeit eine Funktion, das SQL von PostgreSQL selbst ist schon msehr mächtig. Wie oben gezeigt, kannst Du mit einem einzelnen SQL Aktionen in mehreren Tabellen gleichzeitig durchführen, das Beispiel ist noch trivial.
 
Code:
INSERT 0 1
test=# with b as (insert into bestellung values (1,5) returning *) update bestand set menge=menge-b.anzahl from b where bestand.artikel=b.artikel;
UPDATE 1
test=# with b as (insert into bestellung values (1,50) returning *) update bestand set menge=menge-b.anzahl from b where bestand.artikel=b.artikel;
ERROR:  new row for relation "bestand" violates check constraint "bestand_menge_check"
DETAIL:  Failing row contains (1, -35).

Du brauchst nicht für jede Kleinigkeit eine Funktion, das SQL von PostgreSQL selbst ist schon msehr mächtig. Wie oben gezeigt, kannst Du mit einem einzelnen SQL Aktionen in mehreren Tabellen gleichzeitig durchführen, das Beispiel ist noch trivial.

Darf ich fragen, wie das "with b" funktioniert, beziehungsweise, wie ich damit agieren kann?

ich denke mir, dass damit der b-Wert (2. Wert) angesprochen wird.

Darf ich fragen, wie der Begriff heißt? (Damit ich selbst danach suchen kann (in der aktuellen Doku, und du dir nicht zuviel mühe machen musst ;) )
 
Werbung:
Zurück
Oben