Mysql сохраненная функция заморозки - PullRequest
1 голос
/ 19 марта 2012

У меня есть сохраненная функция в MySQL, и она работает частично.

DELIMITER $$
DROP FUNCTION IF EXISTS `getsubdomain`$$
CREATE FUNCTION getsubdomain(page_id int(11))
RETURNS CHAR(255)
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
declare current_p_id int(11);
declare current_p_parent_id int(11);
declare current_p_address_type char(255);
declare current_p_adress char(255);
SET current_p_id = page_id;
WHILE (current_p_id) <> 0
DO
select p_parent_id, p_address_type, p_adress from opu_pages where p_id = current_p_id into current_p_parent_id, current_p_address_type, current_p_adress;
IF current_p_address_type <> ''
THEN
IF current_p_address_type = 'subdomain'
THEN
RETURN current_p_adress;
ELSE
SET current_p_id = current_p_parent_id;
END IF;
ELSE
RETURN NULL;
END IF;
END WHILE;
RETURN NULL;
END$$
DELIMITER ;

Если я вызываю в запросе SELECT getsubdomain(p_id) FROM opu_pages;, она работает нормально.Но если я позвоню в SELECT * FROM opu_pages WHERE getsubdomain(p_id)='library';, база данных будет свернута и зависает.Запрос и функция работают с одной таблицей.Что я сделал не так?Я думал, что это может быть вызвано таблицей формата MyISAM.Но я не могу изменить его на InnoDB, потому что я использую поля FULLTEXTFORMAT в этой таблице.

Таблица opu_pages (MyISAM) схема

p_id INT
p_parent_id INT
p_address_type ENUM (path, subdomain)
p_adress VARCHAR

1 Ответ

0 голосов
/ 19 марта 2012

Исходя из вашего поста, я бы сказал, что ваш код вводит бесконечный цикл для некоторых из ваших входных параметров.

В частности, в случае p_id = p_parent_id в таблице opu_pages и current_p_address_type = 'subdomain'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...