Читаем Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ полностью

<p>Добавление данных в столбцы BLOB</p>

Техника INSERT INTO ... SELECT напрямую передает столбец BLOB В столбец BLOB. Как правило, если вам нужно добавить столбец BLOB как часть списка VALUES(), он должен конструироваться клиентским приложением с использованием функций и структур API. В приложениях DSQL такие данные обычно передаются в виде потоков (stream). Размер сегмента может быть проигнорирован везде, кроме приложений ESQL.

При этом если вы передаете в VALUES() данные для BLOB В виде текста, Firebird примет символьную строку в качестве ввода, например:

INSERT INTO ATABLE (BLOBMEMO)

VALUES ('Now is the time for all good men to come to the aid of the party');

Эта возможность будет подходящей при условии, что сохраняемый текст никогда не превысит 32 767 байтов (или 32 765, если вы помещаете поле VARCHAR в BLOB). Может показаться, что для многих интерфейсов программирования подобная проблема не существует, потому что они не могут обрабатывать такие большие строки. Однако, поскольку Firebird принимает выражения конкатенации строк SQL, такие как MYVARCHARI 11 MYVARCHAR2, следует принять меры по защите входных строк от переполнения.

Добавление в столбцы массивов

В приложениях со встроенным SQL (ESQL) возможно конструирование оператора SQL для добавления целого массива в столбец массива. Могут появиться ошибки, если данные не полностью заполняют массив.

В DSQL вовсе нет возможности добавлять данные в столбцы массивов. Необходимо реализовывать пользовательский метод в приложении или в коде компонента, который будет вызывать API-функцию isc_array_put_siice.

<p>Использование INSERT для автоматических полей</p>

Определение таблицы может содержать столбцы, чьи значения автоматически заполняются данными при добавлении новой строки. Это может происходить в нескольких случаях:

* столбец определен с предложением COMPUTED BY;

* столбец или домен, на котором он основан, включает предложение DEFAULT;

* для таблицы был создан триггер BEFORE INSERT для автоматического заполнения столбца.

Автоматические поля могут воздействовать на тот способ, каким вы формулируете операторы INSERT для таблицы.

Столбцы COMPUTED BY

Включение вычисляемого столбца в список входных столбцов является неверным и приводит к исключениям, как показано в следующем примере:

CREATE TABLE EMPLOYEE (

EMP_NO INTEGER NOT NULL PRIMARY KEY,

FIRST_NAME VARCHAR (15),

LAST_NAME VARCHAR(20),

BIRTH_COUNTRY VARCHAR(30) DEFAULT 'TAIWAN',

FULL_NAME COMPUTED BY FIRST_NAME || ' ' || LAST_NAME);

COMMIT;

INSERT INTO EMPLOYEE (EMP_NO, FIRST_NAME, LAST_NAME, FULL_NAME)

VALUES (99, 'Jiminy', 'Cricket', 'Jiminy Cricket');

Столбцы, имеющие значение no умолчанию

Если столбец определен со значением по умолчанию, то это значение будет работать только при добавлении и только если этот столбец отсутствует в списке входных столбцов. Если немного изменить оператор добавления в предыдущем примере, то в столбец BIRTH_COUNTRY будет записано значение 'TAIWAN':

INSERT INTO EMPLOYEE (EMP_NO, FIRST_NAME, LAST_NAME)

VALUES (99, 'Jiminy', 'Cricket');

COMMIT;

SELECT * FROM EMPLOYEE WHERE EMP_NO = 99;

EMP_NO FIRST_NAME LAST_NAME BIRTH_COUNTRY FULL_NAME

99 Jiminy Cricket TAIWAN Jiminy Cricket

Значения по умолчанию никогда не заменяют значений NULL:

INSERT INTO EMPLOYEE (EMP_NO, FIRST_NAME, LAST_NAME, BI RTH_COUNTRY)

VALUES (100, 'Maria', 'Callas', NULL);

COMMIT;

SELECT * FROM EMPLOYEE WHERE EMP_NO = 100;

EMP_NO FIRST_NAME LAST_NAME BIRTH_COUNTRY FULL_NAME

100 Maria Callas Maria Callas

Если вы разрабатываете приложения с использованием компонентов, которые генерируют операторы INSERT из спецификаций столбцов операторов SELECT для наборов данных - например, Delphi или JBuilder - учитывайте такое поведение, Если ваш компонент не поддерживает метод получения значений по умолчанию с сервера, может оказаться необходимым изменить оператор, записывающий данные.

Триггеры BEFORE INSERT

При добавлении данных в таблицу, для которой существуют триггеры, автоматически заполняющие некоторые столбцы, убедитесь, что вы не задали эти столбцы в вашем входном списке, если вы хотите, чтобы триггер выполнил свою работу.

Это вовсе не означает, что вы всегда должны опускать поля, обрабатываемые триггером, во входном списке. Очень рекомендуется для поддержания целостности данных создавать триггеры, которые присваивают значения столбцам в случае, когда такие значения не задаются в операторе INSERT - особенно когда используется множество приложений и инструментов для доступа к вашей базе данных. Триггер должен проверять входное значение (например, NULL) и выполнять свои действия в соответствии с условиями.

В следующем примере первичный ключ OID заполняется в триггере:

CREATE TABLE AIRCRAFT (

OID INTEGER NOT NULL,

REGISTRATION VARCHAR(8) NOT NULL,

CONSTRAINT PK_AIRCRAFT

PRIMARY KEY (OID));

COMMIT;

/**/

SET TERM ^;

CREATE TRIGGER BI_AIRCRAFT FOR AIRCRAFT

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.OID IS NULL) THEN

NEW.OID = GEN_ID(ANYGEH, 1) ;

END ^

SET TERM ;^

COMMIT;

/* */

INSERT INTO AIRCRAFT (REGISTRATION)

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных