Mysql存储函数冻结

时间:2012-03-19 08:59:39

标签: mysql stored-functions

我在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 :(得分:0)

根据您的帖子,我会说您的代码正在输入一些输入参数的无限循环。

特别是p_id = p_parent_id表格中opu_pagescurrent_p_address_type = 'subdomain'

的情况