2008-10-15 10 views
31

Jak korzystać z wyliczeń w Oracle przy użyciu tylko SQL? (Nie PSQL)Jak używać wyliczeń w Oracle?

W MySQL można zrobić:

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

Jaki byłby podobny sposób zrobić to w Oracle?

Odpowiedz

37

Czytając trochę o MySQL enum, zgaduję najbliższy odpowiednik byłoby prostą kontrolę ograniczenie

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

ale nie pozwala odwoływać się do wartości o indeksie. Bardziej skomplikowana relacja klucz obcy byłoby również możliwe

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 

Dopóki działają poprzez widzenia, wydaje się, że Twój może replikować funkcjonalność w miarę dobrze.

Teraz, jeśli przyznajesz się do rozwiązań PL/SQL, możesz tworzyć niestandardowe typy obiektów, które mogą zawierać logikę, aby ograniczyć zestaw wartości, które mogą przechowywać, i mieć metody uzyskiwania identyfikatorów i uzyskiwania wartości itp.

+0

Masz wyliczenia w MySQL, są one całkiem pomocne :) Dzięki! –

+0

Nie jestem pewien, czy jest bliżej, ale pomyślałem, że go tam wyrzucę. –

+0

Tak, jest bliżej, a także jest to rozwiązanie, z którego aktualnie korzystam, ale po prostu chciałem, żeby był lepszy sposób. –

1

Pod tym linkiem można znaleźć alternatywne rozwiązanie/obejście dla Oracle, zainspirowany C teksty stałe językowych: http://www.petefinnigan.com/weblog/archives/00001246.htm

Krótko mówiąc, Pete proponuje zdefiniowanie pewnych stałych całkowitych i używać podtypu ich constrait:

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; 

Po tym można zadeklarować zmienne, przekazać parametry i zwrócić wartości z funkcji i tak dalej, z typem COLORS.

+2

, który jest wyraźnie dla PL/SQL (jest w tytule artykułu), a PO wyraźnie powiedział, że potrzebował SQL, a nie PL/SQL. Komentarze na temat odpowiedzi Justina wskazują również, że musi to być praca w wielu bazach danych i nie może korzystać z funkcji specyficznych dla Oracle. –

+2

Jako deweloper, który zaczął się od MySQL i przeniósł się do Oracle, każdego dnia jestem zdumiony, że produktowi korporacyjnemu brakuje zestawu funkcji darmowego produktu bazodanowego. Zastanawiam się, czy istnieje wyraźne uzasadnienie, dlaczego takie typy nie są dostępne w MSSQL lub PL/SQL? –

+0

@JosephLust Jaka jest różnica między wyliczeniem MySQL a Oracle mającym varchar2 z ograniczeniem wyboru? Wydaje się, praktycznie rzecz biorąc, być tym samym, z dodatkową korzyścią, że nie jest to nowy typ danych. Długa lista typów danych kolumnowych jest dość niedorzeczna w MySQL - ponieważ tak wiele z nich musi mieć koszt, przynajmniej koszt utrzymania. – fool4jesus

Powiązane problemy