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?

¿Fue útil?

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'))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top