#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;
и это все!!