Notes
Stored Procedures, while and repeat in SQL
While + other procedure
Хранимая процедура, которая производит поиск и замену дат на заданную внутри строки, в которой даты указанны в произвольном формате, например "1577371600,1577371600,1577371600". Использует внутри себя в цикле While другую процедуру, что ниже
DELIMITER $$ CREATE PROCEDURE ReplaceDates( startDate INT, endDate INT, dateToReplace INT ) BEGIN /* Хранимая процедура, которая производит поиск и замену дат на заданную внутри строки, в которой даты указанны в произвольном формате, например "1577371600,1577371600,1577371600" */ DECLARE curTime INT DEFAULT startDate; /* Начальная дата поиска */ DECLARE endDate INT DEFAULT endDate;/* Крайняя дата поиска*/ DECLARE dateToReplace INT DEFAULT dateToReplace;/* Дата которой мы будем заменять все найденные вхождения строк с startDate по endDate*/ SET curTime = startDate; WHILE curTime <= endDate DO CALL UpdateDate(curTime,dateToReplace); SET curTime = curTime + 1; END WHILE; END$$ DELIMITER ;
DELIMITER $$ CREATE PROCEDURE UpdateDate( curTime INT, dateToReplace INT ) BEGIN DECLARE curTime INT DEFAULT curTime; /* дата поиска */ DECLARE dateToReplace INT DEFAULT dateToReplace;/* Дата которой мы будем заменять все найденные вхождения строки*/ UPDATE sent_qa.rfm_freeze_results SET not_found = REPLACE(not_found,curTime,dateToReplace) WHERE not_found LIKE CONCAT('%',curTime,'%'); END$$ DELIMITER ;
Вызов:
CALL `ReplaceDates`('1577371600', '1577371614', '1576248360')
Repeat-until MySQL example
DELIMITER $$ CREATE PROCEDURE ReplaceDateByRepeat( startDate INT, endDate INT, dateToReplace INT ) BEGIN REPEAT UPDATE sent_qa.rfm_freeze_results SET not_found = REPLACE(not_found,startDate,dateToReplace) WHERE not_found LIKE CONCAT('%',startDate,'%'); SET startDate = startDate + 1; UNTIL startDate >= endDate END REPEAT; -- display result SELECT startDate; END$$ DELIMITER ;
CALL `ReplaceDateByRepeat`(1577371600, 1577371614, 1576248360)
Procedure execution failed 1436 - Thread stack overrun: 8008 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
Как проверять состояние параметра "thread_stack"?
mysql -u root -p -e "SELECT @@thread_stack"
или
SELECT @@thread_stack;
или
SHOW VARIABLES LIKE '%thread_stack%';
Для OpenServer конфигурация mysql будет примерно тут: C:\OSpanel\userdata\config\MySQL-5.7-x64_my.ini (зависит от конфигурации openServer)
В linux конфигурация тут: /etc/mysql/my.cnf
Если команда mysqld -O thread_stack=256K не помогает тогда нужно поправить файл конфигурации MySQL так чтобы в нем была строка:
[mysqld] thread_stack = 256k
Перезапустить MySQL:
/etc/init.d/mysql restart
Или
service mysql start service mysql stop service mysql restart
или
sudo systemctl restart mysql
Leave a reply