![]() |
Datenbank: Postgres • Version: 9? • Zugriff über: DevExpress oder so
INSERTs verbinden
SQL-Code:
INSERT INTO ... RETURNING mr_id;
oder? INSERT INTO ... RETURNING mr_id AS mrID;
SQL-Code:
Im Prinzip könnte ich ja das erste Insert in das Zweite reinbekommen, aber wie mache ich es, wenn ich den Wert mehrfach benötige? (temporäre Variablen gibt's scheinbar nicht)
INSERT INTO ... VALUES
(mrID, ...), (mrID, ...), ...; Oder kann man vielleicht beim INSERT irgendwie angeben, daß bei jedem Record ein zusätzliches Feld mit diesem Wert gesetzt werden soll?
SQL-Code:
quasi statt
INSERT INTO t (i, a, b, c) VALUES (mrID, 'a', 'b', 'c'), (mrID, 'a', 'b', 'c') sowas INSERT INTO t (a, b, c) VALUES ('a', 'b', 'c'), ('a', 'b', 'c') ÜBERALL i = mrID |
AW: INSERTs verbinden
Ich habe keine Ahnung von Postgres,
beim MS-SQL-Server ginge es so
Code:
Insert into Nase ([Spalte 0],[Spalte 1],[Spalte 2])
Select 1,'text1',1.1 union Select 2,'text2',2.2 union Select 3,'text3',3.3 |
AW: INSERTs verbinden
Nur kann ich da nicht erkennen, wo der mehrfach verwendete Wert reinkommt?
Für eine Zeile wäre es etwa so.
SQL-Code:
.
INSERT INTO t (a, b, c, i) VALUES ('a', 'b', 'c', (INSERT INTO ... RETURNING mr_id))
Aber ich möchte die ID ja an mehreren Stellen verwenden. |
AW: INSERTs verbinden
Ich versteh Dein Problem nicht ganz.
MR_ID müsste doch mit einer der Spaltennamen übereinstimmen und macht m.E. nur Sinn, wenn dieser Wert durch die DB/ Trigger/ Default automatisch belegt wird. Zumindest wenn es ein dynamischer "OUT" Parameter sein soll. Wenn es bloß eine "IN"-Konstante für mehrere Zeilen ist, kannst Du sie doch explizit in das Statement eintragen. P.S: Hab auch keine Ahnung von Postgres. |
AW: INSERTs verbinden
mr_id ist ein AutoInc-Field.
Im Prinzip geht es um sowas:
SQL-Code:
Nur eben am Ende nur als ein einziges Statement.
CREATE TABLE Personen (
Person SERIAL PRIMARY KEY, Name VARCHAR(50) NOT NULL); CREATE TABLE Körperteil ( Person INTEGER NOT NULL REFERENCES Person ON UPDATE CASCADE, Name VARCHAR(50) NOT NULL, Größe INTEGER NOT NULL); pID := INSERT INTO Personen (Name) VALUES ('Frank') RETURNING PersonId; INSERT INTO Körperteile (Person, Name, Größe) VALUES (:pID, 'Nase', 10), (:pID, 'Mund', 20), (:pID, 'Augen', 5); -- bzw. pID := INSERT INTO Personen (Name) VALUES ('Frank') RETURNING PersonId; INSERT INTO Körperteile (Person, Name, Größe) VALUES (:pID, 'Nase', 10); INSERT INTO Körperteile (Person, Name, Größe) VALUES (:pID, 'Mund', 20); INSERT INTO Körperteile (Person, Name, Größe) VALUES (:pID, 'Augen', 5); ... Innerhalb von diesen komischen Prozeduren ginge sowas, aber in einer einfachen Query sieht es mit Variablen etwas schlecht aus.
SQL-Code:
CREATE FUNCTION ... AS #
DECLARE mrID INTEGER; BEGIN SELECT mr_id INTO mrID FROM ...; INSERT INTO table VALUES (mrID, 'Nase', 10), (mrID, 'Mund', 20); END#; |
AW: INSERTs verbinden
Also für jeden Datensatz den automatisch vergebenen Wert? Wenn ich es richtig gelesen habe, kann PostreSQL in Stored Procedures ganze Datenmengen zurückgeben. Wie man da nun aber auch Datenmengen als Eingabeparameter übergeben könnte, weiß ich leider auch nicht.
|
AW: INSERTs verbinden
Zitat:
Einen Wert/eine Stelle kann ich ersetzen, aber eben nicht Mehrere. |
AW: INSERTs verbinden
Also wenn es darum geht, dass Du Dir sparen willst, den Parameter im InsertQueury mehrfach zu bestücken, dann könnte man evtl. so vorgehen:
In Delphi Query SQL anonymous block in psql mit Variablen Declaration erzeugen, Variable einmalig mit Parameter bestücken und abfeuern. So mach ich das zumindest in Oracle. Postgress soll ja "halbwegs" ähnlich sein. Obs geht weiß ich nicht, auf die Schnelle habe ich sowas hier gefunden: ![]() Ob es das richtige ist und in Deiner Postgres Version auch geht, musst Du schauen. |
AW: INSERTs verbinden
Cool, das mit dem Anonymus funktioniert. :thumb:
SQL-Code:
Ich hatte es schon mit einer ähnlichen (krankeren) Variante versucht.
DO $$
DECLARE mrID INTEGER; BEGIN END$$; > StroredProzedur erstellen, aufrufen und wieder löschen Nur ist das nicht grade "schön". :oops: |
AW: INSERTs verbinden
Fein!
Gegen eine StoredProc spricht ja eigentlich auch nichts, ich mein, wenn man sie nicht ständig erzeugt und wieder löscht. Aber ich glaub, ich muss mir postgres auch mal anschauen. Wenn sowas geht, gefällt mir das doch erst recht. Und krank find ich jetzt anonymous block nicht grad. Wenn man unbedingt keine stored procs nutzen will, ist es doch ne schöne Alternative. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz