Масиви можуть містити елементи будь-якого підтримуваного 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 елементів * /
/ * 6 рівнів, по 4 рядки по 5 елементів = 120 елементів * /
ARR_INT3 INTEGER [4,5,6],
/ * 7 ярусів, по 6 рівнів в 4 рядки по 5 елементів = 840 елементів * /
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
/ * Індекси 0, 1, 2, і 3. * /
Кожне завдання кордонів розмірності відділяється від наступного коми. Наприклад, наступний оператор створює таблицю зі стовпцем масиву розмірності два, де обидві розмірності засновані на нулі:
CREATE TABLE TABLEE
(ARR_INT INTEGER [0: 3, 0: 3]);
Зберігання стовпців масивів
Як і інші типи даних, реалізовані як BLOB, Firebird зберігає ідентифікатор масиву в стовпці таблиці бази даних, який посилається на сторінку, яка містить фактичні дані.
Як і в разі інших типів BLOB, сервер Firebird не може послідовно переглядати індивідуальні елементи при умовному оновленні. При цьому в одиночному операторі DML можливо ізолювати один елемент або набір послідовних елементів, званий фрагментом, і передавати цей фрагмент для поновлення.
Оператор INSERT не може оперувати з фрагментами. Коли рядок додається в таблицю, яка містить стовпці масивів, необхідно конструювати і заповнювати масив цілком до передачі його INSERT.
Доступ до даних масиву
Деякі інтерфейси додатків інкапсулюють функції і дескриптори API, обмежений доступ для читання можливий зі збережених процедур.
/ * Нижня межа масиву або фрагмента * /
/ * Верхня межа масиву або фрагмента * /
unsigned char array_desc_dtype;
/ * Тип даних елементів * /
/ * Масштаб для числових типів * /
unsigned short array_desc_length;
/ * Довжина елемента масиву в байтах * /
ГЛАВА 13. Домени.
Домени в Firebird на кшталт концепції "типи даних, визначені користувачем". Хоча і неможливо створити новий тип даних, в домені ви можете "упакувати" набір атрибутів з одним з існуючих типів даних, привласнити йому ідентифікатор і після цього використовувати його як параметр типу даних для визначення стовпців будь-якої таблиці.
Визначення доменів є глобальними для бази даних - всі стовпці в будь-якій таблиці, які були визначені з одним доменом, матимуть абсолютно ідентичні атрибути за винятком тих, які були локально перевизначені.
Як було відзначено, домени не можуть бути підставлені замість типів даних при визначенні аргументів і змінних в збережених процедурах і тригерах.
ПРИМІТКА. Заміщення атрибутів домена на рівні стовпця обговорюється пізніше в цій главі.
Стовпці, засновані на визначенні домену, успадковують всі атрибути домена, які можуть бути:
* Типом даних (обов'язково);
* Значенням за замовчуванням для INSERT;
* Набором символів (тільки для символьних і BLOB стовпців);
* Порядком сортування (тільки для символьних стовпців).
ПРИМІТКА. Ви не можете використовувати обмеження посилальної цілісності даних в домені.
Переваги інкапсуляції визначення даних очевидні. Для простого, але загального прикладу припустимо, що ви проектуєте звернення до безлічі малих таблиць, де ви збираєтеся зберігати текстові описи пронумерованих множин - таблиці "типів" - типи рахунків, типи продуктів, типи пожертвувань і т.д. Ви приймаєте рішення, що кожен елемент кожного з цих множин матиме ключ, що складається з трьох символів у верхньому регістрі, який вказує на символьний опис або поле заголовка, має максимум 25 символів.
Все це вимагає створення двох доменів.
* Домен для покажчика буде CHAR (3) з двома додатковими атрибутами: обмеження NOT NULL, оскільки ви збираєтеся його використовувати в якості первинного ключа і ключа пошуку, і обмеження CHECK для перевірки наявності великих літер. наприклад:
CREATE DOMAIN Туре_Кеу AS CHAR (3) NOT NULL
* Домен опису буде VARCHAR (25). Ви хочете заборонити для нього порожні значення, оскільки таблиці, в яких ви збираєтеся його використовувати, є керуючими:
CREATE DOMAIN Type_Description AS VARCHAR (25) NOT NULL;
Коли ви створите ці домени, всі ваші взаємопов'язані таблиці можуть мати схожі визначення, а все таблиці, що зберігають ключі, що посилаються на такі таблиці, будуть використовувати відповідний домен для стовпців ключа.
Синтаксис мови визначення даних (DDL) для створення домену:
CREATE DOMAIN домен [AS] <тип-данных>
[DEFAULT літерам | NULL | USER]
[NOT NULL] [CHECK (<условие-поиска-домена>)]