Как правильно воспользоваться Enum типом (перечисления)?
Есть валидный тип перечисления, доставшийся в наследство от генератора кода:
create or replace type e_MyEnum as object (
dummy number(1),
static function YES return varchar2 deterministic,
static function NO return varchar2 deterministic
)
/
create or replace type body e_MyEnum as
static function YES return varchar2 deterministic as begin return 'YES'; end;
static function NO return varchar2 deterministic as begin return 'NO'; end;
end;
/
Как корректно пользоваться таким типом?
При попытке задать значение переменной в любом виде, получаю ошибки:
declare
a e_MyEnum;
begin
a := e_MyEnum.YES;
end;
/
PLS-00382: expression is of wrong type
declare
a e_MyEnum;
begin
a := 1;
end;
/
PLS-00382: expression is of wrong type
declare
a e_MyEnum;
begin
a.dummy := 1;
end;
/
ORA-06530: Reference to uninitialized composite
Ошибки: "Выражение не правильного типа" - это понятно. Но в последнем случае: "ссылка на не инициализированный составной тип", но тип же уже создан в БД и его можно посмотреть.
Как правильно присвоить, считать и сравнить переменную типа перечисление?
Ответы (2 шт):
У этого пользовательского типа нет атрибутов (кроме dummy=пустышка), а значит нет данных которые надо хранить.
Создавать сущность этого типа, например a e_MyEnum, нет никакого смысла. Присвоить какое-либо значение можно только инициализированной сущности типа.
Поэтому, объявление переменной этого типа и присвоение ей значений, нецелесообразно.
Статические функции этого типа можно использовать в PL/SQL контексте так:
declare
val varchar2 (3);
begin
val := e_MyEnum.YES;
if val = e_MyEnum.YES then null; end if;
end;
/
PL/SQL procedure successfully completed.
Или в SQL контексте так:
select * from (
select e_MyEnum.NO() val from dual
) where val = e_MyEnum.NO()
/
VAL
---
YES
Есть более простой и понятный способ, эмулирующий тип перечисления:
create or replace package const as
yes constant char (3) := 'YES';
no constant char (2) := 'NO';
end;
/
Вот простейший пример его использования:
var rc refcursor
declare
answ constant varchar (8) := const.no;
begin
open :rc for select const.yes yes, answ answ
from dual where const.no = answ;
end;
/
YES ANSW
-------------------------------- --------------------------------
YES NO