Необъявленная переменная среднего значения 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 не работает.

1
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете пользовательские переменные (с префиксом @). Однако внутри хранимых процедур следует использовать локальные переменные (без префикса). Эти переменные необходимо объявить перед использованием. Разница хорошо объяснена здесь.

Вы получите что-то вроде этого:

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 (имя функции). Лучше избегать использования его в качестве имени переменной.

Спасибо за разъяснение разницы, которая теперь понятна. Я также получаю код ошибки 1064 при попытке реализовать DECLARE row_cnt INT unsigned;

JackDG 10.08.2018 16:27

Приведенный выше код отлично работал у меня. Вы уверены, что ошибка возникает при объявлении row_cnt?

Ildar Akhmetov 10.08.2018 16:30

Я не уверен, в чем проблема, я попытался снова, и он отлично работает. Большое спасибо за вашу помощь. Я отмечу это как правильное.

JackDG 10.08.2018 16:34

Рад, что помог!

Ildar Akhmetov 10.08.2018 16:36

Другие вопросы по теме