Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Event und Routinen in phpmyadmin

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von User_18, 18 Februar 2013.

  1. User_18

    User_18 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. User_18

    User_18 Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru


    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
     
  5. User_18

    User_18 Benutzer

    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).
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Du hast doch 2 Variablen, die eine füllst Du via SELECT. Und die andere?

    Andreas
     
  7. User_18

    User_18 Benutzer

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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
     
  9. User_18

    User_18 Benutzer

    Deshalb dachte ich, dass man hier ein WHERE braucht. SELECT timer_id INTO var_timer_id FROM timer;
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ja, denke ich auch. Nur warum nutzt Du da kein WHERE?

    Andreas
     
  11. User_18

    User_18 Benutzer

    Ich habs schon mit dem Where probiert nur ist das auch nicht besser.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden