【问题标题】:mysql create function syntax errormysql 创建函数语法错误
【发布时间】:2013-10-04 01:56:24
【问题描述】:
DROP PROCEDURE IF EXISTS fn_get_entity_by_username;

DELIMITER $$
CREATE function fn_get_entity_by_username
(
    in in_username     varchar,
    out my_entity       integer
)
RETURNS integer DETERMINISTIC
language SQL
BEGIN
    declare my_entity integer(11);
    select entity
      into my_entity
      from tb_entity
     where username = in_username;

END $$

我一直有语法错误

第 4 行出现 ERROR 1064 (42000):您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册 在 'in_username varchar 附近使用正确的语法, out my_entity integer ) RETURNS integer DE' at line 3'

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您的问题是您混合了 CREATE FUNCTIONCREATE PROCEDURE 语法。

    如果你的意思是它是一个函数而不是一个过程,那么有几个问题:

    1. 您应该使用DROP FUNCTION 而不是DROP PROCEDURE
    2. MySQL函数只支持IN参数
    3. 你应该使用RETURN子句来返回函数的结果
    4. 在局部变量中不需要my_entity (顺便说一句,如果你出于某种原因想在过程中使用它,那么你应该更改它的名称以区分你是指一个 OUT 参数还是那个局部变量) 。可以直接RETURN值。

    话虽如此,您的代码可能看起来像这样

    DROP FUNCTION IF EXISTS fn_get_entity_by_username;
    CREATE FUNCTION fn_get_entity_by_username
    (
        in_username VARCHAR(255)
    )
    RETURNS INT 
    RETURN (SELECT entity
             FROM tb_entity
            WHERE username = in_username);
    

    注意:因为它是单语句函数,所以无需更改DELIMITER 并使用BEGIN...END

    示例用法:

    SELECT fn_get_entity_by_username('user2') my_entity;
    

    样本输出:

    | MY_ENTITY | |-----------| | 1 |

    另一方面,如果你的意思是它是一个存储过程,那么你的代码可能看起来像这样

    DROP PROCEDURE IF EXISTS sp_get_entity_by_username;
    CREATE PROCEDURE sp_get_entity_by_username
    (
        IN  in_username VARCHAR(255),
        OUT my_entity   INT
    )
      SET my_entity = (SELECT entity
                         FROM tb_entity
                        WHERE username = in_username);
    

    示例用法:

    CALL sp_get_entity_by_username('user1', @my_entity);
    SELECT @my_entity my_entity;
    

    样本输出:

    | MY_ENTITY | |-----------| | 1 |

    这里是 SQLFiddle 演示(函数和过程


    基于您的 cmets 代码,带有 BEGIN...END 块的函数

    DROP FUNCTION IF EXISTS fn_get_entity_by_username;
    DELIMITER $$
    CREATE FUNCTION fn_get_entity_by_username
    (
        in_username VARCHAR(255)
    )
    RETURNS INT 
    BEGIN
      RETURN (SELECT entity
                FROM tb_entity
               WHERE username = in_username);
    END$$
    DELIMITER ;
    

    对于一个过程

    DROP PROCEDURE IF EXISTS sp_get_entity_by_username;
    DELIMITER $$
    CREATE PROCEDURE sp_get_entity_by_username
    (
        IN  in_username     VARCHAR(255),
        OUT my_entity       INT
    )
    BEGIN
      SET my_entity = (SELECT entity
                         FROM tb_entity
                        WHERE username = in_username);
    END$$
    DELIMITER ;
    

    【讨论】:

    • 因为我不想改变我的代码格式,有没有用 begin 和 end 语句改变我的代码?。
    • 当然可以。只需添加BEGIN...END。查看更新的答案。
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2023-03-09
    • 2014-04-09
    • 2016-02-07
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多