im mysqlscript feldwert abfragen
der henry
- mysql
Hallo,
ich möchte in einem mysqlscript abfragen ob ein bestimmter Wert im Feld steht, wenn nein, Script beenden. Tabelle parameter, spalte stoparchiv ... es gibt nur eine Zeile in der Tabelle.
So habe ich es versucht, geht aber nicht ... syntaxfehler
IF ((SELECT stoparchiv FROM parameter) == 1)
THEN
exit;
END IF;
Ich dachte, das kann doch kein Problem sein 😅😅😅
Hallo
ich möchte in einem mysqlscript abfragen ob ein bestimmter Wert im Feld steht, wenn nein, Script beenden.
So habe ich es versucht, geht aber nicht ... syntaxfehler
Mir wäre nicht bekannt, dass MySQL das doppelte Gleichheitszeichen für Vergleiche heranzöge. Bitte schaue in die Doku, da sind die verfügbaren Vergleichsoperatoren aufgelistet.
Davon abgesehen widerspricht deine Beschreibung der Aufgabe („ein bestimmter Wert im Feld steht, wenn nein, Script beenden“) dem Code, der besagt, dass das Skript verlassen wird, wenn ein bestimmter Wert (hier 1) vorgefunden wird.
IF ((SELECT stoparchiv FROM parameter) == 1) THEN exit; END IF;
Tschö, Auge
Hallo Henry,
Fehler 1 - wie Auge gesagt hat: Der Test auf Gleichheit gelingt mit =. Das == gehört nach C, PHP oder JavaScript. SQL ist kein C-oid.
Hinweis 1 - Hat die Parameter-Tabele genau eine Zeile? Andernfalls gibt's einen Fehler 1242 - Subquery returns more than 1 row.
Hinweis 2 - in C-oiden Sprachen muss eine Bedingung eingeklammert werden. SQL Kontrollbefehle sind nicht C-oid. Sie sind eher wie COBOL. Und genau deshalb gibt's
Fehler 2 - Hatten wir schon, musste ich auch nochmal nachlesen. Per Default ist es so, dass der Client, sobald er ein ; findet, alles was er hat zum Server schickt und ausführen lässt.[1]
In deinem Fall schickt er deshalb
IF (SELECT stoparchiv FROM parameter) = 1
THEN
exit
und der Server beschwert sich über das fehlende END IF.
Lösung: DELIMITER - damit kannst Du das Semikolon durch ein anderes Zeichen oder sogar eine Zeichenfolge ersetzen. Das MariaDB-Handbuch schlägt // vor, aber du könntest auch "RUN" oder "SUPERCALIFRAGILISTICEXPIALIDOCIOUS" verwenden.
DELIMITER SUPERCALIFRAGILISTICEXPIALIDOCIOUS
IF ((SELECT stoparchiv FROM parameter) == 1)
THEN
EXIT;
END IF
SUPERCALIFRAGILISTICEXPIALIDOCIOUS
DELIMITER ;
Und wie Julie Andrews schon wusste: damit geht alles besser 😉
Rolf
Deswegen erwähnte ich COBOL - macht man dort einen Punkt, ist das Statement zu Ende. Auch mitten in einer Kontrollstruktur. Kompatibilität zum Kambrium der IT ist nun mal gruselig ↩︎
Hi,
Fehler 2 - Hatten wir schon, musste ich auch nochmal nachlesen. Per Default ist es so, dass der Client, sobald er ein ; findet, alles was er hat zum Server schickt und ausführen lässt.[^1]
ja, aber das ist schon ne Ewigkeit her
cu,
Andreas a/k/a MudGuard
Hallo,
das mit Delimiter ist schon klar,
IF ((SELECT stoparchiv FROM parameter) = 1)
THEN
EXIT;
END IF;
Diesen Code habe ich nur in ein vorhandenes Script "X" kopiert, um die Ausführung des Event gesteuerten Scriptes "X" zu unterbinden bzw. aus/ein-schalten zu können.
Das Hauptscript hat Delimiter und Delimiter brauche ich ja nur einmal angeben, oder ?
Danke !!
Hallo der henry,
Das Hauptscript hat Delimiter und Delimiter brauche ich ja nur einmal angeben, oder ?
Einmal pro Script, ja.
Rolf
Hallo,
wenn ich diese Anweisungen ausführe, geht es und kommt kein Syntaxfehler.
DELIMITER SUPERCALIFRAGILISTICEXPIALIDOCIOUS
IF ((SELECT stoparchiv FROM parameter) = 1)
THEN
EXIT;
END IF
SUPERCALIFRAGILISTICEXPIALIDOCIOUS
DELIMITER ;
Wenn ich mein „eventscript“ ausführe geht das auch. Wenn ich aber beide kombiniere, d.h.
IF ((SELECT stoparchiv FROM parameter) = 1)
THEN
EXIT;
END IF;
In mein eventscript (mit Delimiter) einfüge, kommt der Syntaxfehler an der Zeile „EXIT;“
Das ist mein Problem … was ich eventuell nicht ausführlich genug geschrieben habe.😉
Danke !!
Hallo Henry,
merkwürdig. Laut Handbuch gibt es gar kein EXIT Statement.
Wenn ich das Handbuch richtig deute, müsste es so gehen:
Create Trigger ...
'trig': Begin
...
Leave trig;
...
End
'trig' ist ein Label, leave braucht eins.
Rolf
Hallo Rolf,
genau so war es, wie du geschrieben hast ... EXIT geht gar nicht, obwohl ich einige Beispiele damit gefunden habe ...warum auch immer.
Übrigens, was für ein MYSQL-Buch kannst du empfehlen ... meins ist von 2002 😅
Danke !!!
Hallo Henry,
ich empfehle die Herstellerdoku.
Das einzige SQL Buch, das ich habe, stammt aus meiner Ausbildung und ist aus den 1980ern.
Rolf
Hallo Henry,
EXIT geht gar nicht, obwohl ich einige Beispiele damit gefunden habe .
Gerade mal gesucht - auf dbcode.io (eine Datenbank-Schnittstelle um in VS-Code man schnell DB-Abfragen zu machen) wird für EXIT behauptet, dass man damit beispielsweise in PL/SQL (Oracle) oder T-SQL (Microsoft) eine Schleife oder eine Subroutine beenden könne.
Das ist zu 25% richtig. T-SQL kennt gar kein EXIT (-50%) und Oracle kennt laut Oracle-Doku EXIT nur zum Verlassen von Schleifen (-25%).
Soviel zum Thema "Beispiele aus dem Internet". Die Herstellerdoku ist die Wahrheit, alles andere ist nicht vertrauenswürdig.
ChatGPT behauptet immerhin zu wissen, dass es keinen einzigen SQL Dialekt gibt, in dem EXIT die Prozedur verlässt. Immer nur Schleifen. Nicht in MySQL, da heißt es in beiden Fällen LEAVE.
Ich bin da allerdings nicht GANZ sicher, kann es aber auch nicht prüfen. Angeblich kann EXIT label in Postgre SQL einen belabelten BEGIN-END Block verlassen, und falls es möglich ist, den BEGIN-END Block, der eine Prozedur enthält, mit einem Label zu versehen, könnte man auf diese Weise eine Prozedur verlassen. Das ist aber nicht der vorgesehene Weg, eigentlich nimmt man in Postgre dafür das RETURN Statement. Sagt die Doku.
Rolf