您的问题是您正在混合CREATE FUNCTION和CREATE PROCEDURE语法。
如果你的意思是它是一个函数而不是一个过程,那么有几个问题:
- 你应该使用DROP FUNCTION而不是DROP PROCEDURE
- MySQL 函数只支持IN参数
- 您应该使用RETURN子句返回函数的结果
- 不需要局部变量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演示(用于函数和过程)
根据您的评论代码与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 ;