Подходящие типы элементов
Массивы могут содержать элементы любого поддерживаемого Firebird типа за исключением BLOB. Массивы массивов не поддерживаются. Все элементы конкретного массива имеют один и тот же тип данных.
Массив может быть определен как домен (с использованием CREATE DOMAIN) или как столбец в операторе CREATE TABLE или ALTER TABLE. Определение домена или столбца как массива похоже на определение любого другого такого объекта, здесь только добавляется указание размерности массива. Размерность массива заключается в квадратные скобки и следует за спецификацией типа данных.
Например, следующий оператор определяет обычный символьный столбец и столбец в виде одноразмерного символьного массива, содержащего восемь элементов:
CREATE TABLE ATABLE (ID BIGINT,
ARR_CHAR(14)[8] CHARACTER SET OCTETS);
/* хранит 1 строку по 8 элементов */
Firebird поддерживает многомерные массивы размерностью от 1 до 16. Например, следующий оператор определяет три столбца целочисленных массивов с двумя, тремя и четырьмя размерностями:
CREATE TABLE BTABLE (
/* хранит 4 строки по 5 элементов = 20 элементов */
ARR_INT2 INTEGER[4,5],
/* 6 уровней, по 4 строки по 5 элементов = 120 элементов */
ARR_INT3 INTEGER [4,5,6],
/* 7 ярусов, по 6 уровней в 4 строки по 5 элементов = 840 элементов */
ARR_INT6 INTEGER[4,5,6,7] ) ;
Firebird хранит многомерные массивы в порядке развертывания по строкам. В некоторых языках, например FORTRAN, ожидается, что массивы хранятся в порядке развертывания по столбцам. В таких случаях позаботьтесь о правильной трансляции порядка элементов между Firebird и используемым языком программирования.
Задание диапазона значений индексов для размерностей
Размерности массивов в Firebird задаются в виде верхней и нижней границ, называемых списком индексов. По умолчанию размерности основаны на 1 - первый элемент массива из n элементов имеет индекс 1, второй элемент имеет индекс 2, а последний элемент индекс n. Например, следующий оператор создает таблицу со столбцом, который является массивом четырех целых:
CREATE TABLE TABLEC (ARR_INT INTEGER[4]);
Индексы этого массива 1, 2, 3 и 4.
Пользовательские (явные) границы индексов
Пользовательская установка верхней и нижней границы может быть явно определена для каждой размерности массива при создании столбца ARRAY. Например, программисты С и Pascal, знакомые с массивами, основанными на нуле, могут создавать столбцы массивов с нулевой нижней границей для полного соответствия со структурой массивов в коде приложения.
Требуются нижняя и верхняя граница размерности при определении пользовательских границ. Используется следующий синтаксис:
[ нижняя:верхняя]
Следующий пример создает таблицу с одноразмерным, основанным на нуле столбцом массива:
CREATE TABLE TABLED
(ARR_INT INTEGER[0:3]);
/* индексы 0, 1, 2, и 3. */
Каждое задание границ размерности отделяется от следующего запятой. Например, следующий оператор создает таблицу со столбцом массива размерности два, где обе размерности основаны на нуле:
CREATE TABLE TABLEE
(ARR_INT INTEGER[0:3, 0:3]);
Хранение столбцов массивов
Как и другие типы данных, реализованные как BLOB, Firebird хранит идентификатор массива в столбце таблицы базы данных, который ссылается на страницу, содержащую фактические данные.
Обновления
Как и в случае других типов BLOB, сервер Firebird не может последовательно просматривать индивидуальные элементы при условном обновлении. При этом в одиночном операторе DML возможно изолировать один элемент или набор последовательных элементов, называемый фрагментом, и передавать этот фрагмент для обновления.
Добавления
Оператор INSERT не может оперировать с фрагментами. Когда строка добавляется в таблицу, содержащую столбцы массивов, необходимо конструировать и заполнять массив целиком до передачи его INSERT.
Некоторые интерфейсы приложений инкапсулируют функции и дескрипторы API, ограниченный доступ для чтения возможен из хранимых процедур.
Дескриптор массива
API предоставляет структуру дескриптора массива для передачи серверу массива или фрагмента массива для чтения и записи в базу данных. Эта структура для программистов представлена в файле ibase.h (добавлены комментарии):
typedef struct {
short array_bound_lower;
/* нижняя граница массива или фрагмента */
short array_bound_upper;
/* верхняя граница массива или фрагмента */
Читать дальше