delimiter $
CREATE FUNCTION F_GETREGION
(i_region_seq VARCHAR(255)
)
RETURNS VARCHAR(255)
BEGIN
DECLARE o_region_name VARCHAR(255);
SET o_region_name=(select region_name into o_region_name from t_n_region where region_seq = i_region_seq);
RETURN(o_region_name);
END$
delimiter ;delimiter $
CREATE FUNCTION F_GETPRTMENUNAME
(
i_menu_name VARCHAR(255),
i_menu_level int(11)
)
RETURNS VARCHAR(255)
BEGIN
DECLARE i int(11);
DECLARE o_menu_name VARCHAR(255);
SET i=1;
SET o_menu_name=i_menu_name;
IF(i_menu_level>1) THEN
SET o_menu_name=(select concat('┠',o_menu_name));
END IF;
label1:LOOP
IF(i_menu_level<=i) THEN
leave label1;
END IF;
SET o_menu_name=(select concat('', o_menu_name));
SET i=i+1;
END LOOP label1;
RETURN (o_menu_name);
END$
delimiter ;以上是我写的两个函数的源代码,但是我在MySQL-Front里面点击“属性”查看的时候却看不到第二个函数的源代码,而且执行的时候会报错。 下面这个是我的数据
执行的sql
select region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME from t_n_region where region_seq like '0000.' order by region_seqselect region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME from t_n_region where region_seq like '0000.0871.' order by region_seq第一句sql执行结果是对的,但是第二句就报错了。
麻烦各位帮我看看是什么问题。
CREATE FUNCTION F_GETREGION
(i_region_seq VARCHAR(255)
)
RETURNS VARCHAR(255)
BEGIN
DECLARE o_region_name VARCHAR(255);
SET o_region_name=(select region_name into o_region_name from t_n_region where region_seq = i_region_seq);
RETURN(o_region_name);
END$
delimiter ;delimiter $
CREATE FUNCTION F_GETPRTMENUNAME
(
i_menu_name VARCHAR(255),
i_menu_level int(11)
)
RETURNS VARCHAR(255)
BEGIN
DECLARE i int(11);
DECLARE o_menu_name VARCHAR(255);
SET i=1;
SET o_menu_name=i_menu_name;
IF(i_menu_level>1) THEN
SET o_menu_name=(select concat('┠',o_menu_name));
END IF;
label1:LOOP
IF(i_menu_level<=i) THEN
leave label1;
END IF;
SET o_menu_name=(select concat('', o_menu_name));
SET i=i+1;
END LOOP label1;
RETURN (o_menu_name);
END$
delimiter ;以上是我写的两个函数的源代码,但是我在MySQL-Front里面点击“属性”查看的时候却看不到第二个函数的源代码,而且执行的时候会报错。 下面这个是我的数据
执行的sql
select region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME from t_n_region where region_seq like '0000.' order by region_seqselect region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME from t_n_region where region_seq like '0000.0871.' order by region_seq第一句sql执行结果是对的,但是第二句就报错了。
麻烦各位帮我看看是什么问题。
在MySQL-Front里面和命令行模式里面都是下面这个错误提示;ERROR 1406 (22001): Data too long for column 'o_region_name' at row 1
改成 VARCHAR(1000) ,递归调用后产生的字符串估计是大于 255了。
改2000也不行,还是报错。
而且我在命令行模式里面执行第一句sql查出来的汉字是乱码,在MySQL-Front里面就是正确的。
create table t_n_region
(
region_id varchar(32) not null primary key,
region_name varchar(64),
region_parent_id varchar(32),
region_level int(11),
region_seq varchar(1024)
)
数据就只有三条:
INSERT INTO t_n_region (region_id,region_name,region_parent_id,region_level,region_seq) VALUES ('0000','云南省','0',1,'0000.');
INSERT INTO t_n_region (region_id,region_name,region_parent_id,region_level,region_seq) VALUES ('0871','昆明市','0000',2,'0000.0871.');
INSERT INTO t_n_region (region_id,region_name,region_parent_id,region_level,region_seq) VALUES ('KM01','盘龙区','0871',3,'0000.0871.KM01.');
F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME
这样调用?
select region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)PARENT_REGION_NAME
from t_n_region where region_seq like '0000.' order by region_seqselect region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)PARENT_REGION_NAME
from t_n_region where region_seq like '0000.0871.' order by region_seq
谢谢。
CREATE FUNCTION F_GETPRTMENUNAME
(
i_menu_name VARCHAR(255),
i_menu_level int(11)
)
RETURNS VARCHAR(255)
BEGIN
DECLARE i int(11);
DECLARE o_menu_name VARCHAR(255);
SET i=1;
SET o_menu_name=i_menu_name;
IF(i_menu_level>1) THEN
SET o_menu_name=(select concat('┠',o_menu_name));
END IF;
label1:LOOP
IF(i_menu_level<=i) THEN
leave label1;
END IF;
SET o_menu_name=(select concat('', o_menu_name));
SET i=i+1;
END LOOP label1;
RETURN (o_menu_name);
END$
delimiter ;
F_GETPRTMENUNAME
是同1个函数?你的UDF是F_GETPRTMENUNAME,你的SQL语句 中又用F_GETPRTREGIONNAME,不明白。
delimiter $$
CREATE FUNCTION F_GETPRTREGIONNAME
(
i_region_name VARCHAR(255),
i_region_level int(11)
)
RETURNS VARCHAR(512)
BEGIN
DECLARE i int(11);
DECLARE o_region_name VARCHAR(512);
SET i=1;
SET o_region_name=i_region_name;
IF(i_region_level>1) THEN
SET o_region_name=(select concat('┠',o_region_name));
END IF;
label1:LOOP
IF(i_region_level<=i) THEN
leave label1;
END IF;
SET o_region_name=(select concat('', o_region_name));
SET i=i+1;
END LOOP label1;
RETURN (o_region_name);
END$$
delimiter ;
SELECT region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)PARENT_REGION_NAME
FROM t_n_region WHERE region_seq LIKE '0000.' ORDER BY region_seq;
0000. 云南省SELECT region_seq,F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)PARENT_REGION_NAME
FROM t_n_region WHERE region_seq LIKE '0000.0871.' ORDER BY region_seq0000.0871. ┠昆明市