请大家帮个忙,帮俺看看set global log_bin_trust_function_creators = 1; -- 这句干嘛用的,我也不知道?加上总不会有问题
DROP FUNCTION IF EXISTS FUN_GETCODENAME; -- 删掉已经存在的
DELIMITER $$    -- 定义分隔符,必须要有,可以不是$$
CREATE FUNCTION FUN_GETCODENAME(
              STRCODETYPE CHAR(3)
            , STRCODEID VARCHAR(10)
            ) -- 多个参数用,分割 参数的类型必须是mysql列存在的类型RETURNS VARCHAR(50)                  -- 指定返回值类型,如果你不确定返回文本长度,可以使用textBEGIN
    DECLARE str varchar(50) default ''; -- 定义一个变量,可以指定默认值
    
    SELECT CODE_NAME INTO @STR FROM S_CODE WHERE TYPE_ID = @STRCODETYPE AND CODE_ID = @STRCODEID;                    -- 设置改边变量的值
    
    RETURN str;                                 -- 返回值
END $$                                          -- 注意看清楚了,这个end后面有你在前面定义的分割符号DELIMITER $$                                    -- 好,这里结束。

解决方案 »

  1.   

    俺第一次写mysql的函数,看不出来问题出在哪了,请帮俺看看,先谢谢了
      

  2.   

    1、
    log_bin_trust_function_creators=1
    mysql中的ERROR 1418错误,不能创建MySQL函数
    2、语法没有问题,什么问题
      

  3.   

    错误提示:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near ';
    DROP FUNCTION IF EXISTS FUN_GETCODENAME;
    DELIMITER' at line 1
    Query OK, 0 rows affected (0.08 sec)
      

  4.   

    mysql什么版本,在5.1。32下没有问题
      

  5.   

    1、在MYSQL命令行下运行
    DROP FUNCTION IF EXISTS FUN_GETCODENAME; 
    能否成功,如不能成功,去掉此句,
    OR
    直接
    DROP FUNCTION FUN_GETCODENAME; 
      

  6.   

    OR
    升级到高版本
    查了一下MYSQL 5。.0的HELP,支持
    DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
    http://dev.mysql.com/doc/refman/5.0/en/drop-procedure.html
      

  7.   

    log_bin_trust_function_creators 
    Version Introduced 5.0.16 
    Command-Line Format --log-bin-trust-function-creators 
    Option-File Format log-bin-trust-function-creators 
    Option Sets Variable Yes, log_bin_trust_function_creators  
    Variable Name log_bin_trust_function_creators 
    Variable Scope Global 
    Dynamic Variable Yes 
      Permitted Values  
    Type boolean 
    Default FALSE This variable applies when binary logging is enabled. It controls whether stored function creators can be trusted not to create stored functions that will cause unsafe events to be written to the binary log. If set to 0 (the default), users are not permitted to create or alter stored functions unless they have the SUPER privilege in addition to the CREATE ROUTINE or ALTER ROUTINE privilege. A setting of 0 also enforces the restriction that a function must be declared with the DETERMINISTIC characteristic, or with the READS SQL DATA or NO SQL characteristic. If the variable is set to 1, MySQL does not enforce these restrictions on stored function creation. This variable also applies to trigger creation. See Section 17.6, “Binary Logging of Stored Programs”. 
    This variable was added in MySQL 5.0.16. 
      

  8.   

    估计是
    set global log_bin_trust_function_creators = 1
    这个 有问题,去掉此句试试
      

  9.   

    DELIMITER $$     -- 好,这里结束。
    DELIMITER ;
      

  10.   

    你的语句没有任何问题,你所说的错误是指什么?mysql> set global log_bin_trust_function_creators = 1;
    Query OK, 0 rows affected (0.08 sec)mysql> DROP FUNCTION IF EXISTS FUN_GETCODENAME;
    Query OK, 0 rows affected, 1 warning (0.14 sec)mysql> DELIMITER $$
    mysql> CREATE FUNCTION FUN_GETCODENAME(
        ->               STRCODETYPE CHAR(3)
        ->             , STRCODEID VARCHAR(10)
        ->             )
        ->
        -> RETURNS VARCHAR(50)
        -> BEGIN
        ->     DECLARE str varchar(50) default '';
        ->     SELECT CODE_NAME INTO @STR FROM S_CODE WHERE TYPE_ID = @STRCODETYPE A
    ND CODE_ID = @STRCODEID;
        ->     RETURN str;
        -> END $$
    Query OK, 0 rows affected (0.05 sec)mysql> DELIMITER ;
    mysql>
      

  11.   


    可能是版本问题
    改成
    DROP FUNCTION FUN_GETCODENAME;
    可以创建了
      

  12.   

    但是现在没有返回值,SELECT CODE_NAME INTO @STR FROM S_CODE WHERE TYPE_ID = @STRCODETYPE AND CODE_ID = @STRCODEID;这个@STR写法是否有问题
      

  13.   

    str在UDF中没有赋值
    RETURN @str
    or
    SELECT CODE_NAME INTO STR FROM S_CODE WHERE TYPE_ID = @STRCODETYPE A
      

  14.   

    检查
    SELECT CODE_NAME FROM S_CODE WHERE TYPE_ID = @STRCODETYPE AND CODE_ID = @STRCODEID;
    是否 有返回值,不用变量,直接
    TYPE_ID = 123 AND CODE_ID = 456;
      

  15.   


    直接操作有我怀疑我变量使用有问题
    set global log_bin_trust_function_creators = 1; -- 这句干嘛用的,我也不知道?加上总不会有问题
    DROP FUNCTION FUN_GETCODENAME; -- 删掉已经存在的
    DELIMITER $$    -- 定义分隔符,必须要有,可以不是$$
    CREATE FUNCTION FUN_GETCODENAME(
                  STRCODETYPE CHAR(3)
                , STRCODEID VARCHAR(10)
                ) -- 多个参数用,分割 参数的类型必须是mysql列存在的类型RETURNS VARCHAR(50)                  -- 指定返回值类型,如果你不确定返回文本长度,可以使用textBEGIN
        DECLARE str varchar(50) default ''; -- 定义一个变量,可以指定默认值
        
        SELECT CODE_NAME INTO @STR FROM S_CODE WHERE TYPE_ID = @STRCODETYPE AND CODE_ID = @STRCODEID;                    -- 设置改边变量的值
        
        RETURN @str;                                 -- 返回值
    END $$                                          -- 注意看清楚了,这个end后面有你在前面定义的分割符号DELIMITER $$                                    -- 好,这里结束。***************************************************
    看红色部分,这个str到底应该怎么定义使用?
      

  16.   

    你是怎样调用FUN_GETCODENAMEF的?变量类型与字段类型是否一致
      

  17.   

    终于搞定了set global log_bin_trust_function_creators = 1; -- 这句干嘛用的,我也不知道?加上总不会有问题
    DROP FUNCTION IF EXISTS FUN_GETCODENAME; -- 删掉已经存在的
    DELIMITER $$    -- 定义分隔符,必须要有,可以不是$$
    CREATE FUNCTION FUN_GETCODENAME(
                  STRCODETYPE CHAR(3)
                , STRCODEID VARCHAR(10)
                ) -- 多个参数用,分割 参数的类型必须是mysql列存在的类型RETURNS VARCHAR(50)                  -- 指定返回值类型,如果你不确定返回文本长度,可以使用textBEGIN
        DECLARE str varchar(50) default ''; -- 定义一个变量,可以指定默认值
        
        SELECT CODE_NAME INTO STR FROM S_CODE WHERE TYPE_ID = STRCODETYPE AND CODE_ID = STRCODEID;                    -- 设置改边变量的值
        
        RETURN str;                                 -- 返回值
    END $$                                          -- 注意看清楚了,这个end后面有你在前面定义的分割符号DELIMITER $$                                    -- 好,这里结束。
      

  18.   

    STRCODETYPE,STRCODEID这两个变量前面的@去掉才好用set global log_bin_trust_function_creators = 1; -- 这句干嘛用的,我也不知道?加上总不会有问题
    DROP FUNCTION IF EXISTS FUN_GETCODENAME; -- 删掉已经存在的
    DELIMITER $$    -- 定义分隔符,必须要有,可以不是$$
    CREATE FUNCTION FUN_GETCODENAME(
                  STRCODETYPE CHAR(3)
                , STRCODEID VARCHAR(10)
                ) -- 多个参数用,分割 参数的类型必须是mysql列存在的类型RETURNS VARCHAR(50)                  -- 指定返回值类型,如果你不确定返回文本长度,可以使用textBEGIN
        DECLARE str varchar(50) default ''; -- 定义一个变量,可以指定默认值
        
        SELECT CODE_NAME INTO STR FROM S_CODE WHERE TYPE_ID = STRCODETYPE AND CODE_ID = STRCODEID;                    -- 设置改边变量的值
        
        RETURN str;                                 -- 返回值
    END $$                                          -- 注意看清楚了,这个end后面有你在前面定义的分割符号DELIMITER $$                                    -- 好,这里结束。
      

  19.   

    MYSQL中@X 与 X 是两个不同的变量。
      

  20.   

    加上@,是自定义变量,如果 在UDF中有参数,直接用参数名即可,呵呵,提问题还是有技巧的,自己解决更好。
      

  21.   


    在UDF中有参数什么意思?
    是指这个
    (
      STRCODETYPE CHAR(3)
      , STRCODEID VARCHAR(10)
      )
      

  22.   

    (
      STRCODETYPE CHAR(3)
      , STRCODEID VARCHAR(10)
      )
    ***********************
    这里加@怎么不让加?
    (
      @STRCODETYPE CHAR(3)
      , @STRCODEID VARCHAR(10)
      )不通过不会又是版本问题吧
      

  23.   


    对,调用时
    select udf('123','456')
      

  24.   


    @X在MYSQL中是 SESSION的变量,这个与SQL SERVER中并不同。 所以在FUNCTION的参数,显然它不能是SESSION变量。
      

  25.   

    呵呵, 是啊,多看看HELP,再动手做一下