您的问题是您混合了 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 演示(函数和过程)
基于您的 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 ;