} | SC_ARRAY_BOUND;
typedef struct {
unsigned char array_desc_dtype;
/* тип данных элементов */
char array_desc_scale;
/* масштаб для числовых типов */
unsigned short array_desc_length;
/* длина элемента массива в байтах */
char array_desc_field_name[32] ;
/* идентификатор столбца */
char array_desc_relation_name[32];
/* идентификатор таблицы */
short array_desc_dimensions;
/* количество размерностей */
short array_desc_flags;
/* 0=порядок по строкам, 1=порядок по столбцам */
ISC_ARRAY_BOUND array_desc_bounds[16];
/* верхняя и нижняя границы для размерности до 16 */
} ISC_ARRAY_DE SC;
Документ по InterBase 6 "API Guide" (Руководство no API), опубликованный Borland, содержит детальные инструкции по манипулированию массивами с помощью структур API.
Ограничения доступа динамического SQL
Следующий пример является простой демонстрацией того, как приложение DSQL может получить ограниченный доступ к фрагменту массива через хранимую процедуру:
create procedure getcharslice(
low_elem smallint, high_elem smallint)
returns (id integer, list varchar(50))
as
declare variable i smallint;
declare variable string varchar(10);
begin
for select a1.ID from ARRAYS a1 into :id do
begin
i= low_elem;
list = '' ;
while (i <= high_elem) do
begin
select a2.CHARARRAY[:i] from arrays a2
where a2.ID = :id
into : string;
list = list||string;
if (i < high_elem) then
list = list ||',';
i = i + 1;
end
suspend;
end
end
Пора дальше
Последняя глава этой части книги описывает, как объединить тип данных и его дополнительные атрибуты в домен, который вы можете использовать для определения типов данных в столбцах различных таблиц.
Домены в Firebird сродни концепции "типы данных, определенные пользователем". Хотя и невозможно создать новый тип данных, в домене вы можете "упаковать" набор атрибутов с одним из существующих типов данных, присвоить ему идентификатор и после этого использовать его как параметр типа данных для определения столбцов любой таблицы.
Определения доменов являются глобальными для базы данных - все столбцы в любой таблице, которые были определены с одним доменом, будут иметь совершенно идентичные атрибуты за исключением тех, которые были локально переопределены.
Как было отмечено, домены не могут быть подставлены вместо типов данных при определении аргументов и переменных в хранимых процедурах и триггерах.
! ! !
ПРИМЕЧАНИЕ. Замещение атрибутов домена на уровне столбца обсуждается позже в этой главе.
. ! .
Столбцы, основанные на определении домена, наследуют все атрибуты домена, которые могут быть:
* типом данных (обязательно);
* значением по умолчанию для INSERT;
* состоянием NULL;
* ограничениями CHECK;
* набором символов (только для символьных и BLOB столбцов);
* порядком сортировки (только для символьных столбцов).
! ! !
ПРИМЕЧАНИЕ. Вы не можете использовать ограничения ссылочной целостности данных в домене.
. ! .
Преимущества инкапсуляции определения данных очевидны. Для простого, но общего примера предположим, что вы проектируете обращения к множеству малых таблиц, где вы собираетесь хранить текстовые описания пронумерованных множеств - таблицы "типов" - типы счетов, типы продуктов, типы пожертвований и т.д. Вы принимаете решение, что каждый элемент каждого из этих множеств будет иметь ключ, состоящий из трех символов в верхнем регистре, который указывает на символьное описание или поле заголовка, имеющее максимум 25 символов.
Все это требует создания двух доменов.
* Домен для указателя будет CHAR(3) с двумя дополнительными атрибутами: ограничение NOT NULL, поскольку вы собираетесь его использовать в качестве первичного ключа и ключа поиска, и ограничение CHECK для проверки наличия прописных букв. Например:
CREATE DOMAIN Туре_Кеу AS CHAR(3) NOT NULL
CHECK(VALUE = UPPER(VALUE));
* Домен описания будет VARCHAR(25). Вы хотите запретить для него пустые значения, поскольку таблицы, в которых вы собираетесь его использовать, являются управляющими:
CREATE DOMAIN Type_Description AS VARCHAR(25) NOT NULL;
Когда вы создадите эти домены, все ваши взаимосвязанные таблицы могут иметь похожие определения, а все таблицы, хранящие ключи, ссылающиеся на такие таблицы, будут использовать соответствующий домен для столбцов ключа.
Синтаксис языка определения данных (DDL) для создания домена:
CREATE DOMAIN домен [AS] <���тип-данных>
[DEFAULT литерам |NULL |USER]
[NOT NULL] [CHECK (<���условие-поиска-домена>)]
[CHARSET набор-символов| NONE]
[COLLATE порядок-сортировки];
При создании в базе данных домена вы должны задать идентификатор домена, который является глобально уникальным в базе данных. Разработчики часто используют префикс или суффикс в идентификаторах доменов для улучшения документирования. Например:
Читать дальше