Заметки

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)

Годный Unix time конвертер

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