почему в паратемерах нельзя использовать оператор PREPARE

0

Я изучаю 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" в "списке полей"

Я думал, что два запроса на выбор должны быть равными, но нет. Может ли кто-нибудь помочь объяснить?

Большое спасибо.

  • 0
    Первый SELECT - это встроенный оператор SQL со встроенными пользовательскими переменными и параметрами. Когда инструкция выполняется, переменные и параметры заменяются их значениями. Вторая - это строка, которая превращается в оператор SQL с помощью команды PREPARE . Подготовленный оператор не имеет параметров, "переданных" ему, и, таким образом, происходит ошибка. Я не эксперт по внутренним компонентам mysql, но это, вероятно, потому, что EXECUTE может быть в другом контексте.
Теги:
stored-procedures
prepared-statement

2 ответа

1

Я думаю, что правильный способ сделать это (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;
  • 0
    он не работает как fc_frm_date, fc_to_date нельзя поставить после использования.
  • 0
    поэтому поместите любые значения параметров в переменные (что вы уже делаете, да).
0

Попытайся:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню