Как использовать перечисления в Oracle? - PullRequest
35 голосов
/ 15 октября 2008

Как вы используете перечисления в Oracle, используя только SQL? (Без PSQL)

В MySQL вы можете сделать:

CREATE TABLE sizes (
   name ENUM('small', 'medium', 'large')
);

Что было бы аналогичным способом сделать это в Oracle?

Ответы [ 3 ]

44 голосов
/ 15 октября 2008

Читая немного о MySQL enum , я предполагаю, что ближайший эквивалент будет простым проверочным ограничением

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, вы можете создавать собственные типы объектов, которые могут включать логику, чтобы ограничить набор значений, которые они могут содержать, и иметь методы для получения идентификаторов и получения значений и т. Д. *

1 голос
/ 08 февраля 2011

По этой ссылке вы можете найти альтернативное решение / обходной путь для Oracle, основанный на перечислениях языка C: http://www.petefinnigan.com/weblog/archives/00001246.htm

Вкратце, Пит предлагает определить некоторые целочисленные константы и использовать SUBTYPE для их ограничения:

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.

0 голосов
/ 15 августа 2018

Почему бы не использовать ограничение для столбца? Это будет делать то же самое:

ALTER TABLE x ADD CONSTRAINT проверка size_constraint (x_size in («маленький», «средний», «большой»))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...