Книга - Борри хелен - firebird керівництво розробника баз даних - читати онлайн, сторінка 41

Масиви можуть містити елементи будь-якого підтримуваного 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 (<условие-поиска-домена>)]

Схожі статті