Как вы можете получить значение перечисления в процедуре MySQL

#mysql #enums #procedures

#mysql #перечисления #процедуры

Вопрос:

Мне кажется, что перечисления не работают в MySQL, по крайней мере, в версии 5.0.51a-24 lenny5 (Debian). У меня есть простая таблица поиска, которая содержит поле перечисления:

 CREATE TABLE `FrameworkServices` (
  ...
  `DNSType` enum('IP','CNAME') NOT NULL,
  ...
)
  

Ad-hoc, я могу запустить следующее без проблем:

 SELECT DNSType, CNameOrIP INTO @hackEnum, @ipAddress
FROM FrameworkServices WHERE FrameworkTypeId = 1 LIMIT 1;
SELECT @hackEnum, @ipAddress;
  

Однако, если я добавлю ТОЧНО такой же код в процедуру, @hackEnum вернет empty (не null, по крайней мере, через TOAD).

Я попытался выбрать DNSType 0, CONCAT (DNSType,») и все остальное, что кажется допустимым для перечислений, и результат тот же: КАЖДАЯ статья, которую я прочитал, работает ad-hoc, но возвращает пустоту в процедуре!

Я даже пытался использовать локальные переменные и определять hackEnum как тот же тип перечисления.

Комментарии:

1. ПРИМЕЧАНИЕ: Мне не нравится это перечисление, но пока мне приходится с этим жить (унаследованный код), поэтому, пожалуйста, не предлагайте повторно вводить перечисление для использования таблицы подстановки, даже если это, в конечном счете, лучший ответ.

2. Неопределенная возможность: попробуйте @hackEnum := DNSType, @ipAddress := CNameOrIp вместо этого, на случай, если это какая-то странная ошибка синтаксического анализатора.

Ответ №1:

У меня была точно такая же проблема — я извлекал значение перечисления, а затем проверял его через IF...ELSE...END IF . Это не работало и сводило меня с ума, почему нет. Решение состояло в том, чтобы выбрать в символе (1), а затем обработать значение столбца перечисления как строку:

 DECLARE use_free CHAR(1);

SELECT use_free INTO use_free FROM ...;

IF use_free = '1' THEN
  <do something>
ELSE
  <do something else>
END IF;
  

Я впервые использовал:

 DECLARE use_free ENUM('0','1');
  

и хотя технически это правильно, сбой. Надеюсь, это поможет вам.

Ответ №2:

Объявляйте только свою переменную return, имеющую varchar(xx);

 CREATE TABLE `FrameworkServices` (
  ...
  `DNSType` enum('IP','CNAME') NOT NULL,
  ...
)

declare valor varchar(40);
select DNSType from FrameworkServices into valor; 
  

и это все!!