Event und Routinen in phpmyadmin

User_18

Benutzer
Beiträge
11
Hallo.
Zuerst einmal grundlegende Informationen. Ich habe eine Datenbank die ich mithilfe von phpmyadmin verwalte. Außerdem erstelle ich alle Triggers,Routinen,Events direkt in phpmyadmin.

Dazu habe ich nun folgende Problemstellung: Ich habe einen funktionierenden Trigger, der Daten in eine Tabelle speichert. Dazu habe ich eine Routine und ein Event erstellt. Und hier mein Problem. Das Event und die Routine funktionieren aber nicht und ich kann mir nicht erklären warum. Die Häufigste Meldung die ich erhalte ist folgende: # MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). Das Event soll jede Sekunde die Routine aufrufen.

Event:
DROP EVENT `Timerprobe`//
CREATE EVENT `Timerprobe` ON SCHEDULE EVERY 1 SECOND STARTS '2013-02-14 16:12:02' ON COMPLETION NOT PRESERVE ENABLE DO CALL check_timer()
Routine:

DROP PROCEDURE `check_timer`//# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).
CREATE DEFINER=`###########`#`#` PROCEDURE `check_timer`()
BEGIN
DECLARE var_timer_id INT;
SELECT timer_id INTO var_timer_id FROM timer;
IF timer.endtime < now() THEN
UPDATE ##########.timer SET timer.finished = 1 WHERE timer.timer_id = var_timer_id LIMIT 1;
END IF;
END
# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).

Andere Frage: Kann man Zeiten vergleichen so wie ich das mache: IF timer.endtime < now()THEN
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo.
Zuerst einmal grundlegende Informationen. Ich habe eine Datenbank die ich mithilfe von phpmyadmin verwalte. Außerdem erstelle ich alle Triggers,Routinen,Events direkt in phpmyadmin.

Dazu habe ich nun folgende Problemstellung: Ich habe einen funktionierenden Trigger, der Daten in eine Tabelle speichert. Dazu habe ich eine Routine und ein Event erstellt. Und hier mein Problem. Das Event und die Routine funktionieren aber nicht und ich kann mir nicht erklären warum. Die Häufigste Meldung die ich erhalte ist folgende: # MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen). Das Event soll jede Sekunde die Routine aufrufen.

Deine Logig bleibt meinem Hirn noch verschlossen. Du prüfst offenbar, ob ein Feld in einer Tabelle, welches ein TIMESTAMP ist, noch kleiner als die aktuelle Zeit ist. Falls ja, setzt Du finished auf 1.

Warum muß das aller Sekunde erfolgen? Kann man doch bequem dann ermitteln, wenn man es braucht, oder?

Zum Code:

  • select ohne where-Condition. Skaliert nur für einen Datensatz.
  • die Variable time.endtime im IF ... THEN dürfte undefiniert sein (kenne mich mit MySQL-Programmierung nicht aus)

Andreas
 

User_18

Benutzer
Beiträge
11
Also timer.endtime hat den Datentyp "time". Diese Zeit soll mit der aktuellen Zeit verglichen werden. Das muss nicht jede Sekunde passieren. Es soll nur in einem Bestimmten Interval überprüft werden. Wenn dann die jetzige Zeit größer ist als die vorgegebene Endzeit dann soll finished auf 1 gesetzt werden. Im Endeffekt soll eine SMS geschickt werden, wenn die Endzeit überschritten worden ist. Vielleicht muss man das ja nicht so machen wie ich mir das vorstelle. Ich bin auch für Lösungsvorschläge in andere Richtungen offen.
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Also timer.endtime hat den Datentyp "time". Diese Zeit soll mit der aktuellen Zeit verglichen werden. Das muss nicht jede Sekunde passieren. Es soll nur in einem Bestimmten Interval überprüft werden. Wenn dann die jetzige Zeit größer ist als die vorgegebene Endzeit dann soll finished auf 1 gesetzt werden. Im Endeffekt soll eine SMS geschickt werden, wenn die Endzeit überschritten worden ist. Vielleicht muss man das ja nicht so machen wie ich mir das vorstelle. Ich bin auch für Lösungsvorschläge in andere Richtungen offen.


Ah so.

Hrm. Da mußt ja noch dann den SMS-Versand auslösen.

Das hier:
Code:
[COLOR=#000000][FONT=Calibri]DECLARE var_timer_id INT;[/FONT][/COLOR]
[COLOR=#000000][FONT=Calibri]SELECT timer_id INTO var_timer_id FROM timer;[/FONT][/COLOR]
[FONT=Calibri][COLOR=#000000]IF timer.endtime < now() THEN[/COLOR][/FONT]
[COLOR=#000000][FONT=Calibri]UPDATE ##########.timer SET timer.finished = 1 WHERE timer.timer_id = var_timer_id LIMIT 1;[/FONT][/COLOR]

sieht mir aber komisch aus. Ich würde nicht damit rechnen, daß eine nicht zugewiesene Variable timer.endtime so funktioniert. Dein Select liefert zwischen NULL und $SEHR_VIELEN Records, ich würde nicht drauf vertrauen, daß da immer nur ein Datensatz in der Tabelle timer ist. Und wenn doch, dann brauchst weder das Select noch das LIMIT 1 und auch nicht das WHERE.

Andreas
 

User_18

Benutzer
Beiträge
11
Okay danke für die schnelle Antwort. Nun stellt sich mir aber die Frage, wie du eine nicht zugewiesene Variable definierst. Bzw. wie man das Problem behebt (Variable zuweisen).
 

User_18

Benutzer
Beiträge
11
Bei der anderen dachte ich, schreibe ich die Tabelle davor. z.B (timer.endtime oder timer.finished). Anders ausgedrückt. Die andere Variable sollte den Wert aus der timer Tabelle annehmen.
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Bei der anderen dachte ich, schreibe ich die Tabelle davor. z.B (timer.endtime oder timer.finished). Anders ausgedrückt. Die andere Variable sollte den Wert aus der timer Tabelle annehmen.

Ich bin mir nicht sicher, ob das funktioniert. Angenommen, da sind 3 Zeilen in der Tabelle, mit Werten von X, Y und Z. Frage: welcher soll genommen werden?

Andreas
 
Werbung:
Oben