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

Что за процедура, нужно смотреть. Каков размер базы, возможно процедура не успеет отработать за час. Почему именно каждый час?
...
Рейтинг: 0 / 0
Вызов процедуры
    #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
Вызов процедуры
    #39430573
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yurii.kravets,
запускай каждый час. В процедуре проверяй день недели, если не понедельник - ничего не делай.
...
Рейтинг: 0 / 0
Вызов процедуры
    #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
Вызов процедуры
    #39430759
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точка с запятой потерялась.
...
Рейтинг: 0 / 0
Вызов процедуры
    #39430797
yurii.kravets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

поставил

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

теперь ругается строку SELECT DAYNAME(CURRENT_DATE) INTO @day;
...
Рейтинг: 0 / 0
Вызов процедуры
    #39430848
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что за детский сад, право слово... ругается у него... Где ТОЧНОЕ сообщение об ошибке? А ещё лучше - прямо цитата с консоли от начала ввода и до сообщения об ошибке. И непременно в теге кода - смотреть на эту "лапшу", мягко говоря, не очень приятно.
...
Рейтинг: 0 / 0
Вызов процедуры
    #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
Вызов процедуры
    #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
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вызов процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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