Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Например, следующий оператор определяет обычный символьный столбец и столбец в виде одноразмерного символьного массива, содержащего восемь элементов:
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;
/* верхняя граница массива или фрагмента */
} | 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 может получить ограниченный доступ к фрагменту массива через хранимую процедуру: