Как найти и обратиться к объекту БД Домен / DOMAIN?
Очень мало информации нашел о таких объектах как "домены".
Я знаю, что это примерно (маш. перевод: What is domain type in SQL?):
Доменом является определенный пользователем, названный набор значений. Когда вы объявляете столбцы в таблице SQL или параметры для хранимой процедуры, вы можете использовать домен вместо встроенного типа данных SQL, а затем этот столбец или параметр ограничивается значениями, которые удовлетворяют домену.
Занимаясь сейчас анализом спецификаций к системе, встречаю в ней часто объявление доменов. Но по факту, в базе я не вижу их как объекты, либо упоминания в коде.
Ответы (1 шт):
Начнём с термина Домен (domain) в контексте БД, цитирую:
Домен в реляционной модели данных — тип данных, то есть множество допустимых значений.
Этот термин относится более к этапу анализа и дизайна логической модели БД.
В стандарте SQL-92 появилась возможность создать домен предложением CREATE DOMAIN.
Но это предложение реализовано только в некоторых СУБД, например, PostgreSQL.
В СУБД Oracle предложение CREATE DOMAIN отсутствует, поэтому вместо термина домен, чаще в ходу термин -- ограничение (constraint, contrained data type). Самые часто используемые ограничения (например, по длине, набору символов) реализованны во встроенных типах данных Built-in Data Types.
Как же реализуются заложеные в логической модели данных домены, например -- пол персоны, широко известный как МЖ.
Набор данных для тех, кто всё хочет попробовать сам:
insert into person values ('Маша', 'f');
insert into person values ('Паша', 'm');
insert into person values ('Саша', null);
insert into person values ('Мики', 'd');
create table person (
name varchar2 (32), gender char (1),
constraint chk_gender check (gender in ('f','m')));
В случае вставки недопустимого значения:
ORA-02290: check constraint (DB.CHK_GENDER) violated
Referential Integrity Constraint (Foreign Key)
Несколько не в ногу со временем, но ранее широко практиковалось хранить допустимые значеия в отдельной таблице:
create table gender (val char (1) primary key);
insert into gender select trim (column_value) from xmlTable ('"f","m"');
create table person (
name varchar2 (32), gender char (1),
constraint fk_gender foreign key (gender) references gender (val));
В случае вставки недопустимого значения:
ORA-02291: integrity constraint (DB.FK_GENDER) violated - parent key not found
Пользовательский тип данных с ограничением можно будет использовать как в SQL, так и PL/SQL контексте. Хороший пример есть уже в этой теме. Для случая с МЖ:
create or replace type genderType as object (
val char (1),
constructor function genderType (val char) return self as result) final
/
create or replace type body genderType as
constructor function genderType (val char) return self as result is
begin
if val not in ('f','m') then
raise_application_error (-20000, 'illegal gender value >'||val||'<'); end if;
self.val := val;
return;
end;
end;
/
declare
gender constant genderType := genderType ('d');
begin null; end;
/
ORA-20000: illegal gender value >d<