Domanda

Come si usano gli enum in Oracle usando solo SQL? (No PSQL)

In MySQL puoi fare:

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

Quale sarebbe un modo simile per farlo in Oracle?

È stato utile?

Soluzione

Leggendo un po 'il enum MySQL , I' Immagino che l'equivalente più vicino sarebbe un semplice vincolo di controllo

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

ma ciò non ti consente di fare riferimento al valore tramite l'indice. Sarebbe anche possibile una relazione di chiave esterna più complicata

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

Finché opererai attraverso la vista, sembrerebbe che tu possa replicare ragionevolmente bene la funzionalità.

Ora, se si ammettono soluzioni PL / SQL, è possibile creare tipi di oggetti personalizzati che potrebbero includere la logica per limitare l'insieme di valori che possono contenere e disporre di metodi per ottenere gli ID e ottenere i valori, ecc.

Altri suggerimenti

A questo link puoi trovare una soluzione alternativa / soluzione alternativa per Oracle, ispirata agli enum del linguaggio C: http://www.petefinnigan.com/weblog/archives/00001246.htm

In breve, Pete suggerisce di definire alcune costanti intere e di usare un SOTTOTIPO per rafforzarle:

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;

Successivamente puoi dichiarare le variabili, passare parametri e restituire valori da funzioni e così via, con il tipo COLORI.

Perché non utilizzare un vincolo per la colonna? Farà la stessa cosa:

ALTER TABLE x ADD CONSTRAINT controllo size_constraint (x_size in ('small', 'medium', 'large'))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top