¿Cómo usar enumeraciones en Oracle?
Pregunta
¿Cómo se usan las enumeraciones en Oracle usando solo SQL? (No PSQL)
En MySQL puedes hacer:
CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
¿Cuál sería una forma similar de hacer esto en Oracle?
Solución
Leer un poco sobre la enumeración de MySQL , I ' Supongo que el equivalente más cercano sería una simple restricción de verificación
CREATE TABLE sizes (
name VARCHAR2(10) CHECK( name IN ('small','medium','large') )
);
pero eso no le permite hacer referencia al valor por el índice. También sería posible una relación de clave externa más complicada
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
Siempre que opere a través de la vista, parecería que podría replicar la funcionalidad razonablemente bien.
Ahora, si admite soluciones PL / SQL, puede crear tipos de objetos personalizados que podrían incluir lógica para limitar el conjunto de valores que pueden contener y tener métodos para obtener los ID y para obtener los valores, etc.
Otros consejos
En este enlace puede encontrar una solución / solución alternativa para Oracle, inspirada en las enumeraciones en lenguaje C: http://www.petefinnigan.com/weblog/archives/00001246.htm
En pocas palabras, Pete sugiere definir algunas constantes enteras y usar un TIPO DE TÍTULO para restringirlas:
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;
Después de eso, puede declarar variables, pasar parámetros y devolver valores desde funciones, etc., con el tipo de COLORES.
¿Por qué no usar una restricción para la columna? Hará lo mismo:
ALTER TABLE x ADD CONSTRAINT check_constraint size (x_size in ('small', 'medium', 'large'))