Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UPDATE mit WHERE und JOIN (https://www.delphipraxis.net/200590-update-mit-where-und-join.html)

Codehunter 6. Mai 2019 07:41

Datenbank: Firebird • Version: 2.5 • Zugriff über: FIBpro

UPDATE mit WHERE und JOIN
 
Hallo!

Ich habe jetzt schon diverse Beispiele im Netz durchexerziert, doch keines davon scheint zu funktionieren (oder ich bin zu doof dazu ^^). Folgendes Problem:

Ich habe eine Stored Procedure MYPROC, welche eine Datenmenge zurückgibt:
SQL-Code:
SELECT ID FROM MYPROC(1234);
Code:
ID
====
1
3
4
6
8
10
12
13
15
Nun habe ich eine Tabelle T, in welcher ich das Feld XYZ updaten muss, wenn das Feld NUMMER einer der Zeilen des obigen Ergebnisses entspricht. Das Ganze soll in einem clientseitigen Query passieren, nicht in einer weiteren StoredProc.

Folgendes habe ich schon probiert:
SQL-Code:
UPDATE T SET XYZ='Test' WHERE EXISTS (SELECT 1 FROM MYPROC(1234) MP WHERE T.NUMMER=MP.ID);
Hier läuft sich die Abfrage tot.

SQL-Code:
FOR SELECT ID FROM MYPROC(1002) MP INTO ID AS CURSOR C DO UPDATE T SET XYZ='Test' WHERE CURRENT OF C
Hier bekomme ich ein Unknown Statement "FOR".

SQL-Code:
MERGE INTO T USING (SELECT ID FROM MYPROC(1234)) MP ON MP.ID=T.NUMMER WHEN MATCHED THEN UPDATE SET T.XYZ='Test';
Hier bekomme ich einen Deadlock.

Das sind so die Beispiele, die ich im Netz finden konnte. Und nu seh ich nur noch :?:

Grüße
Cody

mkinzler 6. Mai 2019 08:05

AW: UPDATE mit WHERE und JOIN
 
SQL-Code:
UPDATE T set XYT='TEST' where T.NUMMER in
  (SELECT ID FROM MYPROC(1234));

Codehunter 6. Mai 2019 09:07

AW: UPDATE mit WHERE und JOIN
 
Zitat:

Zitat von mkinzler (Beitrag 1431621)
SQL-Code:
UPDATE T set XYT='TEST' where T.NUMMER in
  (SELECT ID FROM MYPROC(1234));

Deadlock :cry:

So langsam glaube ich, dass Tabelle T in ihrem ganzen Rattenschwanz an Triggern wiederum einen Select auf sich selbst macht und dadurch der Deadlock entsteht. Das ist dann aber wohl ein Fall für unseren Datenbank-Guru.

mkinzler 6. Mai 2019 09:11

AW: UPDATE mit WHERE und JOIN
 
Was macht die Stored Procedure? Greift die möglicherweise auf die selbe Tabelle zu?

joachimd 6. Mai 2019 09:22

AW: UPDATE mit WHERE und JOIN
 
Du kannst die Ergebnisse evtl auch in eine (temp) Tabelle abkippen und dann von dort selektieren:
Code:
SELECT ID INTO #mytmp FROM MYPROC(1234);
UPDATE T set XYT='TEST' where T.NUMMER in (SELECT ID FROM #mytmp);
DROP TABLE #mytmp;

jobo 6. Mai 2019 09:35

AW: UPDATE mit WHERE und JOIN
 
Vielleicht spuckt die Proc auch die gleichen ID mehrfach aus. Entweder Algo prüfen oder umstellen auf

Code:
select distinct id from myproc(123);
Ich weiß nicht, ob fb das kann, aber vielleicht wird auch in der Proc explizit mit Transaktionen / Savepoints gearbeitet, wäre auch ein Killerfaktor.

mkinzler 6. Mai 2019 09:41

AW: UPDATE mit WHERE und JOIN
 
Zitat:

Vielleicht spuckt die Proc auch die gleichen ID mehrfach aus
Das sollte grundsätzlich kein Problem sein.

Bei FireBird laufen (architekturbedingt) auch Selects innerhalb von Transaktionen.

Codehunter 6. Mai 2019 10:22

AW: UPDATE mit WHERE und JOIN
 
Problem geklärt. Es liegt tatsächlich an Triggern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz