Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вызов процедуры / 10 сообщений из 10, страница 1 из 1
30.03.2017, 16:04
    #39430292
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Есть процедура, ее нужно вызывать постоянно только по понедельникам, причем в течении понедельника она должна вызываться каждый час. Как такое можно реализовать?
...
Рейтинг: 0 / 0
30.03.2017, 16:21
    #39430314
Бодрый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
yurii.kravets,

Что за процедура, нужно смотреть. Каков размер базы, возможно процедура не успеет отработать за час. Почему именно каждый час?
...
Рейтинг: 0 / 0
30.03.2017, 16:39
    #39430324
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Бодрый, процедура для накрутки лайков. Вызываться подобная процедура будет каждый день, только с разными данными. Вот собственно она

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE `monday` ()  
LANGUAGE SQL  
DETERMINISTIC  
SQL SECURITY DEFINER  
COMMENT 'Monday procedure for votes'  
BEGIN  
    SELECT val FROM random_numbers WHERE val <= 6 ORDER BY RAND() LIMIT 1 INTO @rand_number;
    SET @for = 17; 
    SET @against = 6; 
    WHILE (@fors > 0) DO  //
    SELECT `user_id` FROM votes ORDER BY RAND() LIMIT 1 INTO @rand_user; 
	UPDATE `votes` SET `for` = `for` + 1 * @rand_number WHERE `user_id` = @rand_user; 
    SET @fors = @fors - 1;
	END WHILE;
    WHILE (@against > 0) DO
    SELECT val FROM random_numbers WHERE val <= 6 ORDER BY RAND() LIMIT 1 INTO @rand_number;
    SELECT `broker_id` FROM votes ORDER BY RAND() LIMIT 1 INTO @rand_broker;
	UPDATE `votes` SET `against` = `against` + 1 * @rand_number WHERE `broker_id` = @rand_broker;
    SET @against = @against - 1;
	END WHILE;
END


вызывается пока с помощью такого события

CREATE EVENT `auto_votes` ON SCHEDULE EVERY 7 DAY DO CALL monday()
...
Рейтинг: 0 / 0
31.03.2017, 02:55
    #39430573
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
yurii.kravets,
запускай каждый час. В процедуре проверяй день недели, если не понедельник - ничего не делай.
...
Рейтинг: 0 / 0
31.03.2017, 11:40
    #39430754
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
скукотища,

Спасибо за совет, сделал вот так


SELECT DAYNAME(CURRENT_DATE) INTO @day
CASE @day
WHEN `monday`
THEN
SELECT ROUND((RAND() * (6 - 1)) + 1) INTO @rand_number;
SET @fors = 17;
SET @against = 6;
WHEN `tuesday`
THEN
SELECT ROUND((RAND() * (10 - 2)) + 2) INTO @rand_number;
SET @fors = 5;
SET @against = 2;
WHEN `wednesday`
THEN
SELECT ROUND((RAND() * (9 - 5)) + 5) INTO @rand_number;
SET @fors = 3;
SET @against = 3;
WHEN `thursday`
THEN
SET @rand_number = 1;
SET @fors = 49;
SET @against = 17;
WHEN `friday`
THEN
SELECT ROUND((RAND() * (10 - 5)) + 5) INTO @rand_number;
SET @fors = 5;
SET @against = 1;
ELSE
SET @rand_number = 0;
SET @fors = 0;
SET @against = 0;
END CASE


только теперь есть не получается создать процедуру, ругается на строку "CASE @day"
...
Рейтинг: 0 / 0
31.03.2017, 11:46
    #39430759
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Точка с запятой потерялась.
...
Рейтинг: 0 / 0
31.03.2017, 12:27
    #39430797
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Akina,

поставил

SELECT DAYNAME(CURRENT_DATE) INTO @day;
CASE @day
WHEN `monday`
THEN
........

