AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mysql Feldname ändern

Ein Thema von hajo2016 · begonnen am 10. Nov 2016 · letzter Beitrag vom 13. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
hajo2016

Registriert seit: 10. Nov 2016
Ort: Bad Harzburg
6 Beiträge
 
Delphi XE8 Professional
 
#1

Mysql Feldname ändern

  Alt 10. Nov 2016, 23:19
Datenbank: Mysql • Version: 6.3 • Zugriff über: FireDac
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?!
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Mysql Feldname ändern

  Alt 10. Nov 2016, 23:29
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."
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Mysql Feldname ändern

  Alt 11. Nov 2016, 02:42
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

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hajo2016

Registriert seit: 10. Nov 2016
Ort: Bad Harzburg
6 Beiträge
 
Delphi XE8 Professional
 
#4

AW: Mysql Feldname ändern

  Alt 11. Nov 2016, 18:44
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!
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
654 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mysql Feldname ändern

  Alt 11. Nov 2016, 23:27
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";
Roland

Geändert von blawen (11. Nov 2016 um 23:32 Uhr)
  Mit Zitat antworten Zitat
hajo2016

Registriert seit: 10. Nov 2016
Ort: Bad Harzburg
6 Beiträge
 
Delphi XE8 Professional
 
#6

AW: Mysql Feldname ändern

  Alt 12. Nov 2016, 01:20
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.
  Mit Zitat antworten Zitat
hajo2016

Registriert seit: 10. Nov 2016
Ort: Bad Harzburg
6 Beiträge
 
Delphi XE8 Professional
 
#7

AW: Mysql Feldname ändern

  Alt 12. Nov 2016, 03:02
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Mysql Feldname ändern

  Alt 12. Nov 2016, 09:50
Wenn Du den Fehler, den Du hier (wie selbstverständlich)
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;
  Mit Zitat antworten Zitat
hajo2016

Registriert seit: 10. Nov 2016
Ort: Bad Harzburg
6 Beiträge
 
Delphi XE8 Professional
 
#9

AW: Mysql Feldname ändern

  Alt 13. Nov 2016, 02:46
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Mysql Feldname ändern

  Alt 13. Nov 2016, 10:24
Schau Dir bitte mal genau an, was für eine Zeichenfolge hierbei + CONCAT('+feld2+', ' 06:00:00') + herauskommt.

Wenn also 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;

Geändert von nahpets (13. Nov 2016 um 23:51 Uhr) Grund: Fehler in sSQL behoben
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 20:14 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