2016-03-23 11 views
2

Ich habe eine Tabelle Namen in einer MySQL-Datenbank bieten namens fouras:ein geplantes Ereignis in MySQL erstellen

mysql> desc offer; 
+------------------------+---------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+------------------------+---------------+------+-----+---------+----------------+ 
| id      | bigint(20) | NO | PRI | NULL | auto_increment | 
| description   | varchar(5000) | NO |  | NULL |    | 
| end_date    | date   | NO |  | NULL |    | 
| is_accepted   | bit(1)  | NO |  | NULL |    | 
| is_active    | bit(1)  | NO |  | NULL |    | 
| is_draft    | bit(1)  | NO |  | NULL |    | 
| is_processed   | bit(1)  | NO |  | NULL |    | 
| is_removed    | bit(1)  | NO |  | NULL |    | 
| max_reservation_number | int(11)  | NO |  | NULL |    | 
| promotion_first_param | varchar(255) | YES |  | NULL |    | 
| promotion_product  | varchar(255) | YES |  | NULL |    | 
| promotion_second_param | varchar(255) | YES |  | NULL |    | 
| promotion_type   | varchar(255) | NO |  | NULL |    | 
| publish_date   | date   | YES |  | NULL |    | 
| remove_time_stamp  | bigint(20) | YES |  | NULL |    | 
| start_date    | date   | NO |  | NULL |    | 
| title     | varchar(255) | NO |  | NULL |    | 
| views_number   | int(11)  | YES |  | NULL |    | 
| local_business   | bigint(20) | YES | MUL | NULL |    | 
+------------------------+---------------+------+-----+---------+----------------+ 
19 rows in set (0.00 sec) 

Nun, wenn ein Angebot abgelaufen ist (end_date> heute) in regelmäßigen Abständen überprüfen, ich will, für das i sind versucht, ein MySQL geplantes Ereignis zu verwenden:

CREATE EVENT IF NOT EXISTS check_expired_offers 
    ON SCHEDULE EVERY 10 MINUTE 
    DO 
     BEGIN 
      DECLARE id INT; 
      DECLARE end_date DATE; 
      DECLARE offer_cursor CURSOR FOR SELECT id, end_date FROM fouras.offer; 

      OPEN offer_sursor; 
      offer_loop: LOOP 
       FETCH offer_cursor into id, end_date; 
       IF end_date < NOW() THEN 
        UPDATE fouras.offer set is_active = false; 
       END IF; 

      END LOOP 
END; 

Aber MySQL wirft einen Fehler, wenn ich versuche, dieses Ereignis hinzuzufügen:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5 0,127 sec 
+0

haben Sie möglicherweise das Trennzeichen? wenn nicht, dann wird das ';' in 'decide id int' den gesamten' create' Aufruf terminieren, nicht nur die eine Zeile –

+0

ich entfernte die **; ** und die meisten Fehler verschwanden aber immer noch ein Fehler in der Nähe von ** DECLARE end_date DATE ** – jemlifathi

+0

benötigen Sie noch ';', um die einzelnen Anweisungen zu begrenzen. Ändern Sie einfach das Haupttrennzeichen, bevor Sie den Erstellungsaufruf starten, z. 'DELIMITER $$ CREATE blah blahblah ENDE; DELIMITER; ' –

Antwort

0

==========================

gefunden Begrenzer Problem.

==========================

Hier ist die event geändert:

delimiter $$ 
CREATE EVENT IF NOT EXISTS check_expired_offers 
    ON SCHEDULE EVERY 10 MINUTE 
    DO 
     BEGIN 
      DECLARE finished INTEGER DEFAULT 0; 
      DECLARE id INT; 
      DECLARE end_date DATE; 
      DECLARE offer_cursor CURSOR FOR SELECT id, end_date FROM fouras.offer; 
         DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

      OPEN offer_cursor; 
      offer_loop: 
         LOOP 
       FETCH offer_cursor into id, end_date; 
       IF finished = 1 THEN 
            LEAVE offer_loop; 
           END IF; 
           IF end_date < NOW() THEN 
        UPDATE fouras.offer set is_active = false; 
       END IF; 

      END LOOP ; 
END $$ 
delimiter; 

Learn delimiters in MySQL


Hinweis: Ich habe auch eine Variable namens finished verwendet.

Wo beendet ist eine Variable, um anzuzeigen, dass der Cursor das Ende der Ergebnismenge erreicht hat. Beachten Sie, dass die Handler-Deklaration nach der Variablen- und Cursor-Deklaration in den gespeicherten Programmen erscheinen muss.


Das folgende Diagramm zeigt, wie der MySQL-Cursor funktioniert.

enter image description here