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