AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit MERGE Befehl
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit MERGE Befehl

Ein Thema von s.h.a.r.k · begonnen am 10. Jul 2010 · letzter Beitrag vom 12. Jul 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Problem mit MERGE Befehl

  Alt 10. Jul 2010, 14:35
Datenbank: Oracle • Version: 9.x • Zugriff über: AnyDAC
Hallo zusammen,

ich versuche gerade folgende Query auszuführen und es klappt und klappt nicht 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...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von mkinzler (10. Jul 2010 um 19:38 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 14:46
Was passiert denn, wenn Du die Anführungszeichen weglässt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 14:57
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:
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von mkinzler (10. Jul 2010 um 19:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 15:05
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 15:08
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 das gerade ziemlich an, da es einfach nicht weiter geht...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 15:13
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 15:41
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.
Angehängte Dateien
Dateityp: txt test_sql.txt (1,8 KB, 0x aufgerufen)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Problem mit MERGE Befehl

  Alt 10. Jul 2010, 16:42
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?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von mkinzler (10. Jul 2010 um 19:39 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

AW: Problem mit MERGE Befehl

  Alt 12. Jul 2010, 20:58
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 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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 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