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执行结果是对的,但是第二句就报错了。
麻烦各位帮我看看是什么问题。

解决方案 »

  1.   

    在MYSQL命令行下调试,超过列的最大长度?
      

  2.   


    在MySQL-Front里面和命令行模式里面都是下面这个错误提示;ERROR 1406 (22001): Data too long for column 'o_region_name' at row 1
      

  3.   

    调大这个 VARCHAR(255)
    改成 VARCHAR(1000) ,递归调用后产生的字符串估计是大于 255了。
      

  4.   

    超过列的最大长度,增加列的长度varchar(2000)
      

  5.   


    改2000也不行,还是报错。
    而且我在命令行模式里面执行第一句sql查出来的汉字是乱码,在MySQL-Front里面就是正确的。
      

  6.   

    贴建表及插入记录的SQL,记录要有代表性,10条就可以了
      

  7.   

    建表:
    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.');
      

  8.   

    F_GETPRTREGIONNAME:代码?
    F_GETPRTREGIONNAME(REGION_NAME,REGION_LEVEL)REGION_NAME
    这样调用?
      

  9.   

    执行下面的sql就可以了,第一句输出结果是对的,第二句就会报错了。
    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
    谢谢。
      

  10.   

    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 ;
      

  11.   

    F_GETPRTREGIONNAME
    F_GETPRTMENUNAME
    是同1个函数?你的UDF是F_GETPRTMENUNAME,你的SQL语句 中又用F_GETPRTREGIONNAME,不明白。
      

  12.   

    实在不好意思,有好几个名字类似的,看烟花了
    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 ;
      

  13.   

    在5.5.28下测试,没有问题
    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. ┠昆明市