теперь ругается строку SELECT DAYNAME(CURRENT_DATE) INTO @day;
...
Рейтинг: 0 / 0
31.03.2017, 13:12
    #39430848
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Ну что за детский сад, право слово... ругается у него... Где ТОЧНОЕ сообщение об ошибке? А ещё лучше - прямо цитата с консоли от начала ввода и до сообщения об ошибке. И непременно в теге кода - смотреть на эту "лапшу", мягко говоря, не очень приятно.
...
Рейтинг: 0 / 0
31.03.2017, 14:27
    #39430920
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Akina,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
CREATE PROCEDURE `monday` ()  
LANGUAGE SQL  
DETERMINISTIC  
SQL SECURITY DEFINER  
COMMENT 'Procedure for votes'  
BEGIN 
	SELECT DAYNAME(CURRENT_DATE) INTO @day;
	CASE @day,
     WHEN `Monday`;
     	THEN 
        SELECT ROUND((RAND() * (6 - 1)) + 1) INTO @rand_number;
        SET @fors = 17;
    	SET @against = 6;
     WHEN `Tuesday`;
     	THEN
        SELECT ROUND((RAND() * (10 - 2)) + 2) INTO @rand_number;
        SET @fors = 5;
    	SET @against = 2;
     WHEN `Wednesday`;
     	THEN 
        SELECT ROUND((RAND() * (9 - 5)) + 5) INTO @rand_number;
        SET @fors = 3;
    	SET @against = 3;
     WHEN `Thursday`;
     	THEN 
        SET @rand_number = 1;
        SET @fors = 49;
    	SET @against = 17;
     WHEN `Friday`;
     	THEN 
        SELECT ROUND((RAND() * (10 - 5)) + 5) INTO @rand_number;
        SET @fors = 5;
    	SET @against = 1;
     ELSE
     	SET @rand_number = 0;
        SET @fors = 0;
    	SET @against = 0;
	END CASE
    WHILE (@fors > 0) DO 
    SELECT `id` FROM `users` ORDER BY RAND() LIMIT 1 INTO @rand_user;
	UPDATE `votes` SET `for` = `for` + 1 * @rand_number WHERE `user_id` = @rand_user;
    SET @fors = @fors - 1;
	END WHILE;
    WHILE (@against > 0) DO
    SELECT val FROM random_numbers WHERE val <= 6 ORDER BY RAND() LIMIT 1 INTO @rand_number;
    SELECT `id` FROM `users` ORDER BY RAND() LIMIT 1 INTO @rand_user;
	UPDATE `votes` SET `against` = `against` + 1 * @rand_number WHERE `user_id` = @rand_user;
    SET @against = @against - 1;
	END WHILE;
END





Ответ MySQL:

#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '' на строке 7

Если не ставить ; в строке

Код: plsql
1.
SELECT DAYNAME(CURRENT_DATE) INTO @day



то

Ответ MySQL: Документация

#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'CASE @day,
WHEN `Monday`' на строке 8
...
Рейтинг: 0 / 0
31.03.2017, 14:53
    #39430954
yurii.kravets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры
Исправил ошибки, нужно было установить DELIMITER и в некоторых местах убрать ; или наоборот, поставить


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
DELIMITER //
CREATE PROCEDURE `monday` ()  
LANGUAGE SQL  
DETERMINISTIC  
SQL SECURITY DEFINER  
COMMENT 'Procedure for votes'  
BEGIN 
	SELECT DAYNAME(CURRENT_DATE) INTO @day;
	CASE @day
     WHEN `Monday`
     	THEN 
        SELECT ROUND((RAND() * (6 - 1)) + 1) INTO @rand_number;
        SET @fors = 17;
    	SET @against = 6;
     WHEN `Tuesday`
     	THEN
        SELECT ROUND((RAND() * (10 - 2)) + 2) INTO @rand_number;
        SET @fors = 5;
    	SET @against = 2;
     WHEN `Wednesday`
     	THEN 
        SELECT ROUND((RAND() * (9 - 5)) + 5) INTO @rand_number;
        SET @fors = 3;
    	SET @against = 3;
     WHEN `Thursday`
     	THEN 
        SET @rand_number = 1;
        SET @fors = 49;
    	SET @against = 17;
     WHEN `Friday`
     	THEN 
        SELECT ROUND((RAND() * (10 - 5)) + 5) INTO @rand_number;
        SET @fors = 5;
    	SET @against = 1;
     ELSE
     	SET @rand_number = 0;
        SET @fors = 0;
    	SET @against = 0;
	END CASE;
    WHILE (@fors > 0) DO 
    SELECT `id` FROM `users` ORDER BY RAND() LIMIT 1 INTO @rand_user;
	UPDATE `votes` SET `for` = `for` + 1 * @rand_number WHERE `user_id` = @rand_user;
    SET @fors = @fors - 1;
	END WHILE;
    WHILE (@against > 0) DO
    SELECT val FROM random_numbers WHERE val <= 6 ORDER BY RAND() LIMIT 1 INTO @rand_number;
    SELECT `id` FROM `users` ORDER BY RAND() LIMIT 1 INTO @rand_user;
	UPDATE `votes` SET `against` = `against` + 1 * @rand_number WHERE `user_id` = @rand_user;
    SET @against = @against - 1;
	END WHILE;
END//
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вызов процедуры / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]