Как использовать перечисления в Oracle?
Вопрос
Как использовать перечисления в Oracle, используя только SQL?(Нет PSQL)
В MySQL вы можете сделать:
CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
Каким будет аналогичный способ сделать это в Oracle?
Решение
Почитав немного о Перечисление MySQL, я предполагаю, что ближайшим эквивалентом будет простое проверочное ограничение
CREATE TABLE sizes (
name VARCHAR2(10) CHECK( name IN ('small','medium','large') )
);
но это не позволяет вам ссылаться на значение по индексу.Также возможны более сложные отношения внешнего ключа.
CREATE TABLE valid_names (
name_id NUMBER PRIMARY KEY,
name_str VARCHAR2(10)
);
INSERT INTO valid_sizes VALUES( 1, 'small' );
INSERT INTO valid_sizes VALUES( 2, 'medium' );
INSERT INTO valid_sizes VALUES( 3, 'large' );
CREATE TABLE sizes (
name_id NUMBER REFERENCES valid_names( name_id )
);
CREATE VIEW vw_sizes
AS
SELECT a.name_id name, <<other columns from the sizes table>>
FROM valid_sizes a,
sizes b
WHERE a.name_id = b.name_id
Пока вы работаете через представление, кажется, что вы можете достаточно хорошо воспроизвести эту функциональность.
Теперь, если вы допускаете решения PL/SQL, вы можете создавать собственные типы объектов, которые могут включать логику для ограничения набора значений, которые они могут хранить, а также иметь методы для получения идентификаторов и значений и т. д.
Другие советы
По этой ссылке вы можете найти альтернативное решение/обходной путь для Oracle, вдохновленный перечислениями языка C: http://www.petefinnigan.com/weblog/archives/00001246.htm
Короче говоря, Пит предлагает определить некоторые целочисленные константы и использовать ПОДТИП для их ограничения:
RED constant number(1):=1;
GREEN constant number(1):=2;
BLUE constant number(1):=3;
YELLOW constant number(1):=4;
subtype COLORS is binary_integer range 1..4;
После этого вы можете объявлять переменные, передавать параметры и возвращать значения из функций и т. д. с помощью типа COLORS.
Почему бы не использовать ограничение для столбца?Он сделает то же самое:
ALTER TABLE x ADD CONSTRAINT проверка size_constraint (x_size in («маленький», «средний», «большой»))