2011-12-14 14 views

Odpowiedz

4

Najbliżej że mógłbym pomyśleć, to:

create or replace type lights as object 
(
    red varchar2(8), 
    yellow varchar2(8), 
    green varchar2(8), 
constructor function lights return self as result 
) 

i ciało:

create or replace type body lights is 
constructor function lights return self as result is 
begin 
    self.red = 'red'; 
    self.yellow = 'yellow'; 
    self.green = 'green'; 
    return; 
end; 
end; 

Następnie w kodzie można go używać:

declare 
l lights := new lights; 
begin 
    dbms_output.put_line(l.red); 
end; 
4

This blog describes a way to do it using constant values

Oprócz stałych, blog określa podtyp dla prawidłowych kolorach.

SQL> declare 
    2 RED constant number(1):=1; 
    3 GREEN constant number(1):=2; 
    4 BLUE constant number(1):=3; 
    5 YELLOW constant number(1):=4; 
    6 -- 
    7 VIOLET constant number(1):=7; 
    8 -- 
    9 subtype colors is binary_integer range 1..4; 
10 -- 
11 pv_var colors; 
12 -- 
13 function test_a (pv_var1 in colors) return colors 
14 is 
15 begin 
16  if(pv_var1 = YELLOW) then 
17    return(BLUE); 
18  else 
19    return(RED); 
20  end if; 
21 end; 
22 -- 
+0

na jakiej wersji działa? – Yrogirg

+0

Nie ma - znalazłem bloga i nie czytałem go tak dokładnie, jak powinienem. Kliknij link w mojej poprawionej odpowiedzi, a dowiesz się, jak to zrobić. –

+1

Inne podejście [przy użyciu zestawu] (http://thinkoracle.blogspot.com/2005/05/enum-in-oracle.html). Przyjazny dla SQLPlus [kod źródłowy] (https://bitbucket.org/janihur/orasql-ex/src/tip/enum.sql) jest również dostępny dla obu przykładów. – user272735

7

Nie sądzę, że to rozwiązanie, dostarczone przez A.B.Cade jest całkowicie poprawny. Załóżmy procedury zakładają tak:

procedure TestEnum(enum_in lights);

Jaka jest wartość enum_in? czerwony? żółty? Zielony?

Proponuję inne rozwiązanie. Oto przykład pakietu:

CREATE OR REPLACE PACKAGE pkg_test_enum IS 

    SUBTYPE TLight IS BINARY_INTEGER RANGE 0..2; 
    Red CONSTANT TLight := 0; 
    Yellow CONSTANT TLight := 1; 
    Green CONSTANT TLight := 2; 

    --get sting name for my "enum" type 
    FUNCTION GetLightValueName(enum_in TLight) RETURN VARCHAR2; 

    PROCEDURE EnumTest(enum_in TLight); 

END pkg_test_enum; 


CREATE OR REPLACE PACKAGE BODY pkg_test_enum IS 
    FUNCTION GetLightValueName(enum_in TLight) 
    RETURN VARCHAR2 
    IS 
    ResultValue VARCHAR2(6); 
    BEGIN 
    CASE enum_in 
     WHEN Red THEN ResultValue := 'Red'; 
     WHEN Green THEN ResultValue := 'Green'; 
     WHEN Yellow THEN ResultValue := 'Yellow'; 
     ELSE ResultValue := ''; 
    END CASE; 
    RETURN ResultValue; 
    END GetLightValueName; 


    PROCEDURE EnumTest(enum_in TLight) 
    IS 
    BEGIN 
    --do stuff 
    NULL; 
    END EnumTest; 
END pkg_test_enum; 

Mogę teraz używać TLight w różnych opakowaniach. Mogę teraz przetestować enum_in względem wstępnie zdefiniowanych wartości lub wartości null.

Oto przykład użycia

begin 
    pkg_test_enum.EnumTest(pkg_test_enum.Red); 
end; 

Poza tym, można zrobić tego typu nie pustych.

SUBTYPE TLight IS BINARY_INTEGER RANGE 0..2 NOT NULL;

Powiązane problemy