2008-10-15 15 views
31

¿Cómo se utilizan las enumeraciones en Oracle utilizando solo SQL? (No se PSQL)¿Cómo usar enumeraciones en Oracle?

En MySQL que puede hacer:

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

¿Cuál sería una manera similar a hacer esto en Oracle?

Respuesta

37

Leyendo un poco sobre el MySQL enum, supongo que el equivalente más cercano sería un simple restricción de comprobación

CREATE TABLE sizes (
    name VARCHAR2(10) CHECK(name IN ('small','medium','large')) 
); 

pero que no permite hacer referencia al valor por el índice. Una más complicada relación de clave externa también sería posible

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 

Mientras se opera a través de la vista, parecería que su pudo 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 obtener los valores, etc.

+0

Tienes Enums en MySQL, son bastante útiles :) ¡Gracias de todos modos! –

+0

No estoy seguro de que esto esté más cerca, pero pensé que lo tiraría allí. –

+0

Sí, está más cerca, y es también la solución que estoy usando actualmente, pero solo deseaba que hubiera una mejor manera. –

1

en este link se puede encontrar una solución/solución alternativa para Oracle, inspirado en las enumeraciones de lenguaje C: http://www.petefinnigan.com/weblog/archives/00001246.htm

Poco palabras, Pete sugiere definir algunas constantes enteras y utilizar un subtipo de constrait ellos:

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 de funciones y demás, con el tipo COLORES.

+2

que es explícitamente para PL/SQL (está en el título del artículo), y el OP específicamente dijo que necesitaba SQL y no PL/SQL. Los comentarios sobre la respuesta de Justin también mencionan que tiene que ser trabajo en múltiples bases de datos y no puede usar características específicas de Oracle. –

+2

Como un desarrollador que comenzó con MySQL y se trasladó a Oracle, todos los días me sorprendió que el producto empresarial carezca del conjunto de características del producto de base de datos gratuito. Me pregunto si existe una clara justificación del rendimiento de por qué tales tipos no están disponibles en MSSQL o PL/SQL. –

+0

@JosephLust ¿Cuál es la diferencia entre MySQL enum y Oracle teniendo varchar2 con restricción de verificación? En términos prácticos, parecen ser lo mismo, con el beneficio adicional de que no es un nuevo tipo de datos. La larga lista de tipos de datos de columna es bastante ridícula en MySQL: tener tantos tiene que tener un costo, al menos un costo de mantenimiento. – fool4jesus

Cuestiones relacionadas