mysql - SQL 中值未声明变量

标签 mysql sql

我正在尝试创建一个存储过程来获取表中的中位年龄,但出现未声明的变量错误。我的代码是:

DELIMITER //
CREATE PROCEDURE MedianAge()
BEGIN

SET @row_count = (SELECT COUNT(*) FROM employee);
SET @median_index = (@row_count/2);

SELECT  TIMESTAMPDIFF(YEAR, bdate, CURDATE()) AS age 
FROM employee ORDER BY bdate DESC 
LIMIT median_index, median_index;


END //
DELIMITER ;

我收到错误:

Error Code: 1327. Undeclared variable: median_index

据我所知,我已经正确声明了变量,但不确定为什么 SELECT 语句不起作用。

最佳答案

您正在使用用户定义的变量(以@ 为前缀)。但是,在存储过程中,您应该使用局部变量(不带前缀)。这些变量必须在使用前声明。区别很好解释here .

你会得到这样的东西:

DELIMITER //
CREATE PROCEDURE MedianAge()
BEGIN

DECLARE row_cnt INT unsigned;
DECLARE median_index INT unsigned;

SET row_cnt = (SELECT COUNT(*) FROM employees);
SET median_index = (row_cnt/2);

SELECT  TIMESTAMPDIFF(YEAR, bdate, CURDATE()) AS age 
FROM employee ORDER BY bdate DESC 
LIMIT median_index, median_index;


END //
DELIMITER ;

此外,请记住 row_count 是 MySQL 中的保留字(函数名)。最好避免将其用作变量名。

关于mysql - SQL 中值未声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51788376/

相关文章:

php - 使用 php mysql db 将用户个人资料图片保存到数据库

mysql - 避免包含 group by 的嵌套子查询

sql - 在 SQL 中,如何为表的 future INSERT 语句添加约束?

sql - 将 Nvarchar(max) 转换为 nvarchar 的最佳/最有效方法 (30)

MySQL - 按最后一个字符串字符排序

sqlite 性能问题 : one index per table is somewhat painful

mysql - 在 sql 中选择具有重复多次的每个 ID 的最新日期的行

MySQL 查询没有选择正确的日期范围

mysql - 错误 NULL DEFAULT NULL Laravel 使用 MariaDB 迁移

mysql - 如何使用 Eloquent 获取 N 个最新的数据库条目?