Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Mysql Feldname ändern (https://www.delphipraxis.net/190822-mysql-feldname-aendern.html)

hajo2016 10. Nov 2016 23:19

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?!

Ghostwalker 10. Nov 2016 23:29

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

himitsu 11. Nov 2016 02:42

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:
CONCAT('UPDATE ', tableName, ' SET vldat = ' + CONCAT(vordat, ' 06:00:00') + ' + INTERVAL (@serial:=@serial+2) MINUTE where vordat = ', mdatum )
ergibt
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

hajo2016 11. Nov 2016 18:44

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!

blawen 11. Nov 2016 23:27

AW: Mysql Feldname ändern
 
Zitat:

Zitat von hajo2016 (Beitrag 1353400)
Doch noch ein paar ''' vergessen?

Versuche es mal mit folgender Variante ("Wert")
Code:
UPDATE vorlage.artikel_vorlage SET vordat = "2016-10-06";
bzw.
Code:
mdat1:="2016-11-11";

hajo2016 12. Nov 2016 01:20

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.

hajo2016 12. Nov 2016 03:02

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.

nahpets 12. Nov 2016 09:50

AW: Mysql Feldname ändern
 
Wenn Du den Fehler, den Du hier (wie selbstverständlich)
Zitat:

Zitat von hajo2016 (Beitrag 1353423)
SET vldat = '+Quotedstr(mdat2)+'

behebst, auch in der StoredProc behebst, sollte diese funktionieren.

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:
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
um Feld1 herum.

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;

hajo2016 13. Nov 2016 02:46

AW: Mysql Feldname ändern
 
ich hab's noch mal so probiert
Code:
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;
Fehlermeldung: You have an error in your SQL syntax, check.... to use near ''2016-10-11'' at line 1.

genauso wenn ich für Quotedstr(madt1) -> #39+mdat1+#39 oder '"'+mdat1+'"' einsetze

nahpets 13. Nov 2016 10:24

AW: Mysql Feldname ändern
 
Schau Dir bitte mal genau an, was für eine Zeichenfolge hierbei
Delphi-Quellcode:
+ CONCAT('+feld2+', ' 06:00:00') +
herauskommt.

Wenn also
Delphi-Quellcode:
StoredProc_VLDAT_Interval2.Params[1].Value := Quotedstr(mdat1);
mit dem obigen zusammengefügt wird, kommt da niemals eine gültige Zeichenfolge für ein SQL-Statement heraus.
SQL-Code:
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
(Hab' kein MySQL zur Verfügung, so dass ich nicht prüfen kann, ob ich hier jetzt irgendwo Syntaxfehler eingebaut habe.)

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 16:29 Uhr.
Seite 1 von 2  1 2      

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