Na przykład chcę utworzyć własny typ Boolean i nazwać go Bool. Jak mogę to zrobić?Jak tworzyć typy wyliczeniowe w PL/SQL?
Albo typ dla sygnalizacji świetlnej, tzn. Mający tylko czerwony, żółty, zielony (i oczywiście zerowy).
Na przykład chcę utworzyć własny typ Boolean i nazwać go Bool. Jak mogę to zrobić?Jak tworzyć typy wyliczeniowe w PL/SQL?
Albo typ dla sygnalizacji świetlnej, tzn. Mający tylko czerwony, żółty, zielony (i oczywiście zerowy).
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;
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 --
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;
na jakiej wersji działa? – Yrogirg
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ć. –
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