【问题标题】:Cannot create MySQL function containing declare keyword无法创建包含声明关键字的 MySQL 函数
【发布时间】:2026-02-07 11:50:01
【问题描述】:

我想创建一个这样的函数:

CREATE FUNCTION fn_geturlparam (param varchar(55), url varchar(2048))  RETURNS varchar(2048) CHARSET utf8 COLLATE utf8_general_ci
  BEGIN

    DECLARE val VARCHAR(2048);
    DECLARE _param VARCHAR(60) DEFAULT CONCAT(param,'=');

    SELECT
      CASE
        WHEN locate(concat('&',_param), url) > 0
          THEN right(url, length(url) - (locate(concat('&',_param),url)+length(concat('&',_param))-1))
        WHEN locate(concat('?',_param), url) > 0
          THEN right(url, length(url) - (locate(concat('?',_param),url)+length(concat('?',_param))-1))
        WHEN locate(concat('#',_param), url) > 0
          THEN right(url, length(url) - (locate(concat('#',_param),url)+length(concat('#',_param))-1))
        WHEN locate(_param,url) > 0
          THEN right(url, length(url) - (locate(_param,url)+length(_param)-1) )
        ELSE null
      END
    INTO val;

    SET val = replace(replace(left(val, locate('&',concat(val,'&'))-1),'%20','         '),'+',' ');

    RETURN val;
  END

我尝试了一切,但没有运气。我正在使用 MySQL 5.5.15

这是错误:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 '' 附近使用正确的语法

【问题讨论】:

    标签: mysql function declare


    【解决方案1】:

    您需要提供delimiter,还需要使用;关闭end

    delimiter //
    
    CREATE FUNCTION fn_geturlparam (param varchar(55), url varchar(2048))         RETURNS varchar(2048) CHARSET utf8 COLLATE utf8_general_ci
     BEGIN
    
        DECLARE val VARCHAR(2048);
        DECLARE _param VARCHAR(60) DEFAULT CONCAT(param,'=');
    
        select
        case
            when locate(concat('&',_param), url) > 0
        then right(url, length(url) -         (locate(concat('&',_param),url)+length(concat('&',_param))-1))
            when locate(concat('?',_param), url) > 0
        then right(url, length(url) -         (locate(concat('?',_param),url)+length(concat('?',_param))-1))
            when locate(concat('#',_param), url) > 0
        then right(url, length(url) -         (locate(concat('#',_param),url)+length(concat('#',_param))-1))
            when locate(_param,url) > 0
                then right(url, length(url) - (locate(_param,url)+length(_param)-1) )
        else null
        end
        into val;
    
        set val = replace(replace(left(val, locate('&',concat(val,'&'))-1),'%20','         '),'+',' ');
    
        RETURN val;
      END;//
    
    delimiter ;
    

    【讨论】: