2

fouras という名前の MySQL データベース内にテーブル名を提供しています。

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)

ここで、オファーの有効期限が切れているかどうか (end_date > 今日) を定期的に確認したいので、MySQL のスケジュールされたイベントを使用しようとしています。

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;

しかし、このイベントを追加しようとすると、MySQL はエラーをスローします。

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
4

2 に答える 2

0

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

区切り文字の問題が見つかりました。

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

変更されたものは次のeventとおりです。

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 ;

MySQL で区切り記号を学ぶ


注:という名前の変数も使用しましたfinished

where finished は、カーソルが結果セットの最後に到達したことを示す変数です。ハンドラーの宣言は、ストアド プログラム内の変数とカーソルの宣言の後に指定する必要があることに注意してください。


次の図は、MySQL カーソルがどのように機能するかを示しています。

ここに画像の説明を入力

于 2016-03-24T03:12:37.113 に答える
0

エラーは区切り文字に関するものでした。このチュートリアルは私を大いに助けてくれました

于 2016-03-23T20:34:24.397 に答える