Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit SQL und Parametern (https://www.delphipraxis.net/185038-problem-mit-sql-und-parametern.html)

SvB 10. Mai 2015 09:59

Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC XE7

Problem mit SQL und Parametern
 
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?

jobo 10. Mai 2015 12:10

AW: Problem mit SQL und Parametern
 
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?

SvB 10. Mai 2015 12:39

AW: Problem mit SQL und Parametern
 
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.

DeddyH 10. Mai 2015 13:50

AW: Problem mit SQL und Parametern
 
Funktioniert es denn mit UPDATE OR INSERT INTO?

jobo 10. Mai 2015 14:02

AW: Problem mit SQL und Parametern
 
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.

SvB 11. Mai 2015 08:13

AW: Problem mit SQL und Parametern
 
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.

himitsu 11. Mai 2015 08:34

AW: Problem mit SQL und Parametern
 
Ja, beim
SQL-Code:
INSERT INTO (...) VALUES (...)
nicht, aber beim SELECT vom
SQL-Code:
INSERT INTO (...) SELECT ...
geht ein WHERE. :angle2:

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)

SvB 11. Mai 2015 09:06

AW: Problem mit SQL und Parametern
 
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)


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