Я изучаю mysql. Вот мой код практики хранимой процедуры.
CREATE DEFINER='raxuser'@'%' PROCEDURE 'test'(in fc_frm_date char(5), in fc_to_date char(5))
BEGIN
declare frm_date char(5);
declare to_date char(5);
select fc_frm_date into @frm_date;
select fc_to_date into @to_date;
select distinct @frm_date, @to_date, fc_frm_date, fc_to_date;
set @s = CONCAT('select distinct @frm_date, @to_date, fc_frm_date, fc_to_date;');
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
END
Когда я запускаю его, первый запрос на выбор правилен, а второй показывает код ошибки как
Код ошибки: 1054 Неизвестный столбец "fc_frm_date" в "списке полей"
Я думал, что два запроса на выбор должны быть равными, но нет. Может ли кто-нибудь помочь объяснить?
Большое спасибо.
Я думаю, что правильный способ сделать это (UNTESTED):
set @s = CONCAT('select distinct ? , ? , ? , ?;');
PREPARE stmt FROM @s;
EXECUTE stmt USING @frm_date, @to_date, fc_frm_date, fc_to_date;
DEALLOCATE PREPARE stmt;
Попытайся:
CREATE DEFINER='raxuser'@'%' PROCEDURE 'test'(fc_frm_date char(5), fc_to_date char(5))
BEGIN
DECLARE frm_date CHAR(5);
DECLARE to_date CHAR(5);
SELECT fc_frm_date INTO @frm_date;
SELECT fc_to_date INTO @to_date;
SELECT fc_frm_date INTO @fc_frm_date;
SELECT fc_to_date INTO @fc_to_date;
SET @s = 'select distinct @frm_date, @to_date, @fc_frm_date, @fc_to_date';
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SELECT @s;
END
SELECT
- это встроенный оператор SQL со встроенными пользовательскими переменными и параметрами. Когда инструкция выполняется, переменные и параметры заменяются их значениями. Вторая - это строка, которая превращается в оператор SQL с помощью командыPREPARE
. Подготовленный оператор не имеет параметров, "переданных" ему, и, таким образом, происходит ошибка. Я не эксперт по внутренним компонентам mysql, но это, вероятно, потому, чтоEXECUTE
может быть в другом контексте.