mysql创建函数语法错误

时间:2013-10-04 01:56:25

标签: mysql sql

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行的错误1064(42000):您的SQL语法有错误;   检查与您的MySQL服务器版本对应的手册   正确的语法在in_username varchar附近使用,       out my_entity integer)RETURNS第3行的整数DE'

1 个答案:

答案 0 :(得分:2)

您的问题是,您正在混合CREATE FUNCTIONCREATE PROCEDURE语法。

如果你认为它是一个功能而不是一个程序,那就有几个问题:

  1. 您应该使用DROP FUNCTION代替DROP PROCEDURE
  2. MySQL功能仅支持IN个参数
  3. 您应该使用RETURN子句返回函数的结果
  4. 在局部变量my_entity 中没有必要(顺便说一句,如果你因为某些原因想在程序中使用它,那么你应该改变它的名字以消除歧义你是否引用OUT参数或本地变量)。您可以直接RETURN价值。
  5. 据说你的代码看起来像这样

    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 演示(兼容函数和程序


    根据您对功能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 ;