web-dev-qa-db-fra.com

Comment utiliser les énumérations dans Oracle?

Comment utilisez-vous les énumérations dans Oracle en utilisant SQL uniquement? (Pas de PSQL)

Dans MySQL, vous pouvez faire:

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

Quelle serait la manière similaire de procéder dans Oracle?

35
Robert Gould

En lisant un peu la énumération MySQL , je suppose que l'équivalent le plus proche serait une simple contrainte de vérification

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

mais cela ne vous permet pas de référencer la valeur par l'index. Une relation de clé étrangère plus compliquée serait également possible

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

Tant que vous utilisez la vue, il semblerait que vous puissiez raisonnablement répliquer la fonctionnalité.

Maintenant, si vous admettez des solutions PL/SQL, vous pouvez créer des types d'objets personnalisés qui pourraient inclure une logique pour limiter l'ensemble de valeurs qu'ils peuvent contenir et pour avoir des méthodes pour obtenir les ID et pour obtenir les valeurs, etc.

44
Justin Cave

Sur ce lien, vous pouvez trouver une solution/solution alternative pour Oracle, inspirée des énumérations du langage C: http://www.petefinnigan.com/weblog/archives/00001246.htm

Bref, Pete suggère de définir quelques constantes entières et d'utiliser un SUBTYPE pour les constacter:

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;

Après cela, vous pouvez déclarer des variables, passer des paramètres et renvoyer des valeurs à partir de fonctions, etc., avec le type COLORS.

1
giacomino

Pourquoi ne pas utiliser une contrainte pour la colonne? Cela fera la même chose:

ALTER TABLE x ADD CONSTRAINT check_constraint size (x_size in ('small', 'medium', 'large'))

0
ezzadeen