Comment utiliser enums dans Oracle?

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

Dans MySQL, vous pouvez faire:

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

Quelle serait une façon similaire de le faire dans Oracle?

33
demandé sur Robert Gould 2008-10-15 05:48:37

3 réponses

En lisant un peu sur l'enum 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 opérez à travers la vue, il semblerait que vous pourriez reproduire la fonctionnalité raisonnablement bien.

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

42
répondu Justin Cave 2008-10-15 03:16:50

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

Bref, Pete suggère de définir des constantes entières et d'utiliser un sous-type pour les contraindre:

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 et ainsi de suite, avec des couleurs de type.

1
répondu giacomino 2012-10-15 14:40:18

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

ALTER TABLE x ADD CONSTRAINT size_constraint vérifier (x_size dans ('petit', 'moyenne', 'grande'))

0
répondu ezzadeen 2018-08-15 13:34:35