![]() |
Datenbank: Mysql • Version: 6.3 • Zugriff über: FireDac
Mysql Feldname ändern
Hallo zusammen,
ich übernehme Dbase Tabellen in eine Mysql Datenbank. Im Projekt spreche ich ein storedProcedur an: CREATE DEFINER=`root`@`%` PROCEDURE `VLDAT_INTERVAL`(tableName varchar(255), mdatum varchar(12)) BEGIN set @serial:=0; set @sqlstmt := CONCAT('UPDATE ', tableName, ' SET vldat = ' + CONCAT(vordat, ' 06:00:00') + ' + INTERVAL (@serial:=@serial+2) MINUTE where vordat = ', mdatum ); PREPARE stmt FROM @sqlstmt; EXECUTE stmt; END mit der Spalte 'vordat' gibt es aber Probleme (anderer Spaltenname alles ok). Fehlermeldung: 'Das Feld vordat ist nicht vorhanden'. Ich versuche nun krampfhaft bei der Datenmigration von Dbase nach Mysql, nach dem Batchmove, die Spalte vordat in vrdat umzubenennen. Anweisung: cs := TStringList.Create; cs.Add('ALTER TABLE BL_Vorlage'); cs.Add('CHANGE VORDAT VRDAT DATE NULL'); FDCommand2.CommandText := cs; FDCommand2.Execute; Leider ohne Erfolg (liegt wohl auch hier an dem Spaltennamen). Auch der Versuch die Dbase-Tabelle vor dem Batchmove zu verändern: Query1.SQL.Clear; Query1.SQL.ADD('ALTER TABLE BL_Vorlage RENAME COLUMN VORDAT to VRDAT'); Query1.ExecSQL; schlägt fehl. (Ich bin mir auch nicht sicher ob die Dbase-Anweisung richtig ist! Habe aber schon all möglichen Schreibweisen probiert) Hat jemand eine Idee, wie ich die Feldänderung realisieren kann?! |
AW: Mysql Feldname ändern
ok...bin kein SQL-Fachmann.
Aber was mir an der StoredProcedure auffällt ist, das vordat nirgends übergeben wird oder gelesen wird. Von daher wärs logisch, das er sagt, "Ich kenn das nicht." |
AW: Mysql Feldname ändern
Jupp, ich denke auch, dass mysql hier diese "unbekannte Konstante" mit ihrem namen einbindet, da es "vordat" nicht kennt.
Und zusätzlich wurden auch paar andere Dinge vergessen, wie z.B. noch ein paar ' ' , um die "Datumsstrings" drumrum, denn
SQL-Code:
ergibt
CONCAT('UPDATE ', tableName, ' SET vldat = ' + CONCAT(vordat, ' 06:00:00') + ' + INTERVAL (@serial:=@serial+2) MINUTE where vordat = ', mdatum )
SQL-Code:
tableName = 'mytable'
mdatum = '01.01.1000' vordat = 'VORDAT' UPDATE mytable SET vldat = VORDAT 06:00:00 + INTERVAL (@serial:=@serial+2) MINUTE where vordat = 01.01.1000 |
AW: Mysql Feldname ändern
Hallo,
danke für Eure Hinweise! Ich arbeite hier mit 6 Tabellen gleicher struktur in denen die Daten hin und hergeschoben werden. Daher war die Feldstruktur bekannt. Gestestet habe ich in der Workbench: set @serial:=0; UPDATE vorlage.artikel_vorlage SET vordat = '2016-10-06'; UPDATE vorlage.artikel_vorlage SET vldat = CONCAT(vordat, ' 07:00:00') + INTERVAL (@serial:=@serial+2) MINUTE where vordat='2016-10-06'; das Funktioniert nun auch. Um das StoredProc ordentlich zu generieren habe ich folgendes geändert: CREATE DEFINER=`root`@`%` PROCEDURE `VLDAT_INTERVAL`(tableName varchar(255), mdatum varchar(20), feld1 varchar(20), feld2 varchar(20)) BEGIN set @serial:=0; set @sqlstmt := CONCAT('UPDATE ', tableName, ' SET '+feld1+' = ' + CONCAT('+feld2+', ' 06:00:00') + ' + INTERVAL (@serial:=@serial+2) MINUTE where '+feld2+' = ', mdatum ); PREPARE stmt FROM @sqlstmt; EXECUTE stmt; END mdat1:='2016-11-11'; Aufruf mit: StoredProc_VLDAT_Interval.Params[0].Value := 'ag_vorlage'; StoredProc_VLDAT_Interval.Params[1].Value := mdat1; StoredProc_VLDAT_Interval.Params[2].Value := 'vldat'; StoredProc_VLDAT_Interval.Params[3].Value := 'vordat'; StoredProc_VLDAT_Interval.ExecProc; leider bekomme ich den Syntax Fehler: check the ... for the rigth syntax to use near '-11-11' at line 1 Doch noch ein paar ''' vergessen? Ich weiß nur nicht wo ich die noch setzen sollte. Für weitere Hinweise wäre ich dankbar! |
AW: Mysql Feldname ändern
Zitat:
Code:
bzw.
UPDATE vorlage.artikel_vorlage SET vordat = "2016-10-06";
Code:
mdat1:="2016-11-11";
|
AW: Mysql Feldname ändern
Hi blawen,
mdat1:="2016-10-06"; bringt natürlich Syntax-Fehler: [dcc32 Fehler] Unit1.pas(883): E2038 Ungültiges Zeichen in Eingabedatei: '"' (#$22) mdat1:='"2016-10-06"'; analog mdat1:=quotedstr(mdat1); Ausführungsfehler [FireDAC][Phys][MySQL]You have an error in your SQL syntax, check.... to use near '"mdat1"' at line 1. mdat1:=#39+'2016-10-06'+#39 ! übergebener Parameter ''2016-10-06'' eigendlich wär's DAS .... aber -> Ausführungsfehler [FireDAC][Phys][MySQL]You have an error in your SQL syntax, check.... to use near ''2016-10-11'' at line 1. Ich stelle mich wohl zu blöd an. |
AW: Mysql Feldname ändern
so ich hab mich vom StoredProc verabschiedet und den SQL-Befehl im Programm eingebunden:
mdat1:='2016-10-06'; // (mdat1 kommt eigentlich aus einem DBEDIT) mdat2:=mdat1+' 06:00:00'; cs := TStringList.Create; cs.Add('set @serial:=0;'); cs.Add('UPDATE ag_vorlage SET vldat = '+Quotedstr(mdat2)+' + INTERVAL (@serial:=@serial+2) MINUTE WHERE VORDAT='+Quotedstr(mdat1)); FDCommand1.CommandText := cs; FDCommand1.Execute; Funktioniert auch! Wäre aber schon interessant das StoredProc zu nutzen, ist sicher schneller.. Vielleicht habt Ihr ja noch einen Tipp wie ich es hin bekomme. |
AW: Mysql Feldname ändern
Wenn Du den Fehler, den Du hier (wie selbstverständlich)
Zitat:
Du baust in der StoredProc einen String zusammen und dieser String enthält u. a. auch einen String, der muss dann in der StoredProc in ' gesetzt werden. Und diese fehlen hier:
SQL-Code:
um Feld1 herum.
CREATE DEFINER=`root`@`%` PROCEDURE `VLDAT_INTERVAL`(tableName varchar(255), mdatum varchar(20), feld1 varchar(20), feld2 varchar(20))
BEGIN set @serial:=0; set @sqlstmt := CONCAT('UPDATE ', tableName, ' SET '+feld1+' = ' + CONCAT('+feld2+', ' 06:00:00') + ' + INTERVAL (@serial:=@serial+2) MINUTE where '+feld2+' = ', mdatum ); PREPARE stmt FROM @sqlstmt; EXECUTE stmt; END Vermutlich würde aber auch dashier ausreichen:
Delphi-Quellcode:
StoredProc_VLDAT_Interval.Params[0].Value := 'ag_vorlage';
StoredProc_VLDAT_Interval.Params[1].Value := QuotedStr(mdat1); StoredProc_VLDAT_Interval.Params[2].Value := 'vldat'; StoredProc_VLDAT_Interval.Params[3].Value := 'vordat'; StoredProc_VLDAT_Interval.ExecProc; |
AW: Mysql Feldname ändern
ich hab's noch mal so probiert
Code:
Fehlermeldung: You have an error in your SQL syntax, check.... to use near ''2016-10-11'' at line 1.
mdat1:='2016-10-11';
StoredProc_VLDAT_Interval2.Params[0].Value := 'ag_vorlage'; StoredProc_VLDAT_Interval2.Params[1].Value := Quotedstr(mdat1); StoredProc_VLDAT_Interval2.Params[2].Value := 'vldat'; StoredProc_VLDAT_Interval2.Params[3].Value := 'vordat'; StoredProc_VLDAT_Interval2.ExecProc; genauso wenn ich für Quotedstr(madt1) -> #39+mdat1+#39 oder '"'+mdat1+'"' einsetze |
AW: Mysql Feldname ändern
Schau Dir bitte mal genau an, was für eine Zeichenfolge hierbei
Delphi-Quellcode:
herauskommt.
+ CONCAT('+feld2+', ' 06:00:00') +
Wenn also
Delphi-Quellcode:
mit dem obigen zusammengefügt wird, kommt da niemals eine gültige Zeichenfolge für ein SQL-Statement heraus.
StoredProc_VLDAT_Interval2.Params[1].Value := Quotedstr(mdat1);
SQL-Code:
(Hab' kein MySQL zur Verfügung, so dass ich nicht prüfen kann, ob ich hier jetzt irgendwo Syntaxfehler eingebaut habe.)
CREATE DEFINER=`root`@`%` PROCEDURE `VLDAT_INTERVAL`(tableName varchar(255), mdatum varchar(20), feld1 varchar(20), feld2 varchar(20))
BEGIN set @serial:=0; set @sqlstmt := CONCAT('UPDATE ', tableName, ' SET ' + feld1 + ' = ' + feld2 + ' " 06:00:00" INTERVAL (@serial := @serial + 2) MINUTE where ' + feld2 + ' = "' + mdatum + '"'); PREPARE stmt FROM @sqlstmt; EXECUTE stmt; END Wird bei MySQL in der Fehlermeldung nur der Hinweis auf die Fehlerposition ausgegeben, oder enthält die Fehlermeldung eventuell auch das ganze Statement? Wenn ja, poste das hier doch bitte mit, dann lassen sich Syntaxfehler besser erkennen. Alternativ könntest Du auch so vorgehen:
SQL-Code:
CREATE DEFINER=`root`@`%` PROCEDURE `VLDAT_INTERVAL`(v_stmt varchar(4096))
BEGIN set @serial := 0; set @sqlstmt := v_stmt; PREPARE stmt FROM @sqlstmt; EXECUTE stmt; END
Delphi-Quellcode:
var
sSQL : String; begin ... mdat1 := '2016-10-11'; sSQL := Format('UPDATE %s SET %s = %s + %s INTERVAL (@serial := @serial + 2) MINUTE where %s = %s;', ['ag_vorlage', 'vldat', 'vordat', QuotedStr(' 06:00:00'),'vordat', QuotedStr(mdat1)]); StoredProc_VLDAT_Interval2.Params[0].Value := sSQL; StoredProc_VLDAT_Interval2.ExecProc; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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