![]() |
Datenbank: Oracle • Version: 9.x • Zugriff über: AnyDAC
Problem mit MERGE Befehl
Hallo zusammen,
ich versuche gerade folgende Query auszuführen und es klappt und klappt nicht :wall: ich habe echt keine Ahnung mehr wieso. Keine der Spalten sind in einer Art reservierte Wörter, alle Spalten sind gültig und vorhanden.
SQL-Code:
Das folgt als Resultat (hab die Zeilen des Querys durchnummeriert):
MERGE INTO "TdmUser" t1
USING ( SELECT "RefUserID" FROM "TdmUserLogin" WHERE "RefUserID" = -1 ) t2 ON (t1."UserID" = t2."RefUserID") WHEN MATCHED THEN UPDATE SET t1."UserID" = t2."RefUserID" WHEN NOT MATCHED THEN INSERT (t1."Username") VALUES ('Armin')
SQL-Code:
Ich hab schon keine Ahnung was alles ausprobiert und komme einfach nicht auf eine funktionierende Lösung...
Fehler beim Start in Zeile 1 in Befehl:
1: MERGE INTO "TdmUser" t1 2: USING ( 3: SELECT "RefUserID" 4: FROM "TdmUserLogin" 5: WHERE "RefUserID" = -1 6: ) t2 7: 8: ON (t1."UserID" = t2."RefUserID") 9: WHEN MATCHED THEN 10: UPDATE SET t1."UserID" = t2."RefUserID" 11: WHEN NOT MATCHED THEN 12: INSERT (t1."Username") VALUES ('Armin') Fehler bei Befehlszeile:8 Spalte:6 Fehlerbericht: SQL-Fehler: ORA-00904: Ungültiger Spaltenname 00904. 00000 - "%s: invalid identifier" *Cause: *Action: |
AW: Problem mit MERGE Befehl
Was passiert denn, wenn Du die Anführungszeichen weglässt?
|
AW: Problem mit MERGE Befehl
Das wird nicht funktionieren, da ich die Datenbank auch mit Anführungszeichen erstellt habe, da Oracle sonst aus allem Großbuchstaben macht -> sehr unschön, wie ich finde.
Hier aber noch eine Version, bei der es auch nicht klappt:
SQL-Code:
Fehler beim Start in Zeile 1 in Befehl:
1: MERGE INTO testtable t1 2: 3: USING ( 4: SELECT * 5: FROM table1 6: WHERE foo = 'test' 7: ) t2 8: 9: ON (t1.blub = t2.foo) 10: 11: WHEN MATCHED THEN 12: UPDATE SET t1.blub = 'update' 13: 14: WHEN NOT MATCHED THEN 15: INSERT (t1.blub) VALUES ('insert') Fehler bei Befehlszeile:9 Spalte:6 Fehlerbericht: SQL-Fehler: ORA-00904: Ungültiger Spaltenname 00904. 00000 - "%s: invalid identifier" *Cause: *Action: |
AW: Problem mit MERGE Befehl
Die Schreibweise ist aber korrekt? Ich habe mir gerade die Syntax noch einmal direkt bei Oracle angeschaut und kann auf den ersten Blick keinen Fehler entdecken. Übrigens finde ich es ausgesprochen dämlich suboptimal, Felder in Case-sensitiver Schreibweise anzulegen, da man sich somit bewusst eine unnötige Fehlerquelle einbaut.
|
AW: Problem mit MERGE Befehl
Warum die Groß- und Kleinschreibung: Wenn man in einem SQL-Tool aber die Tabellen anschaut kann man es wesentlich besser lesen, als ohne. Nachdem zudem nur ich das Tool programmiere handle ich mir somit eher weniger Probleme ein. Aber in gewisser Weise gebe ich dir da schon recht!
Ich habe gerade auch gesucht, ob man so einen Befehl für einen User sperren kann, nur habe ich bisher nichts gefunden. Zudem sollte dann ja eine andere Fehlermeldung erscheinen. Ich bin im Moment echt überfragt, da ich auch die Query schon zig mal kontrolliert habe. Ebenso habe ich so ziemlich alles mit den reserved Words abgeglichen. Mich :kotz: das gerade ziemlich an, da es einfach nicht weiter geht... |
AW: Problem mit MERGE Befehl
Man kann bei der Abfrage aber auch Aliase vergeben, die sogar Leerzeichen enthalten dürfen, so dass die Lesbarkeit in diesem Zusammenhang kein gewichtiges Argument ist. Mehr als
![]() |
AW: Problem mit MERGE Befehl
Liste der Anhänge anzeigen (Anzahl: 1)
Es muss wirklich an der Query selbst liegen. Ich habe nun nämlich das MERGE-Beispiel von der Oracle-Doku-Seite nachgebaut und das funktioniert einwandfrei -- selbst mit Anführungszeichen. Anbei habe ich mal die SQL-Queries für das Beispiel, falls die mal jemand brauchen sollte.
|
AW: Problem mit MERGE Befehl
Das Problem scheint irgendwie damit zusammenzuhängen, dass bei dem inneren Select (teilweise) eine leer Menge heraus gekommen ist. Wenn ich das MERGE nun so gestalte, dass immer mindestens ein Datensatz in dieser Menge steckt, so funktioniert es.
// edit... Oracle ist ja mal so eine drecks tolle (*hust*) Datenbank. Das hier geht:
SQL-Code:
Und das hier nicht:
MERGE INTO "TdmUser" D
USING ( SELECT * FROM "TdmUser" WHERE "UserID" = 70 OR "UserID" = -1) S ON (D."UserID" = S."UserID" AND D."UserID" <> -1) WHEN MATCHED THEN UPDATE SET D."Username" = 'update' WHEN NOT MATCHED THEN INSERT (D."Username", D."Disabled") VALUES ('inserta', 0);
SQL-Code:
Tja, und jetzt wird es sehr interessant: wo liegt der Unterschied?! Lediglich darin, dass das eine (UserID) ein NUMBER und das andere (Username) ein VARCHAR2-Feld ist. WTF?!
MERGE INTO "TdmUser" D
USING ( SELECT * FROM "TdmUser" WHERE "Username" = 'test' OR "UserID" = -1) S ON (D."Username" = S."Username" AND D."UserID" <> -1) WHEN MATCHED THEN UPDATE SET D."Username" = 'update' WHEN NOT MATCHED THEN INSERT (D."Username", D."Disabled") VALUES ('inserta', 0); |
AW: Problem mit MERGE Befehl
So, ich habe nun endlich das Problem herausgefunden, da ich leider das MERGE unbedingt brauche. Hätte ich die Dokumentation genauer gelesen, so hätte ich gar nicht das Problem gehabt :Wall:
Hier ein Zitat: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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