AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit SQL und Parametern

Ein Thema von SvB · begonnen am 10. Mai 2015 · letzter Beitrag vom 11. Mai 2015
Antwort Antwort
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Problem mit SQL und Parametern

  Alt 10. Mai 2015, 10:59
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC XE7
Moin, ich beschäftige mich gerade mit Firebird und hänge an einem SQL Befehl und kommt nicht weiter. Laut Recherche im Web sollte das aber möglich sein.
Code:
MERGE INTO Tabelle1 T1
    USING (SELECT :MOD_FIRMA MOD_FIRMA, :MOD_NR MOD_NR from RDB$DATABASE) M1 
    ON M1.MOD_FIRMA = T1.MOD_FIRMA and M1.MOD_NR = T1.MOD_NR
    WHEN NOT MATCHED THEN
    INSERT (MOD_FIRMA, MOD_NR) values (M1.MOD_FIRMA, M1.MOD_NR)
Das setzen der Parameter mache ich wie folgt:
Delphi-Quellcode:
  qry.ParamByName('MOD_FIRMA').AsString := 'Test';
  qry.ParamByName('MOD_NR').AsString := 'Test';
  qry.ExecSQL;
Ich bekomme dann zur Laufzeit folgenden Fehler:
Code:
[FireDAC][Phys][FB]Dynamic SQL Error SQL error code = -804 Data type unknown
Ich habe auch schon probiert den Datentyp der Parameter zu setzten
Delphi-Quellcode:
    qryImp.ParamByName('MOD_FIRMA').DataType := ftString;
    qryImp.ParamByName('MOD_FIRMA').AsString := 'Test';
    qryImp.ParamByName('MOD_NR').DataType := ftString;
    qryImp.ParamByName('MOD_NR').AsString := 'Test';
es kommt aber immer noch der selbe Fehler.

Hat jemand eine Idee an was es liegen könnte?
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Problem mit SQL und Parametern

  Alt 10. Mai 2015, 13:10
Du erzeugst ein viruelles Wertepaar über Deine Parameter. Die Parameter sind allerdings nicht typisiert, das könnte ein Teil des Problems sein.
Dann ist mir nicht wirklich klar, was Du mit dem gesamten Statement erreichen willst, insbesondere da die genutzte Datenquelle ein "Einzeiler" aus dem Client ist. Dieser Statementtyp ist m.E. sehr gut geeignet, um Tabellen innerhalb der DB massenhaft anzureichern / zu ändern, gespeisst aus anderen Tabellendaten. Die Parametrierung wird dabei dann nur als Einschränkung verwendet, nicht als Datenquelle.

Würde hier nicht ein simples insert reichen?
Gruß, Jo
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Problem mit SQL und Parametern

  Alt 10. Mai 2015, 13:39
Ich bekomme mehrere Textdateien als Stammdaten geliefert und muss diese in eine Tabelle einfügen. Es kann dabei sein, dass Datensätze in den Textdateien doppelt vorhanden sind. Diese sollen nicht doppelt in die Tabelle geschrieben werden. Bei meiner Suche nach einer Lösung bin ich auf das MERGE gestoßen und habe es als eine geeignete Methode gesehen mein Problem zu lösen, ohne dass ich beim Importieren vorher immer abfragen muss, ob ein Datensatz schon vorhanden ist. Ich habe mir im Web mehrere Infos angesehen, z.B. das hier (Devart SQLERROR -804 Data Type unknown) oder das hier.
Ich habe es auch schon mit einem CAST probiert:
Code:
USING (SELECT CAST(:MOD_FIRMA AS VARCHAR) AS MOD_FIRMA, CAST(:MOD_NR AS VARCHAR) AS MOD_NR FROM RDB$DATABASE) AS M1
Da bekomme ich aber eine Fehler "Token unknown )" Das ")" ist das von "VARCHAR)".
Wenn ich die Werte fest in den SQL einbaue, dann funktioniert es. Eleganter hätte ich es gerne über die Parameter gemacht.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Problem mit SQL und Parametern

  Alt 10. Mai 2015, 14:50
Funktioniert es denn mit UPDATE OR INSERT INTO?
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
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Problem mit SQL und Parametern

  Alt 10. Mai 2015, 15:02
Versuch mal statt des Cast eine Funktion mit Textresult, also z.B. Trim oder so, die dem Inhalt nichts tut.
Wieso nicht mit Insert .. where not exists?
oder
where (zielval1, zielval2) not in (param1, param2) ?

Ich weiß allerdings nicht, ob fb die 2. Notation kennt.
Gruß, Jo
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Problem mit SQL und Parametern

  Alt 11. Mai 2015, 09:13
Guten Morgen,

mit "UPDATE OR INSERT" funktioniert es mit den Parametern.

mit TRIM kommt der selbe Fehler. Ein "WHERE NOT EXISTS" scheint es bei Firebird mit "INSERT" nicht zu geben. Ich hab jedenfalls keine Infos dazu gefunden und alle Tests haben fehlgeschlagen.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

AW: Problem mit SQL und Parametern

  Alt 11. Mai 2015, 09:34
Ja, beim INSERT INTO (...) VALUES (...) nicht, aber beim SELECT vom INSERT INTO (...) SELECT ... geht ein WHERE.

SQL-Code:
INSERT (MOD_FIRMA, MOD_NR) SELECT CAST(:MOD_FIRMA AS VARCHAR), CAST(:MOD_NR AS INTEGER) -- eventuell auch ohne CAST
  WHERE NOT EXISTS(SELECT true FROM Tabelle1 WHERE MOD_FIRMA = MOD_FIRMA AND MOD_NR = :MOD_NR)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Problem mit SQL und Parametern

  Alt 11. Mai 2015, 10:06
Danke @himitsu,

mit kleinen Änderungen funktioniert es so:
SQL-Code:
INSERT INTO Tabelle1 (MOD_FIRMA, MOD_NR)
    SELECT :MOD_FIRMA, :MOD_NR FROM RDB$DATABASE WHERE NOT EXISTS(SELECT ID FROM Tabelle1 WHERE MOD_FIRMA=:MOD_FIRMA AND MOD_NR=:MOD_NR)
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.

Geändert von SvB (11. Mai 2015 um 10:10 Uhr)
  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 00:27 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