![]() |
AW: Datensätze schnell einfügen bzw. ersetzen
Moin,
hat mal jemand ein funktionierendes Beispiel für ein Update od Insert mit einer matching und returning-Klausel? Möglichst so, dass es auch im Flamerobin zu testen ist, denn das bekomme ich gerae nicht hin. (Ich kann mir die angemessene Geduld heute nicht leisten, sorry) Grüße, Messie |
AW: Datensätze schnell einfügen bzw. ersetzen
In MATCHING schreibst du die Liste der Felder die einen vorhandenen Datensatz identifizieren sollen in RETURNING das rückzulieferende Feld. Z.B. wenn eine Person anhand des Vornamens und Geburtsdatum identifiziert werden soll (Nachname kann sich ja ändern):
SQL-Code:
-> 1
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Müller', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
SQL-Code:
-> 2
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Peter', 'Müller', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
SQL-Code:
-> 3
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Müller', '24.12.1974') MATCHING ( vorname, gebdat) RETURNING(ID);
SQL-Code:
-> 1
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Maier', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
|
AW: Datensätze schnell einfügen bzw. ersetzen
Hallo Markus,
im Gegensatz zur OH schreibst du den returning-parameter in Klammern und ohne die into-Klausel. Das hilft gegen die merkwürdige Fehlermeldung "unexpected end of command line". Wenn ich dort "returning (RET_ID)" angebe, kann ich danach nicht darauf zugreifen. "ID" wird als nicht bekannt behandelt (obwohl als Spalte vorhanden), RET_ID wird in Klammern nicht als zulässige Spalte bezeichnet. Hast Du eine korrekte Bezeichnung des Index' beim returning mit einer entsprechenden Abfrage? Danke, Messie |
AW: Datensätze schnell einfügen bzw. ersetzen
Die Klammer ist falsch. Ich habe gerade kein Delphi zu Hand. Aber so sollte es gehen:
Delphi-Quellcode:
var
sL, slF: TStrings; i: Integer; ... begin try sl := TStringlist.Create; slf := TStringList.Create; slf.Delimiter := ';'; sl.add( 'Susi'; 'Müller'; ... .. IBQuery.SQL.Text := 'update or insert into Personen ( vorname, nachname, gebdat) values ( :vorname, :nachname, :gebdat ) MATCHING ( vorname, gebdat) RETURNING id;'; for i := 0 to sl.Count -1 do begin slf.DelimitedText := sl[i]; IBQuery.Params[0].Value := slf[0]; IBQuery.Params[1].Value := slf[1]; IBQuery.Params[2].Value := slf[2]; IBQuery.ExecSQL; id := IBQuery.Params[3].Value; //oder id := IBQuery.ParamByName('RET_ID').Value; ... end; finally slf.Free; sl.Free; ... end; |
AW: Datensätze schnell einfügen bzw. ersetzen
Hallo Markus,
bei mir klemmt es immer noch... Kann evtl. jemand Anderes das mal testen? Grüße, Ulfert Zitat:
|
AW: Datensätze schnell einfügen bzw. ersetzen
Wo klemmt es den genau?
|
AW: Datensätze schnell einfügen bzw. ersetzen
Liste der Anhänge anzeigen (Anzahl: 4)
Ich habe es jetzt mal getestet, so funktioniert es in dem Testprogramm ( UniDAC statt IBDAC; aber UniDAC verwendet ja den IBDAC-Provider)
Delphi-Quellcode:
var
sL, slF: TStrings; i, id: Integer; begin try sl := TStringlist.Create; slf := TStringList.Create; slf.Delimiter := ';'; sl.add( 'Susi;Mueller;01.01.1900'); sl.add( 'Peter;Mueller;01.01.1990'); sl.add( 'Susi;Mueller;24.12.1974'); sl.add( 'Susi;Maier;01.01.1900'); IBQuery.SQL.Text := 'update or insert into Person ( vorname, nachname, gebdat) values ( :vorname, :nachname, :gebdat ) MATCHING ( vorname, gebdat) RETURNING id;'; for i := 0 to sl.Count -1 do begin slf.DelimitedText := sl[i]; IBQuery.Params[0].Value := slf[0]; IBQuery.Params[1].Value := slf[1]; IBQuery.Params[2].asString := slf[2]; IBQuery.ExecSQL; id := IBQuery.Params[3].Value; //oder id := IBQuery.ParamByName('RET_ID').Value; UniQuery1.Refresh; Application.ProcessMessages; ShowMessage( Format( 'Rückgabe: %d', [id])); end; finally slf.Free; sl.Free; end; end; |
AW: Datensätze schnell einfügen bzw. ersetzen
Moin,
jetzt funzt es bei mir auch. Ich glaube, ich sollte öfter mal den Rechner neu starten. Ich habe ohnehin das Gefühl, dass Firebird sehr empfindlich auf Energiesparmodi ist. Danke, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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