![]() |
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:
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.
ID
==== 1 3 4 6 8 10 12 13 15 Folgendes habe ich schon probiert:
SQL-Code:
Hier läuft sich die Abfrage tot.
UPDATE T SET XYZ='Test' WHERE EXISTS (SELECT 1 FROM MYPROC(1234) MP WHERE T.NUMMER=MP.ID);
SQL-Code:
Hier bekomme ich ein Unknown Statement "FOR".
FOR SELECT ID FROM MYPROC(1002) MP INTO ID AS CURSOR C DO UPDATE T SET XYZ='Test' WHERE CURRENT OF C
SQL-Code:
Hier bekomme ich einen Deadlock.
MERGE INTO T USING (SELECT ID FROM MYPROC(1234)) MP ON MP.ID=T.NUMMER WHEN MATCHED THEN UPDATE SET T.XYZ='Test';
Das sind so die Beispiele, die ich im Netz finden konnte. Und nu seh ich nur noch :?: Grüße Cody |
AW: UPDATE mit WHERE und JOIN
SQL-Code:
UPDATE T set XYT='TEST' where T.NUMMER in
(SELECT ID FROM MYPROC(1234)); |
AW: UPDATE mit WHERE und JOIN
Zitat:
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. |
AW: UPDATE mit WHERE und JOIN
Was macht die Stored Procedure? Greift die möglicherweise auf die selbe Tabelle zu?
|
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; |
AW: UPDATE mit WHERE und JOIN
Vielleicht spuckt die Proc auch die gleichen ID mehrfach aus. Entweder Algo prüfen oder umstellen auf
Code:
Ich weiß nicht, ob fb das kann, aber vielleicht wird auch in der Proc explizit mit Transaktionen / Savepoints gearbeitet, wäre auch ein Killerfaktor.
select distinct id from myproc(123);
|
AW: UPDATE mit WHERE und JOIN
Zitat:
Bei FireBird laufen (architekturbedingt) auch Selects innerhalb von Transaktionen. |
AW: UPDATE mit WHERE und JOIN
Problem geklärt. Es liegt tatsächlich an Triggern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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