Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit MERGE Befehl (https://www.delphipraxis.net/152873-problem-mit-merge-befehl.html)

s.h.a.r.k 10. Jul 2010 13:35

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:
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')
Das folgt als Resultat (hab die Zeilen des Querys durchnummeriert):
SQL-Code:
 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:
Ich hab schon keine Ahnung was alles ausprobiert und komme einfach nicht auf eine funktionierende Lösung...

DeddyH 10. Jul 2010 13:46

AW: Problem mit MERGE Befehl
 
Was passiert denn, wenn Du die Anführungszeichen weglässt?

s.h.a.r.k 10. Jul 2010 13:57

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:

DeddyH 10. Jul 2010 14:05

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.

s.h.a.r.k 10. Jul 2010 14:08

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...

DeddyH 10. Jul 2010 14:13

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 diesen Tipp zu Deinem Problem konnte ich auf die Schnelle übrigens auch nicht finden.

s.h.a.r.k 10. Jul 2010 14:41

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.

s.h.a.r.k 10. Jul 2010 15:42

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:
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);
Und das hier nicht:
SQL-Code:
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);
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?!

s.h.a.r.k 12. Jul 2010 19:58

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:

Zitat von http://youngcow.net/doc/oracle10g/server.102/b14200/statements_9016.htm
You cannot update a column that is referenced in the ON condition clause.



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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