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

4

1 回答 1

3

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

如果你的意思是它是一个函数而不是一个过程,那么有几个问题:

  1. 你应该使用DROP FUNCTION而不是DROP PROCEDURE
  2. MySQL 函数只支持IN参数
  3. 您应该使用RETURN子句返回函数的结果
  4. 不需要局部变量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 ;
于 2013-10-04T02:20:02.410 回答