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'
答案 0 :(得分:2)
您的问题是,您正在混合CREATE FUNCTION
和CREATE PROCEDURE
语法。
如果你认为它是一个功能而不是一个程序,那就有几个问题:
DROP FUNCTION
代替DROP PROCEDURE
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 ;