您的问题是您正在混合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 ;