Справочник по командам и функциям SQL

А.1. Команды

ALTER DATABASE ALTER DOMAIN ALTER EXCEPTION ALTER INDEX ALTER PROCEDURE ALTER TABLE ALTER TRIGGER BASED ON

BEGIN DECLARE SECTION CLOSE

CLOSE (BLOB)

COMMIT CONNECT CREATE DATABASE CREATE DOMAIN CREATE EXCEPTION CREATE GENERATOR CREATE INDEX CREATE PROCEDURE CREATE SHADOW CREATE TABLE CREATE TRIGGER CREATE VIEW DECLARE CURSOR DECLARE CURSOR (BLOB)

DROP EXCEPTION

DROP EXTERNAL FUNCTION

DROP FILTER

DROP INDEX

DROP PROCEDURE

DROP SHADOW

DROP TABLE

DROPTRIGGER

DROP VIEW

END DECLARE SECTION EVENT INIT EVENT WAIT EXECUTE

EXECUTE IMMEDIATE EXECUTE PROCEDURE FETCH

FETCH (BLOB)

GRANT

INSERT

INSERT CURSOR (BLOB) OPEN

OPEN (BLOB)

PREPARE

REVOKE

ROLLBACK

DECLARE EXTERNAL FUNCTION DECLARE FILTER DECLARE STATEMENT DECLARE TABLE DELETE DESCRIBE DISCONNECT DROP DATABASE DROP DOMAIN

SELECT

SET DATABASE SET GENERATOR SET NAMES SET STATISTICS SET TERM SET TRANSACTION UPDATE WHENEVER

ALTER DATABASE

ОПИСАНИЕ

ALTER DATABASE добавляет новые (вторичные) файлы к существующей базе. Вторичные файлы полезны для контроля роста и расположения базы. Они позволяют распределить файлы базы по устройствам хранения (но должны находиться на том же узле сети, что и первичный файл).

Команда доступна только для создателя базы и SYSDBA и выполняется только в монопольном режиме.

СИНТАКСИС

ALTER {DATABASE / SCHEMA./

ЖЮ <add_clause>;

<add_clause>;:=

FILE 'filespec' /"<fileinfo>7 /"<add_clause>J

<fileinfo> = LENGTH [=] int fPAGEfs] ] / STARTING [AT

/"page ] ] int

Таблица A.I. Синтаксические конструкции команды ALTER DATABASE

Аргумент Описание
SCHEMA Альтернативное имя для DATABASE
ADD FILE 'filespec' Добавляет один или несколько вторичных файлов для получения страниц базы данных после того, как первичный файл заполнен. Для удаленной базы данных вторичные файлы должны быть расположены на том же узле, что и первичный
LENGTH [=] int [PAGE[S]] Определяет диапазон страниц для вторичного файла, задавая число страниц в каждом файле
Аргумент Описание
STARTING [AT [PAGE]] int Определяет диапазон страниц для вторичного файла, задавая стартовый номер страницы

ПРИМЕР

ALTER DATABASE

ADD FILE 'testbase.gdl'

STARTING AT PAGE 10 0 01 LENGTH 10000 ADD FILE 'testbase,gd2'

LENGTH 10000;

ALTER DOMAIN

ОПИСАНИЕ

ALTER DOMAIN позволяет изменить описание домена. Изменены могут быть любые описания, кроме типа данных и ограничения NOT NULL. Изменения в домене автоматически сказываются на всех данных, которые на него ссылаются, если соответствующие конструкции домена не были явно переопределены на уровне описания таблиц.

Для изменения типа данных необходимо удалить его (DROP DOMAIN) и вновь создать с новыми характеристиками (CREATE DOMAIN).

Команда доступна только для создателя домена и SYSDBA. СИНТАКСИС ALTER DOMAIN name {

[set DEFAULT {literal / NOLL / USER} /

I /"DROP DEFAULTy

I /ADD [CONSTRAINT] CHECK (<dom_search_condition>) ]

I /"DROP CONSTRAINT]

};

<dom_search_condition> = {

VALUE <operator> <val>

/ ЛАШЕ /"not] BEIWEEN <val> AND <val>

/ ЛАШЕ [HOT ] LIKE <val> /"ESCAPE <val>7 / value /not7 in (LIST_<val>)

/ VALUE IS [NOT] NOLL / VALUE (NOT J CONTAINING <val>

/ VALUE (NOT ] STARTING /WITH] <val> j (<dom_search_condition>) j NOT <dom_search_condition>

/ <dom„search_condition> OR <dom_search_condition> j <dom_search_condition> AND <dom_search_condition>

}

(operator) = {= /< /)/<==/) = / ! < / !) / < > / ! = i

Таблица А.2. Синтаксические конструкции команды ALTER DOMAIN

Аргумент Описание
Name Имя существующего домена
SET DEFAULT Указывает значение, которое будет присвоено столбцу, если не было прямого присвоения. Возможные значения:

literal - указанная строка, число или дата;

NULL - задание значения NULL;

USER - имя пользователя, создающего строку. Задаваемые значения должны быть совместимы по типу с типом данных домена.

Значения по умолчанию могут быть переопределены при описании столбцов

DROP DEFAULT Удаляет значения по умолчанию
ADD [CONSTRAINT] CHECK

<dom_search_cond>

Добавляет СНЕСК-ограничение в домен. Домен может иметь только одно СНЕСК-ограничение (см. CREATE DOMAIN)
DROP CONSTRAINT Удаляет СНЕСК-ограничение из описания домена

ПРИМЕР Пусть ранее был создан домен

CREATE DOMAIN PRMKEY

AS INTEGER NOT NULL CONSTRAINT CHECK(value>=0); Тогда его изменение примет вид

ALTER DOMAIN PRMKEY drop CONSTRAINT;

ALTER DOMAIN PRMKEY ADD CONSTRAINT CHECK(value>=0);

ALTER EXCEPTION

ОПИСАНИЕ

ALTER EXCEPTION изменяет текст сообщения об ошибке. Команда доступна только для создателя EXCEPTION и SYSDBA.

СИНТАКСИС

ALTER EXCEPTION name 'message';

Таблица А.З. Синтаксические конструкции команды ALTER EXCEPTION

Аргумент Описание
name Имя существующего исключения
'message' Строка в кавычках, задающая текст исключения

ПРИМЕР

ALTER EXCEPTION ERR_RUBRIC

'Неверно указана рубрика для книги';

ALTER INDEX

ОПИСАНИЕ

ALTER INDEX активирует или деактивирует существующий индекс. Деактивация и реактивация индекса полезны при вводе большого числа строк. Первый шаг: деактивация индекса. Второй шаг: ввод данных при отключенном индексе. В этом случае не возникает необходимость перестроения индекса и скорость ввода увеличивается. Третий шаг: активация индекса; индекс однократно перестраивается.

Если индекс используется, команда ALTER INDEX блокируется до его освобождения.

ALTER INDEX неприменима для индексов, определенных для ограничений UNIQUE, PRIMARY KEY или FOREIGN KEY. В этом случае выдается сообщение об ошибке. Для изменения таких индексов их необходимо сначала удалить (DROP INDEX), а затем пересоздать (CREATE INDEX).

Команда доступна только для создателя индекса и SYSDBA. СИНТАКСИС

ALTER INDEX name {ACTIVE / INACTIVE};

Таблица А.4. Синтаксические конструкции команды ALTER INDEX

Аргумент Описание
name Имя существующего индекса
ACTIVE Активирует индекс
INACTIVE Деактивирует индекс

ПРИМЕР

ALTER INDEX TREADER_RDNAME INACTIVE;

ALTER INDEX TREADER_RDNAME ACTIVE;

ALTER PROCEDURE

ОПИСАНИЕ

ALTER PROCEDURE полностью заменяет существующую хранимую процедуру, включая список параметров и тело.

Синтаксис ALTER PROCEDURE совпадает с синтаксисом CREATE PROCEDURE с точность до замены первого слова в команде - CREATE на ALTER.

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

Если процедура используется, команда ALTER PROCEDURE блокируется до ее освобождения.

Изменения в процедуре становятся доступными сразу же после выполнения COMMIT.

Команда доступна только для создателя процедуры и SYSDBA.

СИНТАКСИС

ALTER PROCEDURE name

/(LJST_<parameter>) J fRETURNS ( (LJ,ST_<paraineter>)

AS <procedure_body> [terminator]

<parameter> ; .■= param <datatype>

Таблица А.5. Синтаксические конструкции команды ALTER PROCEDURE

Аргумент Описание
Name Имя существующей процедуры
Аргумент Описание
param <datatype> Входные параметры процедуры (подробнее см. CREATE PROCEDURE)
RETURNS param <datatype> Выходные параметры процедуры (подробнее см. CREATE PROCEDURE)
<procedure_body> Тело процедуры, включая объявление локальных переменных и блок операторов SQL для процедур и триггеров. Подробнее см. CREATE PROCEDURE
terminator Ограничитель, определенный в команде ISQL SET TERM для пометки конца текста процедуры

ПРИМЕР

SET TERM !! ;

ALTER PROCEDURE PAUTHOR (

PI CHAR(1),

P2 CHAR(1))

RETURNS ( '

AUTHOR INTEGER,

AUNAME VARCHAR(60))

AS

begin

for select author, auname from tauthor into :author, :auname

do

if(auname>pl) then if(auname<p2) then suspend; end ! !

SET TERM ; !!

ALTER TABLE

ОПИСАНИЕ

ALTER TABLE модифицирует структуру существующей таблицы. Одной командой ALTER TABLE можно выполнить несколько операций удаления (DROP) и дополнения (ADD), а начиная с 6 версии и изменения столбца.

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

Выполнение ALTER TABLE завершится аварийно, если текущие данные в таблице нарушают добавляемые к таблице определения ограничений первичного (PRIMARY KEY) или уникального (UNIQUE) ключа. Также нельзя удалить столбец, если он:

- является частью первичного (PRIMARY KEY), уникального (UNIQUE) или внешнего (FOREIGN KEY) ключа;

- используется в контрольном (CHECK) ограничении;

- используется в выражении для вычисляемого столбца.

Для удаления такого столбца необходимо сначала удалить зависящие от него ограничения и вычисляемые столбцы и только потом удалить сам; столбец таблицы. Первичные ключевые (PRIMARY KEY) и уникальные (UNIQUE) ограничения не могут быть удалены, если есть ограничения внешнего ключа (FOREIGN KEY). В этих случаях следует удалить ограничение внешнего ключа перед удалением используемого им первичного (PRIMARY KEY) или уникального (UNIQUE) ключа.

При изменении столбца, основанного на домене, может быть установлено дополнительное ограничение контроля (CHECK) для столбца, не отменяющее доменную конструкцию CHECK.

Изменения в таблицах, которые содержат ограничения контроля (CHECK) с подзапросами, также могут быть отклонены.

При изменении или удалении столбца, содержащиеся в нем данные теряются.

Таблица может быть изменена ее создателем и SYSDBA-пользователем.

СИНТАКСИС

ALTER TABLE table LJST__<operation>;

<operation> = (ADD <col_def > / ADD <table_constraint>

/ DROP col / DROP CONSTRAINT constraint / ALTER /COLUMN./ column_name <alt_col_clause>

}

<col_def>:: =

col (<datatype> / [COMPUTED (byJ (<expr>) / domain.} /default {literal / NULL / USER} ]

/NOT NULL./ /”<col_constraint>7 /OOLIAIE collation./

<col_constraint>; ; =

(CONSTRAINT constraintj <constraint_def>

<constraint_def>; .• =

(PRIMARY KEY / UNIQUE / CHECK (<search_condition>)

/ REFERENCES other_table [ (LIST_otlneT_col ] }

<datatype>::=

{{SMALLINT / INTEGER / FLOAT / DOUBLE PRECISION}

[<array_dim>] f{DECIMAL / NUMERIC.} [ (precision [, scale7)7 f<array_dim> J / {DATE / TIME / TIMESTAMP./ /‘<array_dim> ] j {CHAR / CHARACTER / CHARACTER VARYING / VARCHAR,/

[(1. . .32767) ] /"<array_dim> J /"CHARACTER SET charname./

/ {NCHAR / NATIONAL CHARACTER / NATIONAL CHAR./ /VARYING7 {(1. . .327 67) 7 /‘<array_dim>7 / BLOB {SUB_TYPE {int / subtype_name} ]

/SEGMENT SIZE int7 {CHARACTER SET charname7 / BLOB {(seglen {, subtype7 ) 7

7

<array_dim>::= [x:y [, x:y ...]] скобки здесь - часть синтаксиса, а не метаязыка

<table_constraint>;:=

CONSTRAINT constraint <tconstraint_opt>

<tconstraint_opt>:;=

f /"PRIMARY KEY / UNIQUE} {LIST_col)

I FOREIGN KEY (LIST_col) REFERENCES other_table / CHECK (<search_condition>)

<alt_col_clause> ; ;= {TO new_col_name j TYPE new_col_datatype / POSITION new_col_position7

<new_col_datatype> .• := <datatype>

<new_col__name> •• < col>

Замечание. Конструкция ALTER /COLUMN7 column_name

<alt_col_clause> допустима только в версиях, начиная с 6.

Типы данных TIME | TIMESTAMP допустимы только в версиях, начиная с 6.

См. также CREATE TABLE.

Таблица А.6. Синтаксические конструкции команды ALTER TABLE

Аргумент Описание
table Имя изменяемой таблицы
<operation> Операция, выполняемая с таблицей. Допустимы операции: ADD - создать новый столбец или табличное ограничение, DROP - удалить существующий столбец или табличное ограничение
<col_def> Описание вновь добавляемого столбца. Должно включать имя столбца и тип данных. Может включать значения по умолчанию, ограничения столбца и вид упорядочения (COLLATE)
<table_constraint> Описание нового табличного ограничения. Добавить можно только одно табличное ограничение
col Имя добавляемого, изменяемого или удаляемого столбца. Имена должны быть уникальны в пределах таблицы
<constraint> Имя добавляемого или удаляемого ограничения в пределах таблицы. Имена должны быть уникальны в пределах таблицы
COLLATE collation Добавляет вид упорядочения для заданной таблицы
<datatype> Тип данных для добавляемого столбца
domain Имя домена, на который опирается описание столбца
COMPUTED . [BY]

<expr>

Описывает вычисляемый столбец. Конструкция <ехрг> задает порядок вычисления; <ехрг> может быть любым допустимым в SQL выражением, возвращающим единственное значение (массивы и BLOB недопустимы). Все столбцы, участвующие в вычислении, должны существовать на момент ввода вычисляемого столбца
NOT NULL Указывает, что столбец не может содержать значение NULL. Если таблица содержит строки, то кроме NOT NULL следует задавать и значение по умолчанию (см. DEFAULT)
Аргумент Описание
DEFAULT Устанавливает значение по умолчанию, присваиваемое столбцу, если его значение не установлено явно. Возможные значения: literal - указанная строка, число или дата;

NULL - задание значения NULL;

USER - имя пользователя, создающего строку. Задаваемые значения должны быть совместимы по типу с типом данных столбца.

Значение по умолчанию для столбца переопределяют значения, заданные на доменном уровне

<constraint_def> Ограничения на столбец
CONSTRAINT Задает имя ограничения столбца
DROP

CONSTRAINT

Удаляет из таблицы указанное ограничение
new_col_position Число, задающее новый номер столбца в таблице

ПРИМЕР

ALTER TABLE TBOOK ADD CHECK (BOOKNM NOT IN ( ' СЛОН ' ,

'Моська')) ;

Добавляются ограничение в таблицу.

ALTER TABLE ТВООК ALTER COLUMN BOOKNM POSITION 2,

DROP CONSTRAINT INTEG_20;

Меняется порядок столбцов в таблице и удаляется CHECK ограничение. Имя ограничению присваивалось системой, поэтому перед удалением его следует найти. В конкретном случае оно будет другим.

Отметим, что не всякая синтаксически правильная команда ALTER TABLE может быть выполнена, например, из-за нарушений логической целостности, недопустимых преобразований типов данных и т.п.

ALTER TRIGGER

ОПИСАНИЕ

ALTER TRIGGER изменяет описание существующего триггера. Если какие-либо аргументы для ALTER TRIGGER пропущены, то они будут приняты по значениям, указанным в CREATE TRIGGER или в последней из команд ALTER TRIGGER.

С помощью ALTER TRIGGER можно изменить:

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

- только тело триггера, то есть набор команд триггера, которые следуют за предложением AS;

- заголовок и тело триггера. В этом случае новое определение триггера заменяет старое.

Триггер может быть изменен его создателем и SYSDBA-пользователем.

Чтобы заменить триггер, созданный автоматически конструкцией CHECK, следует использовать команду ALTER TABLE.

СИНТАКСИС ALTER TRIGGER name /active / INACTIVE]

[ {BEFORE / AFTER} {DELETE / INSERT / UPDATE} ] /■POSITION number 7

/AS <trigger_body>7 /"terminator 7

Таблица А.7. Синтаксические конструкции команды ALTER TRIGGER

Аргумент Описание
name Имя существующего триггера
ACTIVE Указывает, что триггер активен (по умолчанию)
INACTIVE Указывает, что триггер не активен
BEFORE Указывает, что триггер выполняется перед заданной операцией
AFTER Указывает, что триггер выполняется после заданной операцией
DELETE | INSERT | UPDATE Указывает операцию, инициирующую триггер
POSITION number Задает номер триггера. Номер - целое в диапазоне 0-32767 (по умолчанию - 0). Триггеры на одну и ту же операцию выполняются в порядке возрастания номеров.

Если имеется несколько триггеров с одним номером, то порядок их выполнения не определен

Аргумент Описание
<trigger_body> Тело триггера - блок операторов (инструкций) на языке SQL для триггеров и хранимых процедур (подробнее см. CREATE TRIGGER)
terminator Ограничитель, определенный в команде ISQL SET TERM для пометки конца текста процедуры. Не нужен, если меняется только заголовок триггера

ПРИМЕР

ALTER TRIGGER I_TB00K_1 INACTIVE;

Деактивирует триггер. Описание триггера сохраняется, но включаться он не будет, пока не выполнится команда

ALTER TRIGGER I_TBOOK_l ACTIVE;

SET TERM !! ;

ALTER TRIGGER I_TBOOK_l as

begin

if.(new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber, 1) ;

if (new.MATHERKEY is NULL or new.^THERKEY<0) then exception NO_RUBRIC; if (new.MATHERKEY>0) then if (NOT EXISTS (select * from TBOOK

where (unikey=new.MATHERKEY))) then exception ERR_RUBRIC; if (new. BOOKNM is NULL) then exception NO_BOOKNM; endSET TERM ; ! !

Заменяется тело триггера.

BASED ON

ОПИСАНИЕ

BASED ON - директива препроцессора и соответственно используется только внутри программы на базовом языке. BASED ON создает переменную базового языка, основанную на определении столбца. Переменная базового языка наследует атрибуты, описанные для столбца, и характеристики, которые делают тип переменной совместимым с исполь зуемым языком программирования. Использование конструкции BASED ON позволяет гарантировать соответствие типов данных в программе типам в базе данных, при изменении типа в базе достаточно просто обработать исходный текст препроцессором и перетранслировать программу. Например, в С команда BASED ON прибавляет один байт к переменным CHAR и VARCHAR, чтобы разместить признак конца - символ ЧУ.

BASED ON применяется в разделе определения переменных программ и не требует ключевых слов EXEC SQL.

Для объявления переменной базового языка, достаточно большой, чтобы хранить сегмент BLOB при выполнении операций FETCH, следует использовать опцию SEGMENT предложения BASED ON. Размер переменной определяется, исходя из длины сегмента столбца BLOB. Если длина сегмента для столбца BLOB изменена в базе данных, необходимо перетранслировать программу, чтобы скорректировать размер переменных базового языка, созданных с помощью BASED ON.

Может использоваться в SQL.

СИНТАКСИС

BASED [on] [ dbhandle. ] table. col [. SEGMENT ] variable;

Таблица А.8. Синтаксические конструкции директивы BASED ON

Аргумент Описание
Dbhandle. Дескриптор базы данных, в которой находится таблица для программ, работающих с несколькими базами данных, dbhandle должен быть предварительно объявлен в инструкции SET DATABASE
table.col Имена таблицы и столбца, на котором строится переменная
SEGMENT Задает размер локальной переменной на основе длины сегмента столбца BLOB во время операций BLOB FETCH. Используется только, когда table.col относится к столбцу данных типа BLOB
variable Имя переменной базового языка, наследующей характеристики столбца таблицы базы данных

ПРИМЕР

EXEC SQL

BEGIN DECLARE SECTION;

BASED ON TBOOK.UNIKEY wUNIKEY;

BASED ON TBOOK.MOTHERKEY wMOTHERKEY; BASED ON TBOOK.BOOKNM wBook;

EXEC SQL

END DECLARE SECTION;

Для программ на С или C+ + в результате обработки препроцессором объявления этих переменных примут вид (для столбцов тестовой базы):

int wUNIKEY;

intwMOTHERKEY; char wBook [251] ;

BEGIN DECLARE SECTION

ОПИСАНИЕ

BEGIN DECLARE SECTION используется в приложениях с внедренным (embedded) SQL, чтобы идентифицировать начало объявлений переменных базового языка для переменных, которые будут использоваться в последующих инструкциях SQL. BEGIN DECLARE SECTION является также директивой препроцессора, которая дает указание gpre объявить переменную SQLCODE, в которой затем будут размещаться коды возврата исполняемых команд SQL.

BEGIN DECLARE SECTION должна всегда появляться в разделе объявления глобальных переменных модуля.

Может использоваться в SQL.

СИНТАКСИС

BEGIN DECLARE SECTION;

ПРИМЕР Следующие инструкции внедренного SQL объявляют раздел и переменную базового языка:

EXEC SQL

BEGIN DECLARE SECTION; int WUNIKEY, wMOTHERKEY; char wBook [2 51] ;

EXEC SQL

END DECLARE SECTION;

См. также END DECLARE SECTION и BASED ON.

CLOSE cursor

ОПИСАНИЕ

CLOSE закрывает указанный открытый курсор, освобождая строки в его активном наборе и все связанные с ним ресурсы системы. Курсор -односторонний указатель в упорядоченном наборе строк, полученных по выражению select в инструкции DECLARE CURSOR. Курсор обеспечивает последовательный доступ к выбранным строкам и модификации их на месте.

Может использоваться в SQL.

СИНТАКСИС

CLOSE cursor;

Таблица А.9. Синтаксические конструкции команды CLOSE cursor

Аргумент Описание
Cursor Имя открытого курсора

Имеется четыре связанных с этим выражений для курсора.

Таблица АЛО. Команды работы с курсором

Этап Оператор Действие
1 DECLARE

CURSOR

Объявляет курсор. Инструкция SELECT определяет строки, выбираемые для курсора
2 OPEN Выбирает строки, указанные для поиска в DECLARE CURSOR. Полученные строки становятся активным набором курсора
3 FETCH Получает текущую строку из активного набора, начиная с первой строки. Последующие команды FETCH продвигают курсор по набору
4 CLOSE Закрывает курсор и освобождает ресурсы системы

Команды FETCH выполняются только при открытом курсоре. Пока курсор не закрыт и не открыт повторно, InterBase не обрабатывает изменения в базе, сделанные другими пользователями. Другими словами курсор видит то состояние базы, которое было на момент его открытия. Что бы получить доступ к изменениям, сделанным другими пользователями необходимо закрыть и повторно открыть курсор.

Кроме CLOSE автоматически закрывают все курсоры в транзакции команды COMMIT и ROLLBACK.

ПРИМЕР

EXEC SQL

DECLARE Mcursor CURSOR FOR SELECT

EXEC SQL ■

OPEN Mcursor;

/ / Открытие цикла чтения

EXEC SQL

FETCH Mcursor INTO .. . ;

/ / Проверка на конец выборки и выход из цикла

/ / Окончание цикла чтения

EXEC SQL ^

CLOSE Mcursor;

CLOSE blob_cursor

ОПИСАНИЕ

CLOSE закрывает открытый для чтения или вставки курсор BLOB. Вообще курсор BLOB должен быть закрыт только после:

• Выборки всех сегментов BLOB для операций чтения BLOB (BLOB READ).

• Вставка всех сегментов для операций BLOB INSERT.

Может использоваться в SQL.

СИНТАКСИС

CLOSEblob_cursor;

Таблица А.11. Синтаксические конструкции команды CLOSE blob cursor

Аргумент Описание
blob_cursor Имя открытого курсора BLOB

ПРИМЕР fefc

Следующая команда внедренного SQL закрывает BLOB курсор.

EXEC SQL

CLOSE ВС;

COMMIT

ОПИСАНИЕ

COMMIT используется для завершения транзакции и записи всех изменений в базу. Делает изменения видимыми для команд в последовательностях транзакций SNAPSHOT и READ-COMMITTED.

Закрывает открытые курсоры, если параметр RETAIN не используется. Транзакция, завершенная COMMIT, считается завершенной успешно. Для завершения транзакций, открытых по умолчанию, всегда следует задавать COMMIT или ROLLBACK.

После транзакций read-only, то есть не порождающих изменений, лучше использовать COMMIT, а не ROLLBACK. Результат один и тот же, но затраты времени и места следующими транзакциями уменьшаются.

Аргумент RELEASE сохранен только для обеспечения совместимости с предыдущими версиями InterBase.

СИНТАКСИС

commit (workJ /"transaction name] (releaseJ (retain

(SNAPSHOT]] ;

Таблица А. 12. Синтаксические конструкции команды COMMIT

Аргумент Описание
WORK Используется только для совместимости с другими реляционными базами, требующими его
TRANSACTION

name

Сохраняет в базе имя транзакции. Без этого режима COMMIT воздействует на транзакцию по умолчанию
RELEASE Используется только для совместимости с ранними версиями InterBase
RETAIN ISNAPSHOT] Сохраняет изменения и текущий операционный контекст

ПРИМЕР Следующая команда фиксирует изменения в базе:

COMMIT;

Следующая команда фиксирует изменения в базе поименованной транзакции:

COMMIT TR1;

Следующая команда использует COMMIT RETAIN, чтобы сохранить изменения при поддержании текущего операционного контекста. В этом случае с точки зрения пользователя можно считать, что все изменения записаны, но транзакция как была активной, так и осталась. Все команды, как данной транзакции, так и других будут видеть данные такими же, как, если бы COMMIT RETAIN не выдавалась. В то же время при откатах после выполнения COMMIT RETAIN будет восстанавливаться состояние на момент выдачи последнего COMMIT RETAIN. Использование COMMIT RETAIN вместо пары COMMIT - SET TRANSACTION позволяет несколько ускорить обработку данных и влечет задержку разрешения доступа к измененным транзакцией данным.

COMMIT RETAIN;

CONNECT

ОПИСАНИЕ Команда CONNECT:

- Инициализирует структуры данных базы данных.

- Определяет, находится ли база данных на том же (локальная база данных) или на другом узле (удаленная база). Базы данных, используемые клиентами Windows 3.1, - всегда на удаленных серверах. Сообщение об ошибках возникает, если InterBase не может найти базу данных.

- Самостоятельно определяет имя пользователя и пароль для использования при подключении приложений к базе данных. Клиенты Windows 3.1 должны всегда посылать правильное имя пользователя и пароль.

- Соединяется с базой данных и проверяет страницу заголовка. Файл базы данных должен содержать корректную базу данных, и номер версии дисковой структуры (on-disk structure - ODS) базы данных должен быть распознан установленной версией InterBase на сервере, иначе InterBase возвращает ошибку.

При соединении с базой данных CONNECT использует заданный по умолчанию набор символов (NONE) или указанный в предыдущей команде SET NAMES. Каждый раз, когда используется CONNECT, чтобы присоединиться к базе данных, предыдущее соединение разрывается.

СИНТАКСИС

CONNECT [' 7<filespec>[' ] {USER ' username ' /'PASSWORD ■password’7] ;

В версиях, начиная с 6, синтаксис несколько расширяется

CONNECT 'filespec' {USER ' username'] {PASSWORD 'password' ] fCACHE int ] {ROLE ' rolename' ] ;

Синтаксис во внедренном SQL

CONNECT [TO ]

{ALL / DEFAULT} <config_opts>

/ LIST_<specif>;

<specif>;;= <db_specs> <config_opts>

<db_specs> .• .• = dbhandle

/ {'filespec' / :variable7 AS dbhandle <Config_opts>;;= {USER {'username1 / :variable77 {PASSWORD {'password' / :variable} 7

{ROLE {'rolename' / :variable77 /CACHE int [BUFFERS 7 7 '

Таблица А.13. Синтаксические конструкции команды CONNECT

Аргумент Описание
filespec . Имя файла базы данных. Может включать спецификацию пути и узла
USER 'username' Строка, которая определяет имя пользователя, используемое при соединении с базой данных. Сервер проверяет имя пользователя по isc.gdb-базе данных защиты. Имя пользователя на сервере нечувствительно к регистру
PASSWORD 'password' Строка, которая определяет пароль, используемый при соединении с базой данных. Сервер проверяет имя пользователя и пароль по isc.gdb-базе данных защиты. Пароль на сервере чувствителен к регистру
Аргумент Описание
CACHE int Устанавливает количество буферов кэша для базы данных, определяющее количество страниц базы, одновременно доступных программе. Если не указано, применяется значение по умолчанию (256).
ROLE 'rolename' Задает роль, с которой пользователь соединяется с базой (см. команды CREATE ROLE, GRANT).
dbhandle Дескриптор базы данных, с которой выполняется соединение (см. команду SET DATABASE).
variable Имя базовой переменной, содержащей соответствующую символьную строку.

ПРИМЕР Следующая команда открывает базу данных.

CONNECT ' testbase. gdb' USER 'SYSDBA' PASSWORD 'masterkey';

Открытие с указанием роли выглядит так

CONNECT 'testbase.gdb' USER 'SYSDBA1 PASSWORD 'masterkey' ROLE 'BIBL■;

Открытие в программе на базовом языке с предварительным объявлением базы выглядит так

EXEC SQL

SET DATABASE MYBASE = "testbase.gdb";

EXEC SQL CONNECTMYBASE;

CREATE DATABASE

ОПИСАНИЕ

CREATE DATABASE создает базу данных и устанавливает для нее следующие характеристики:

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

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

- Размер страниц базы данных. Увеличение размера страницы может улучшать работу по следующим причинам:

а) индексы работают быстрее, потому что глубина индексов уменьшается,

б) хранение длинных строк на одной странице более эффективно,

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

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

- Число страниц в каждом файле базы данных.

- Набор символов, используемый базой данных.

- Системные таблицы, которые описывают структуру базы данных.

После создания базы данных пользователь может определять ее таблицы, обзоры, индексы и системные обзоры.

При использовании сети NetWare CREATE DATABASE позволяет также определить протокол Write-ahead Log (WAL). Следует отметить, что использование сети NetWare при работе с InterBase нежелательно, поскольку накладывает существенные ограничения на использования многих команд.

СИНТАКСИС

CREATE {DATABASE / SCHEMA} ' filespec'

[USER 'username' (PASSWORD 'password'] ]

(PAGE_SIZE [=] int 7 (LENGTH [= ] int (PAGE [s] ] ]

(default CHARACTER SET charset 7 (<secondary_file>7;

<secondary_file> = FILE ' filespec1 (<fileinfo>7 f<secon-dary__file> ]

<fileinfo>: := LENGTH [=] int (PAGE(s7 7 / STARTING (AT [PAGE 77 int (<fileinfo>]

Таблица А.14. Синтаксические конструкции команды CREATE DATABASE

Аргумент Описание
filespec Спецификация файла новой базы данных. Соглашения о наименовании файла зависят от платформы (Windows> Linux ...)
USER ’username’ Имя пользователя проверяется на корректность комбинации имени пользователя и пароля в базе данных защиты по серверу, где база данных будет размещена. Клиентские приложения Windows должны указывать имя пользователя при соединении с сервером
PASSWORD

'password'

Пароль проверяется на корректность комбинации имени пользователя и пароля в базе данных защиты по серверу, где база данных будет размещена. Клиентские приложения Windows должны указывать имя пользователя и пароль при соединении с сервером
PAGE_SIZE [=] int Размер в байтах страниц базы данных. Допустимо 1024 (по умолчанию), 2048, 4096 или 8192
DEFAULT CHARACTER SET charset Устанавливает набор символов для базы данных, используемый по умолчанию; charset - имя набора символов в кавычках. Если опущено, то в качестве набора символов по умолчанию принимается NONE
FILE 'filespec' Имена одного или нескольких вторичных файлов для хранения страниц базы по заполнении первичного. Для баз данных на удаленных серверах спецификация вторичных файлов не должна содержать имя узла
STARTING [AT

/PAGE.// int

Определяет стартовый номер страницы для вторичного файла
LENGTH [=] int /page/s/7 Определяет длину первичного или вторичного файла базы данных. Для первичного файла используется только при одновременном определении вторичного файла в той же самой команде

ПРИМЕР Создает базу данных в текущей директории.

CREATE DATABASE 'testbase.gdb' ;

Создает базу данных со страницей 2048 байт (по умолчанию, 1024).

CREATE DATABASE 'testbase.gdb' PAGE_SIZE 2048;

Создает базу данных, размещенную в двух файлах, и устанавливает кодовую таблицу, используемую по умолчанию.

CREATE DATABASE 'testbase.gdb'

DEFAULT CHARACTER SET 'WIN1251'

FILE “ testbase.gdl” STARTING AT PAGE 10001 LENGTH

10000 PAGES;

CREATE DOMAIN

ОПИСАНИЕ

CREATE DOMAIN создает в базе описание столбца, которое используется как шаблон при описании столбцов таблиц в командах CREATE TABLE или ALTER TABLE. Описание домена содержит следующий набор характеристик:

• Тип данных.

• Необязательное значение по умолчанию.

• Необязательный запрет значений NULL.

• Необязательное контрольное ограничение (CHECK).

• Необязательное предложение порядка сравнения.

Ограничение контроля (CHECK) домена описывает условия <dom_search_condition>, которые должны быть истинными при вводе данных в столбец, базирующийся на описании домена. Ограничение CHECK не может ссылаться на другое описание домена или столбца.

При создании домена необходимо следить за непротиворечивостью ограничений. Например, нельзя задавать конструкции типа DEFAULT NULL NOT NULL.

Спецификация данных типов CHAR, VARCHAR или текстового BLOB может содержать указание набора символов CHARACTER SET, используемого для данных домена. Если CHARACTER SET не указан, то будет использован набор символов, используемый базой по умолчанию.

Конструкция COLLATE специфицирует порядок сравнения данных типов CHAR, VARCHAR или текстового BLOB. Выбор порядка сравнения ограничен допустимыми для набора символами, определенным в базе по умолчанию или явно заданным для домена.

Столбцы, базирующиеся на описании домена, наследуют все его характеристики. Значения по умолчанию, порядок сравнения и установка NOT NULL могут быть переопределены при описании столбцов, бази рующихся на описании домена. Ограничение домена CHECK не может быть переопределено. При указании в описании столбца конструкции CHECK она добавляется к конструкции CHECK, указанной для домена.

Замечание. Если при описании столбцов таблицы домен не указывается явно, то автоматически строится новый домен и его описание заносится в таблицу описаний доменов (RDBSFIELDS).

СИНТАКСИС

CREATE DOMAIN domain (AS] <datatype>

/DEFAULT {literal / NOLL / USER} ]

/NOT NULL 7 /CHECK (<dom_search_condition>)]

/COLLATE collation7;

Конструкция COLLATE неприменима для BLOB столбцов.

<datatype> = {

(SMALLINT / INTEGER / FLOAT / DOUBLE PRECISION} /<ar-

ray_dim> 7

(DECIMAL / NUMERIC} /(precision /, scale7)7 (<array_dim> 7

/ {DATE / TIME / TIMESTAMP} (<array_dirn>J

/ {CHAR / CHARACTER / CHARACTER VARYING / VARCHAR} ((1. . .32767)] (<array_dim>7 /CHARACTER SET

charname 7

/ (NCHAR / NATIONAL CHARACTER / NATIONAL CHAR} [VARYING./ ((1. . .32767) ] /<array_ _dim> 7 / BLOB (SUB_TYPE {int / subtype_name}7 (SEGMENT

SIZE ПJ

/CHARACTER SET charname7

/ BLOB ((seglen (, subtype7)7

}

<array_dim>:: = [ LIST_<&im> ]

Здесь квадратные скобки являются частью синтаксиса описания массивов, а не элементом метаязыка.

<dim>;;= х[: у 7 <dom_search_condition>::= {

VALUE <operator> <val>

/ VALUE {NOT] BETWEEN <val> AND <val>

/ VALUE {NOT7 LIKE <val> [ESCAPE <val>J

/ VALUE fNOT ] IN (<val> [, <val> . . .])

j VALUE IS {NOT J NULL / VALUE {NOT ] CONTAINING <val>

/ VALUE {NOT 7 STARTING {WITH7 <val>

/ (<dom_search_condition>)

/ NOT <dom_search_condition>

/ <dom_search_condition> OR <dom_search_condition>

/ <dom_search_condition> AND <dom_search_condition>

J

<operator> = {= I < / > / < = / >= / !< / !> I < > /''•-}

Замечание. Типы данных TIME | TIMESTAMP допустимы только в версиях, начиная с 6.

Таблица А.15. Синтаксические конструкции команды CREATE DOMAIN

Аргумент Описание
domain Уникальное имя создаваемого домена
<datatype> Тип данных, допустимый в SQL
DEFAULT Указывает значение, которое будет присвоено столбцу, если не было прямого присвоения. Возможные значения:

literal - указанная строка, число или дата;

NULL - задание значения NULL;

USER - имя пользователя, создающего строку. Задаваемые значения должны быть совместимы по типу с типом данных домена.

Значения по умолчанию могут быть переопределены при описании столбцов

NOT NULL Указывает, что вводимые в столбец данные не могут принимать значение NULL
CHECK

(<dom_search_cond>)

Добавляет СНЕСК-ограничение в домен. Домен может иметь только одно СНЕСК-ограничение
Аргумент Описание
VALUE Заменитель имени столбца, базирующегося на домене
COLLATE collation Определяет последовательность сравнения для домена

ПРИМЕР Следующая инструкция создает домен, который предназначен для хранения номера месяца. Ключевое слово VALUE заменяет имя столбца, базирующегося на этом домене.

CREATE DOMAIN DMONTH AS SMALLINT

CHECK (VALUE BETWEEN 1 AND 12);

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

CREATE DOMAIN D_ELEM AS

CHAR(2) CHARACTER SET WIN12 51

CHECK (value in CH', 'Li', 'Na\ 'К' ) ) ;

Следующая команда создает домен, который определяет массив символьного (CHAR) типа данных:

CREATE DOMAIN CHAR5_4_5 AS CHAR(10) [4:5] ;

Следующая команда создает домен с заданием имени пользователя, как значения по умолчанию.

CREATE DOMAIN USERNAME AS VARCHAR(2 0) CHARACTER SET WIN1251 DEFAULT . * * * '

COLLATE WIN1251

Если в таблице присутствует столбец, основанный на таком домене, то при добавлении в таблицу новой строки в это поле будет автоматически записываться имя пользователя, выполнившего добавление, если поле явно не указано в списке команды INSERT, в противном случае будет записано явно указанное значение. Для того чтобы исключить подобную «фальсификацию», следует присвоение или изменение полей типа USERNAME контролировать в триггерах.

CREATE TABLE USERNAME USERNAME, . . . ) ;

Следующая команда создает домен для BLOB с текстовым подтипом, который имеет назначенный набор символов:

CREATE DOMAIN TEXT_BLOB AS BLOB sub_type 0 segment size 80;

В этом случае команда создания таблицы без использования доменов

CREATE TABLE TBOOK (

UNIKEY PRMKEY,

MATHERKEY INTEGER,

BOOKNM VARCHAR(250) character set WIN1251 collate WIN1251, REFERAT BLOB sub_type 0 segment size 80,

NUM_ALL SMALLINT DEFAULT 0 NOT NULL,

NUM_PRESENCE SMALLINT DEFAULT 0 NOT NULL) ;

будет идентична команде с использованием домена TEXT_BLOB

CREATE TABLE ТВООК (

UNIKEY PRMKEY,

MATHERKEYINTEGER,

BOOKNM VARCHAR ( 2 5 0 ) character setWIN1251 collate WIN1251, REFERAT TEXT_BLOB,

NUM_ALL SMALLINT DEFAULT 0 NOT NULL,

NUM_PRESENCE SMALLINT DEFAULT 0 NOT NULL) ;

CREATE EXCEPTION

ОПИСАНИЕ

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

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

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

Исключения могут быть перехвачены и обработаны с помощью конструкции WHEN в хранимой процедуре или триггере (см. CREATE TRIGGER, CREATE PROCEDURE).

СИНТАКСИС

CREATE EXCEPTION name 'message';

Таблица A. 16. Синтаксические конструкции команды CREATE EXCEPTION

Аргумент Описание
name Имя исключения. Должно быть уникальным в перечне исключений базы данных
message Строка в кавычках, задающая текст исключения. Максимальная длина - 78 символов

ПРИМЕР

CREATE EXCEPTION ERR_RUBRIC 'Неверно указана рубрика для книги';

Следующая команда в триггере (хранимой процедуре) инициирует ранее описанное исключение

exception NO_RUBRIC;

Следующая команда в триггере «бандитничает» с исключением, меняя его текст

if (new.MATHERKEY is NULL or new. MATHERKEY<0 ) then BEGIN

update RDB$EXCEPTIONS SET

Rdb$message='He указана рубрика для <'

I new.BOOKNM || ’>•

where Rdb$exception_name='NO_RUBRIC1; exception NO_RUBRIC;

END

Подобная конструкция основывается на том, что:

• тексты исключений хранятся в системной таблице RDB SEXCEPTION S;

• выдача команды exception порождает откат транзакции;

• после отката транзакции все внесенные ей изменения, в том числе и в таблице RDB$EXCEPTIONS, отменяются.

CREATE GENERATOR

ОПИСАНИЕ

CREATE GENERATOR объявляет генератор в базе данных и устанавливает в 0 его начальное значение. Генератор выдает последовательные числа, которые можно автоматически вставить в столбец, используя функцию GENID (). Генератор обычно используется, чтобы гарантировать уникальность значений в первичных ключах (PRIMARY KEY), которые должны однозначно идентифицировать связанную строку, если само значение при этом не существенно.

База данных может содержать любое число генераторов. Генераторы глобальны в базе данных и могут использоваться и модифицироваться в любой транзакции. InterBase не повторяет свои значения во время выполнения транзакции.

После того как генератор создан, можно изменить его текущее значение, используя команду SET GENERATOR.

Генератор можно использовать в триггерах, хранимых процедурах и SQL операторах, вызывающих функцию GEN_ID().

Замечание. В ряде случаев можно рекомендовать использование в базе одного генератора, тогда все сгенерированные с его помощью ключи будут уникальными. Поскольку значение, выдаваемое генератором, лежит в диапазоне от -2 до 2 -1, то даже, если отказаться от отрицательных величин, можно получить более 2000000000 значений. Поэтому опасения, что в вашей базе за все время ее существования окажется большее количество строк, явно преувеличены. В любом случае базы объемом более нескольких сотен гигабайт потребуют какой-то иной платформы.

СИНТАКСИС

CREATE GENERATOR name;

Таблица А.17. Синтаксические конструкции команды CREATE GENERATOR

Аргумент Описание
name Имя генератора

ПРИМЕР Создаются генератор SYSNUMBER.

Значение, формируемое генератором, используется в триггере вставки (BEFORE INSERT) для таблицы ТВООК, обеспечивая задание уникального значения первичного ключа UNIKEY, если он не задан явно.

CREATE GENERATOR SYSNUMBER;

CREATE TRIGGER I_TBOOK_l FOR TBOOK ACTIVE BEFORE INSERT POSITION 0 as

begin

if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

CREATE INDEX

ОПИСАНИЕ Команда CREATE INDEX создает индекс для таблиц базы данных. Индексы используются для ускорения доступа к данным. Использование индексов в конструкции WHERE может значительно увеличить скорость поиска.

Столбцы BLOB и массивы не могут использоваться в индексе. Уникальный ключ (UNIQUE) не может быть создан по столбцу, который уже содержит повторяющиеся или NULL значения.

ASC или DESC указывает на порядок сортировки в индексе. Для более быстрого получения ответов на запросы, требующие отсортированных результатов, следует использовать индекс в соответствии с порядком сортировки, указанным в конструкции ORDER BY. ASC и DESC индексы могут быть построены одновременно по одному и тому же столбцу или набору столбцов для доступа к данным в разном порядке.

Замечание. Наличие индекса ускоряет поиск данных, но замедляет их изменение, поскольку при изменении данных надо модифицировать не только строки таблиц, но и всю совокупность индексов, связанных с таблицей. Для оптимизации использования индексов можно применить SET STATISTICS, позволяющую определить частоту их использования, перестроить индекс, делая его активным или неактивным с последовательными вызовами ALTER INDEX. При массовом внесении изменений можно рекомендовать следующую последовательность действий: деактивация индекса, ввод данных, активация индекса, при которой выполняется перестройка индексов (см. ALTER INDEX).

СИНТАКСИС

CREATE {^NIQ^E J /ASC {ENDING7 DESC fENDING ] 7

INDEX index ON table (LIST_col) ;

Таблица А.18. Синтаксические конструкции команды CREATE INDEX

Аргумент Описание
UNIQUE Обеспечивает контроль уникальность значений ключа
asc/ending/ Задает сортировку по возрастанию ключа (по умолчанию)
desc/ending/ Задает сортировку по убыванию ключа
index Задает уникальное в базе имя индекса
table Задает имя индексируемой таблицы
col Задает имя столбца в списке, образующем индекс

ПРИМЕР Создается индекс по фамилиям читателей в таблице:

CREATE INDEX TREADER_RDNAME ON TREADER (RDNAME) ;

Создается такой же индекс, но для выборки по фамилиям в обратном алфавитном порядке (по убыванию значений ключа). Для символьных данных эта конструкция экзотична, но для столбцов с данными типа «календарная дата» очень удобна.

CREATE DESCENDING INDEX TREADER_RDNAME ON TREADER (RDNAME) ;

Создается уникальный (UNIQUE) индекс по номерам читательских билетов:

CREATE UNIQUE INDEX TREADER_RDNUMB ON TREADER (RDNUMB); Создается индекс по двум столбцам:

CREATE UNIQUE INDEX MURA ON TREADER (RDNAME, RDNUMB);

Замечание. Второй и последний индексы для данной таблицы бессмысленны и приведены только для демонстрации синтаксиса.

CREATE PROCEDURE

ОПИСАНИЕ

CREATE PROCEDURE определяет новую хранимую процедуру в базе данных. Хранимая процедура - отдельная программа, написанная на

SQL для процедур и триггеров InterBase и хранящаяся как часть метаданных базы данных. Хранимые процедуры могут получать входные параметры и возвращать значения вызвавшим их приложениям.

Язык процедур и триггеров InterBase включают все команды SQL манипуляции данными и некоторые расширения, в том числе IF ... THEN ... ELSE, WHILE ... DO, FOR SELECT ... DO, исключения и обработку ошибок.

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

Во-вторых, выполнимые процедуры, которые приложение может вызвать непосредственно командой EXECUTE PROCEDURE. Выполнимая процедура может и не возвращать значения вызывающей программе.

Хранимая процедура вне зависимости от типа состоит из заголовка и тела.

Заголовок процедуры содержит:

- имя хранимой процедуры, которое должно быть уникальным среди имен процедур и таблиц в базе данных;

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

- RETURNS, сопровождаемая списком выходных параметров " и их типов, если процедура возвращает значения вызывающей программе.

Тело процедуры содержит:

- необязательный список локальных переменных и их типов;

- блок команд на языке процедур и триггеров InterBase в скобках

BEGIN и END. Блок может включать другие блоки, то есть иметь несколько уровней вложения. '

Поскольку каждое предложение в теле хранимой процедуры должно завершаться необходимо задать какой-либо другой символ для завершения ISQL предложения CREATE PROCEDURE. Для этих целей перед командой CREATE PROCEDURE используется команда SET TERM, задающая ограничитель, отличный от После завершения текста команды CREATE PROCEDURE вновь используется SET TERM для восстановления стандартного ограничителя ";". Если процедура создается из приложения или какой-либо специальной утилиты, то в команде SET TERM нет необходимости, более того, ее появление будет трактоваться, как синтаксическая ошибка.

InterBase не допускает изменения в хранимых процедурах структур данных, т.е. команд типа DROP TABLE, DROP EXCEPTION.

Чтобы видеть все процедуры, определенные для текущей базы данных, или текст и параметры заданной процедуры, используется внутренняя команда ISQL SHOW PROCEDURES или SHOW PROCEDURE.

Описание хранимых процедур записываются в системные таблицы. Текст тела процедуры, описание ее заголовка, кроме описания параметров, хранятся в таблице RDBSPROCEDURES, описания параметров хранятся в таблице RDB$PROCEDURE_PARAMETERS

Язык хранимых процедур и триггеров InterBase является полным языком программирования. Он включает:

• SQL команды манипулирования данными, а именно INSERT, UPDATE, DELETE и singleton SELECT.

• SQL команды и выражения, включая пользовательские функции (UDF - User Defined Functions), подключенные к базе, и генераторы.

• Расширения SQL, включая команды присвоения, управления последовательностью обработки, контекстные переменные (для триггеров), команды инициации событий, исключений и обработки ошибок.

В следующей таблице приведены команды расширения SQL.

Таблица А.19. Синтаксические конструкции расширения SQL для процедур

Команда Описание
BEGIN ... END Определяет блок команд рассматриваемых синтаксически как одна команда. Ключевое слово BEGIN помечает начало блока (открывающаяся скобка), ключевое слово END помечает конец блока (закрывающаяся скобка). Ограничитель ";" после BEGIN и END не ставится
variable = expression Оператор присвоения. Присваивает выражение столбцу, локальной переменной, входному или выходному параметру
/* comment_text */ Комментарий программиста. Может занимать несколько строк
EXCEPTION excep-tion_name Инициирует указанное исключение. Исключение - это генерируемая пользователем ошибка, которая может быть обработана с помощью оператора WHEN
Команда Описание
EXECUTE PROCEDURE proc_name /Var [, var ...]] /RETURNINGJVALUES var [, var...]] Вызывает на выполнение указанную в proc name хранимую процедуру со списком входных аргументов после имени процедуры и указанием списка возвращаемых значений, указываемого после ключевых слов RETURNINGJVALUES. Входные и выходные аргументы должны быть переменными, объявленными в процедуре. Допустимы вложенные процедуры и рекурсия
EXIT Вызывает переход к завершающему процедуру оператору END
FOR <select_statement>

DO <compound_statement>

Обеспечивает повторение составного оператора, записанного после ключевого слова DO для каждой из строк, полученных при выполнении запроса, заданного в конструкции <select_statement>. <select_statement> - обычная команда SELECT, за исключением того, что она требует конструкции INTO, завершающей команду
<compound_statement> Составной оператор - это либо отдельный оператор на языке хранимых процедур и триггеров, либо блок, заключенный в скобки BEGIN и END
IF (<condition>)

THEN <com-

pound_statement>

[ ELSE <com-pound_statement>7

Проверяет условие <condition> и, если оно принимает значение TRUE (истина), выполняет составной оператор, следующий за ключевым словом THEN, иначе выполняет составной оператор, следующий за ключевым словом ELSE, если оно указано. Условие <condition> представляет собой булевское выражение, принимающее одно из значений: (TRUE, FALSE или UNKNOWN). Обычно условие - это пара выражений, соединенных операцией сравнения (=, ! = , <, <= ...)
POST_EVENT event_name Инициирует событие event_name
SUSPEND В SELECT-процедуре SUSPEND возвращает вызывающему приложению выходные параметры для каждой строки. Не рекомендуется для выполняемых процедур (т.е. вызываемых по EXECUTE PROCEDURE)
WHILE (<condition>)

DO <compound_statement>

До тех пор пока условие <condition> является истиной (TRUE), выполняется составной оператор <compound_statement>. Сначала проверяется условие <condition> и, если оно истинно, то выполняется оператор <compound statements Цикл повторяется, пока условие остается истинным
Команда Описание
WHEN

(LIST_<error>| ANY/

DO <compound_statement>

Команда управления обработкой ошибок. Когда возникает ошибка одного из указанных видов, выполняется составной оператор <compound_statement>. Команда WHEN, если она необходима, должна располагаться в конце блока непосредственно перед END. <error>: EXCEPTION exception_name; SQLCODE errcode или GDSCODE number. ANY указывает на необходимость обработки ошибок любых ТИПОВ

СИНТАКСИС CREATE PROCEDURE name [ (LIST_<lparam>) ]

[RETURNS (LIST_<lparam>) ]

as <procedure_body> /"terminator ]

<lparam>:;= param <datatype>

<procedure_body>:;=

{<variable_declaration_list>J

<block>

<variable_declaration_list>:;=

DECLARE VARIABLE var <datatype>; {<variable_declaration_list> J

<block>: .• =

BEGIN

< с omp ound_s t a t ement>

{<compound_statement> ...]

END

<compound_statement> .• ; = {<block> / statement;} <datatype> .• = {

{SMALLINT / INTEGER / FLOAT / DOUBLE PRECISION} / {decimal / NUMERIC} {(precision [, scaleJ)J / {DATE / TIME / TIMESTAMP}

I {CHAR j CHARACTER / CHARACTEFVARYING / VARCHAR } [ ( int) ] (CHARACTER SET charname]

/ (NCHAR / NATIONAL CHARACTER / NATIONAL CHAR}

(varying} /(int)/,/

Замечание. Типы данных TIME | TIMESTAMP допустимы только в версиях, начиная с 6.

Таблица А.20. Синтаксические конструкции команды CREATE ' PROCEDURE

Аргумент Описание
name Имя хранимой процедуры. Должно быть уникальным среди имен процедур, таблиц и обзоров в базе данных
L/iST_<param

<datatype>>

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

<datatype> - любой допустимый в InterBase тип

RETURNS( L/57’_<param

«datatype»)

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

<datatype> - любой допустимый в InterBase тип.

Процедура выполняет возврат значений с помощью выходных параметров при выполнении оператора SUSPEND

AS Ключевое слово, отделяющее заголовок процедуры от ее тела
DECLARE

VARIABLE

var < datatype >

Объявляет локальные переменные, используемые только в данной процедуре. Каждое объявление должно начинаться с DECLARE VARIABLE и заканчиваться ";". var - имя локальной переменной, уникальное в перечне переменных процедуры.

<datatype> - любой допустимый в InterBase тип

statement Любой простой оператор, допустимый в SQL для хранимых процедур и триггеров. Каждый оператор (кроме блоков BEGIN-END) должен заканчиваться
terminator Ограничитель, заданный командой SET TERM и указывающий конец тела процедуры. Используется только в ISQL

ПРИМЕР

CREATE PROCEDURE PBUTHOR (CODE INTEGER)

RETURNS (AUTHORS VARCHAR (250))

AS

declare variable auname varchar(60); ■

declare variable UNIKEY integer; declare variable ws integer; begin WS=-1;

AUTHORS=' ’;

for select a.UNIKEY, b.auname from tbook a, tauthor b, tbook_author с

where (a.unikey=:Code and a.unikey=c.bookkey and с.author=b.author)

into :UNIKEY, :auname

do

begin

f(ws=-l) then authors=auname; else authors=authors||', '||auname;

ws=UNIKEY;

end

if(ws!=-l) then suspend; end

CODE - код книги (первичный ключ) в таблице книг AUTHORS - возвращаемое значение - список авторов книги в виде списка

auname, UNIKEY - рабочие переменные процедуры для считывания первичного ключа книги и фамилии автора соответственно.

ws - рабочая переменная для контроля формирования списка авторов Вызов процедуры в SELECT с параметром

select * from PbUTHOR(12)

Результат выборки Буассо Марк, Деманж Мишель, Мюнье Жан-Мари А теперь рассмотрим аналогичную процедуру, только без параметров и возвращающую данные по всем книгам с указанием по ним списка авторов. Данная процедура в процессе работы использует предыдущую.

CREATE PROCEDURE PBOOKAUTHOR RETURNS (

UNIKEY INTEGER,

MATHERKEY INTEGER,

BOOKNM VARCHAR (250) ,

AUTHORS VARCHAR (250),

REFERAT BLOB sub_type 0 segment size 80) ^

AS

begin

for select a.UNIKEY, a.matherkey, a.booknm, a.referat from tbook a order by 1

into :UNIKEY, :matherkey, :booknm, :referat

do

begin

select AUTHORS from PBUTHOR(:UNIKEY) into :AUTHORS; suspend; end

end ■

Вызов процедуры в SELECT с параметром select booknm, authors from PBOCKALJIHOR

Результат выборки

BOOKNM AUTHORS
Макрокоманды MS Word Культин Н.Б.
Word 6 for Windows Хаселир Райнер Г., Фаненштих Клаус
ЯзыкC++ Подбельский Вадим Валериевич
Введение в C++ Builder ЕлмановаН.З., Кошель СП.
Borland - Технологии. SQL-Link InterBase, Paradox for Windows, Delphi Дунаев Сергей
С и C++ Справочник Луис Дерк
Введение в технологию ATM Буассо Марк, Деманж Мишель, Мюнье Жан-Мари
The history of England. Absolute Monarchy. Бурова И.И.
Справочник по правописанию и литературной правке Розенталь Д.Э.
Тесты. Сборник 11 класс. Варианты и ответы государственного тестирования. Пособие для подготовки к тестированию. без авторов ну совсем
BOOKNM AUTHORS
Математические вопросы динамики вязкой несжимаемой жидкости. Ладыжинская Ольга Александровна
Кровь нерожденных Дашкова Полина
Тайна Хмелевская Иоанна

Поскольку процедура PBUTHOR возвращает в точности одну строку, то вместо команды

select AUTHORS from PBUTHOR(:UNIKEY) into :AUTHORS;

в процедуре PBOOKAUTHOR можно использовать просто вызов процедуры PBUTHOR

execute procedure PBUTHOR :UNIKEY RETURNING_VALUES :AUTHORS;

CREATE SHADOW

ОПИСАНИЕ

CREATE SHADOW применяется, чтобы избежать потери доступа к базе за счет создания одной или нескольких копий базы на дополнительных устройствах. Каждая копия содержит один или несколько "теневых" файлов, образующих теневой набор. Каждый теневой набор идентифицируется положительным целым числом.

Теневой диск содержит три компоненты:

• Базу данных, для которой создается тень.

• Системную таблицу RDBSFILES, содержащую список теневых файлов и другие данные о базе.

• Теневой набор, содержащий один или несколько файлов тени.

При выдаче CREATE SHADOW тень устанавливается по последней подключенной к приложению базе. Теневой набор состоит из одного или нескольких файлов. В случае отказа диска администратор базы данных может активировать теневой диск так, что он займет место базы данных.

Если указан режим CONDITIONAL, то при активации администратором базы данных теневого диска для замены основной базы создается новая тень. Если размер базы превышает доступное на диске пространство для тени на одном диске, можно использовать режим вторичных файлов <secondary_file>, чтобы задать несколько файлов тени, которые можно распределить по разным дискам.

Чтобы добавить вторичный файл к существующей тени, нужно удалить тень (DROP SHADOW) и пересоздать с помощью CREATE SHADOW с требуемым числом файлов.

СИНТАКСИС

CREATE SHADOW set_num [AUTO / MANUAL} /'CONDITIONAL] 'filespec' /’LENGTH [=] int [PAGE [s] ]

[<secondary_file>];

<secondary_file> FILE 'filespec' [<fileinfo>7 [<secon-dary_file>7

<fileinfo>::= LENGTH [=] int [PAGE [S] \ STARTING /AT

[PAGE] 7 int [<fileinfo>7

Таблица А.21. Синтаксические конструкции команды CREATE SHADOW

Аргумент Описание
set_num Положительное целое, идентифицирующее теневой набор, к которому принадлежат все файлы, перечисленные в команде
AUTO Определяет заданное по умолчанию поведение доступа для баз данных в случае недоступности тени. Все приложения и соединения сохраняются; ссылки к тени удаляются, а теневой файл отключается
MANUAL Определяет, что соединения с базой данных будут разрываться до тех пор, пока тень не станет доступной или все ссылки на нее не будут удалены из базы данных
CONDITIONAL Создает новую тень, позволяя продолжить работу, если первичная тень становится недоступной или если тень заменяет базу данных из-за дискового отказа
filespec Имя файла с указанием пути доступа для файла тени. Спецификация теневого файла не может содержать имени узла
LENGTH [=] int /PAGE/s/У Размер теневого файла в страницах базы данных. Размер страницы здесь определяется размером страницы самой базы
Аргумент Описание
<secondary_file> Задает характеристики вторичного файла, включая длину. Используется для первичного файла только, если вторичный файл задается в той же команде
STARTING /AT [PAGE]] int Задает стартовый номер страницы, с которой начинается вторичный файл тени

ПРИМЕР Создается автоматическая тень с режимом AUTO для testbase.gdb (один файл).

CREATE SHADOW 1 AUTO 'testbase.shd';

Создается автоматическая тень с режимом CONDITIONAL для testbase.gdb (один файл).

CREATE SHADOW 2 CONDITIONAL ' testbase.shd' LENGTH 10 00 ;

Следующие команды создают многофайловые наборы теней для базы данных testbase.gdb. В первом задаются стартовые страницы для файлов тени, количество страниц в файлах тени. •

CREATE SHADOW 3 AUTO '

’testbase.shl1 FILE 1testbase.sh2' \

STARTING AT PAGE 1000 FILE 1testbase.sh3'

STARTING AT PAGE 2 00 0;

CREATE SHADOW 4 MANUAL 'testbase.sh4'

LENGTH 10 00

FILE 1testbase.shl'

LENGTH 10 00 FILE 1testbase.sh2';

CREATE TABLE

ОПИСАНИЕ

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

CREATE TABLE поддерживает несколько режимов для описания столбцов:

• Локальные столбцы специфицируются именем и типом данных.

• Вычисляемые столбцы основываются на выражениях. Значения столбцов вычисляются при обращении к таблице. Если тип не специфицирован, то InterBase выбирает подходящий.

• Столбцы, базирующиеся на доменах, наследуют все характеристики домена. Кроме того, описания столбца могут содержать новые значения по умолчанию, атрибуты NOT NULL, дополнительные виды контроля (CHECK) и режимы упорядочения, которые дополняют или замещают указанные в описании домена.

Для данных символьных типов CHAR, VARCHAR, текстовый BLOB описание может включать конструкцию CHARACTER SET, специфицирующую указываемый символьный набор для конкретного столбца. Если конструкция CHARACTER SET не указана явно, то используется символьный набор, принятый по умолчанию для базы данных. Если набор символов изменен, все последовательно определенные столбцы будут иметь новый набор символов, набор символов для существующих столбцов при этом не изменится.

Предложение COLLATE задает порядок сравнения символьных данных типов CHAR, VARCHAR и текстов BLOB. Выбор порядка сравнения ограничен в зависимости от набора символов столбца, который является или заданным по умолчанию набором символов для всей базы данных, или набором, определенным в предложении CHARACTER SET как часть определения типа данных.

В частности, если для базы данных указан DEFAULT CHARACTER SET NONE, то нельзя указывать CHARACTER SET для отдельных столбцов, при попытках сортировки данных будут возникать ошибки. Для CHARACTER SET WIN 1251 (русский) допустимы COLLATE WIN 1251 (по умолчанию) или COLLATE PDXCYRL. В первом случае упорядочение производится в порядке возрастания кодов (так же, как и при CHARACTER SET NONE) - прописная латынь, строчная латынь, прописная кириллица, строчная кириллица, во втором при сортировке порядок не зависит от того, являются ли буквы прописными или строчными.

NOT NULL - атрибут, который предотвращает ввод NULL (пустых) или неизвестных значений в столбце. NOT NULL воздействует на все операции INSERT и UPDATE в столбце.

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

CREATE TABLE может создавать следующие типы ограничений целостности:

• Ограничения PRIMARY KEY задают уникальные идентификаторы для каждой строки в таблице. Значения в этом столбце или упорядоченном наборе столбцов не могут повторяться в таблице. Столбец (их может быть несколько), входящий в первичный ключ

- PRIMARY KEY должен также иметь атрибут NOT NULL. Таблица может иметь только одно ограничение PRIMARY KEY, которое может быть определено на одном или нескольких столбцах.

• Уникальные (UNIQUE) ключи гарантируют, что никакие две строки не имеют то же самое значение в таблице для указанного столбца или упорядоченного набора столбцов. Столбец (их может быть несколько), входящий в уникальный ключ должен также иметь атрибут NOT NULL. Таблица может иметь несколько уникальных (UNIQUE) ключей. Уникальный (UNIQUE) ключ может быть использован в качестве внешнего ключа (FOREIGN KEY) в другой таблице.

Ссылочные ограничения гарантируют, что значения в наборе столбцов, которые определяют внешний ключ (FOREIGN KEY), - те же самые, что и значения в уникальном (UNIQUE) или первичном ключе (PRIMARY KEY) в указанной таблице. Прежде чем будет создано ссылочное ограничение, в таблице, на которую строится ссылка, должен уже быть определен уникальный или первичный ключ.

Ограничения контроля (CHECK) задают условие <search_condition>, которое должно быть истинно для вставок или модификаций к указанной таблице. <Search_condition> может проверять вводимые данные на принадлежность к допустимому диапазону значений или сравнивать их с данными других столбцов, а также с результатами поиска по существующей базе данных.

Для непоименованного ограничения система назначает уникальное имя ограничения, сохраненное в таблице системы RDB$RELATION_CONSTRAINTS.

Конструкция EXTERNAL FILE объявляет, что данные создаваемой таблицы размещаются во внешнем по отношению к базе данных файле (не InterBase). Конструкция EXTERNAL FILE используется для создания таблиц InterBase, основанных на данных внешних источников, в том числе управляемых другими операционными системами или приложениями, а также для передачи данных в существующие таблицы InterBase из внешних файлов.

СИНТАКСИС

CREATE TABLE table {EXTERNAL fFI^} 'filespec']

(<col_def> {, <col_def> / <tconstraint> ■■•]);

<col„def > .• .• = col {datatype / COMPUTED [■BY] (<expr>) / domain }

/■DEFAULT {literal / NULL / USER}]

/"HOT NULL 7 {<col_constraint>7 {COLLATE collation}

Конструкция COLLATE неприменима к BLOB столбцам.

<dat atype>- {

{SMALLINT / INTEGER / FLOAT / DOUBLE PRECISION} f<ar-ray_dim>]

I {DECIMAL / NUMERIC} {(precision {, scale})} {<array_dim> J

/ {DATE / TIME / TIMESTAMP} /"<array_dim>]

I {CHAR / CHARACTER / CHARACTER VARYING / VARCHAR}

. {(int) } {<array_dim>] {CHARACTER SET charname J

/ {NCHAR / NATIONAL CHARACTER / NATIONAL CHAR} {VARYING} /"(int)} /”<array_dim>}

/ BLOB {SUB_TYPE {int / subtype_name} ]

{SEGMENT SIZE int} /CHARACTER SET charname}

/ BLOB { (seglen {, subtype7 ) 7

<array_dim> ; = [ LTST^dim?]

Квадратные скобки здесь - это часть синтаксиса, а не метаязыка (в квадратных скобках задается размерность массива).

<dim> ; : = х f :у}

<expr> - любое корректное SQL выражение, возвращающее отдельную величину (BLOB и массив не допускаются) .

<col_constraint>: ; = /CONSTRAINT constraint} <con-straint_def>

<COnstraint_def>; ••= {UNIQUE / PRIMARY KEY I REFERENCES other_table { (LIST_0ther_C0l)]

{ON DELETE {NO ACTION /CASCADE /SET DEFAULT /SET NULL} ]

[ON UPDATE {NO ACTION/CASCADE/SET DEFAULT /SET NULL} ]

I CHECK (<search_condition>)}

<tconstraint> CONSTRAINT constraint <tconstraint_def> {<tconstraint> ]

<tconstraint_def> •• ■•= {{PRIMARY KEY / UNIQUE} (LIST_col)

/ FOREIGN KEY (LIST_COl) REFERENCES Other_table [ou DELETE {NO ACTION/CASCADE /SET DEFAULT /SET NULL} ]

{ON UPDATE {NO ACTION /^AS^WE/ SET DEFAULT /SET NULL} 7

/ CHECK (<search_condition>)}

<search_condition>::=

{<val> <operator> {<val> / (<select_one>)}

I <val> {NOT] BETWEEN <val> AND <val>

/ {not} LIKE <val> {ESCAPE <val>7 '

/ <val> {notJ IN (LIST_<val> / <select_list>)

/ <val> IS {NOT 7 NULL

/ <val> {{NOT7 {= I < I >} I >= /< = }

{ALL / SOME / ANY} (<select_list>)

/ EXISTS (<select_expr>)

/ SINGULAR (<select_expr>)

/ <val> {NOT ] CONTAINING <val>

/ <val> {NOT} STARTING {WITH7 <val>

/ (<search_condition>)

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_condition>}

<val>;{

col [<array_dim>] j <constant> / <expr> j <function> / NULL / USES / RDB$DB_KEY

} (COLLATE collation]

<constant>; .• = num / "string" / charsetname "string" <function> = {

COUNT (* / (ALL7 <val> / DISTINCT <val>)

/ SUM ( (ALL7 <val> / DISTINCT <val>)

/ AVG ( (ALL7 <val> / DISTINCT <val>)

/ MAX ( [ALL] <val> / DISTINCT <val>)

/MIN ( [kUu] <val> / DISTINCT <val>)

/ CAST (<val> AS <datatype>)

/ UPPER (<val>)

' / GEN_ID (generator, <val>) ,

}

<operator>: = {= /< /) /<= /)= / !< / !) / <> / ! = }

<select_one) - SELECT с одним столбцом, возвращающий в точности одно значение.

<select_list) - SELECT с одним столбцом, возвращающий несколько значений.

<select_expr) - SELECT, возвращающий список значений и несколько строк.

Замечание. Типы данных TIME | TIMESTAMP допустимы только в версиях, начиная с 6.

Таблица А.22. Синтаксические конструкции команды CREATE TABLE

Аргумент Описание
Table Имя таблицы. Имядолжно быть уникальным внутри базы в списке имен таблиц и процедур
EXTERNAL /FILE/

'filespec'

Объявляет, что данные создаваемой таблицы размещаются во внешнем по отношению к базе данных файле. Имя и полный путь к файлу задаются в filespec
col Имя столбца. Имя должно быть уникальным внутри таблицы в списке имен столбцов
Аргумент Описание
<datatype> Тип данных для столбца
COMPUTED /BY ] (<expr>) Описывает вычисляемый столбец. Конструкция <ехрг> задает порядок вычисления. <ехрг> может быть любым допустимым в SQL выражением, возвращающим единственное значение (массивы и BLOB недопустимы). Все столбцы, участвующие в вычислении, должны существовать на момент ввода вычисляемого столбца
domain Имя домена, на который опирается описание столбца
COLLATE collation Задает вид упорядочения для таблицы. Если COLLATE задано также и для базового домена, то данная конструкция переопределяет доменную
DEFAULT Устанавливает значение по умолчанию, присваиваемое столбцу, если wo значение не установлено явно. Возможные значения: literal - указанная строка, число или дата;

NULL - задание значения NULL;

USER - имя пользователя создающего строку. Задаваемые значения должны быть совместимы по типу с типом данных столбца.

Значение по умолчанию для столбца переопределяет значение, заданное на доменном уровне

CONSTRAINT constraint Задает имя ограничения на таблицу или столбец. Ограничение задает правило контроля или организации данных. Если конструкция не указана, InterBase генерирует системное имя
NOT NULL Указывает, что столбец не может содержать значение NULL. Если таблица содержит строки, то кроме NOT NULL следует задавать и значение по умолчанию (см. DEFAULT)
references . . .on delete { no action | cascade | set default | set null} Обеспечивает синхронное изменение внешнего ключа и первичного.

No action - не меняет внешний ключ, может повлечь возникновение ошибки, тогда удаление отменяется Cascade - удаляет строки соответствующие внешнему ключу.

Set default устанавливает значения во внешнем в соответствии со значениями по умолчанию. Если значение по умолчанию не находится в первичном ключе, то удаление отменяется. Значения по умолчанию устанавливаются при определении ограничений. Дальнейшее их изменение не влияет на значе- .

Аргумент Описание
ния, используемые ограничениями.

Set null - значения внешнего ключа устанавливаются в NULL

references . . .on update {no action | cascade | set default | set null} Обеспечивает синхронное изменение внешнего ключа и первичного.

No action - не меняет внешний ключ, может повлечь возникновение ошибки, тогда изменение отменяется Cascade - заменяет значения во внешнем ключе по первичному.

Set default устанавливает значения во внешнем в соответствии со значениями по умолчанию. Если значение по умолчанию не находится в первичном ключе, то удаление отменяется. Значения по умолчанию устанавливаются при определении ограничений. Дальнейшее их изменение не влияет на значения, используемые ограничениями.

Set null - значения внешнего ключа устанавливаются bNULL

ПРИМЕР Создается таблица с первичным ключом на уровне столбца

CREATE TABLE TBOOK (

UNIKEY PRMKEY PRIMARY KEY,

MATHERKEY INTEGER,

BOOKNM VARCHAR (250) ,

REFERAT BLOB sub_type 0 segment size 80,

NUM_ALL SMALLINT DEFAULT 0 NOT NULL, '

NUM_PRESENCE SMALLINT DEFAULT 0 NOT NULL) ;

Создается таблица с вычисляемыми столбцами и первичным ключом на уровне таблицы.

CREATE TABLE TBOOK_AUTHOR (

UNIKEY PRMKEY,

AUTHOR PRMKEY,

BOOKKEY PRMKEY,

B1 COMPUTED BY ((select a.auname from tauthor a where a.author=tbook_author.author)) ,

B2 COMPUTED BY ( (select a.booknm from tbook a where a.unikey=tbook_author.bookkey)) ,

CONSTRAINT pk_TBOOK_AUTHOR PRIMARY KEY (UNIKEY)

) ;

Создается таблица с первичным ключом на уровне столбца и уникальным ключом на уровне таблицы и явным указанием символьного набора (character set) и схемы упорядочения (collate).

CREATE TABLE TREADER (

UNIKEY PRMKEY PRIMARY KEY,

RDNUMB VARCHAR (25) character set WIN1251 collate WIN1251,

RDNAME VARCHAR (60) character set WIN1251 NOT NULL collate PXW_CYRL, CONSTRAINT TREADER_RDNAME UNIQUE (RDNAME)

);

CREATE TRIGGER

ОПИСАНИЕ

CREATE TRIGGER определяет новый триггер в базе данных. Триггер - отдельная программа, связанная с таблицей или обзором, которая автоматически исполняется, когда строка в таблице или обзоре вставляется, модифицируется или удаляется.

Триггер никогда не называется непосредственно. Вместо этого, когда приложение или пользователь пытаются ВСТАВЛЯТЬ, МОДИФИЦИРОВАТЬ или УДАЛЯТЬ строку в таблице, выполняются все триггеры, связанные с этой таблицей и операцией. Триггеры, определенные для МОДИФИКАЦИИ, на необновляемых обзорах вызываются, даже если никакая модификация не происходит.

Триггер состоит из заголовка и тела.

Заголовок триггера содержит:

- имя триггера, уникальное в пределах базы данных, которая отличает данный триггер от всех других;

- имя таблицы, идентифицирующее таблицу, к которой присоединяется триггер;

- операцию, при которой включается триггер.

Тело триггера содержит:

- необязательный список локальных переменных с указанием их типов данных;

- блок команд на языке процедур и триггеров InterBase в скобках BEGIN - END. Эти команды выполняются при инициации триггера. Блок может самостоятельно включать другие блоки, так что они могут иметь много уровней вложения.

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

манда SET TERM непосредственно перед выдачей CREATE TRIGGER, чтобы определить признак конца, отличный от (точки с запятой). После тела триггера снова помещается команда SET TERM, чтобы восстановить ограничитель ";" (точку с запятой). Если триггер создается из приложения или какой-либо специальной утилиты, то в команде SET TERM нет необходимости, более того, ее появление будет трактоваться, как синтаксическая ошибка.

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

Триггеру могут быть предоставлены привилегии на таблицы (в процессе своего выполнения триггер может работать со многими таблицами), так же, как пользователю или процедуре. Для этого используется команда GRANT, но вместо использования конструкции ТО username следует указывать ТО TRIGGER trigger_name. Привилегии триггера могут отменяться аналогично на основе конструкции REVOKE.

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

- триггер имеет привилегии для доступа и/или изменения данных;

- пользователь имеет привилегии для доступа и/или изменения данных.

Язык хранимых процедур и триггеров InterBase является полным языком программирования. Он включает:

• SQL-команды манипулирования данными (INSERT, UPDATE, DELETE и singleton SELECT);

• SQL-команды и выражения, включая пользовательские функции (UDF - User Defined Functions), подключенные к базе, и генераторы;

• Расширения SQL, включая команды присвоения, управления последовательностью обработки, контекстные переменные (для триггеров), команды инициации событий, исключений и обработки ошибок.

В следующей таблице приведены команды расширения SQL.

Таблица А.23. Синтаксические конструкциирасширения SQL для триггеров

Команда Описание
BEGIN . . . END Определяет блок команд рассматриваемых синтаксически как одна команда. Ключевое слово
Команда Описание
BEGIN помечает начало блока (открывающаяся скобка), ключевое слово END помечает конец блока (закрывающаяся скобка). Ограничитель после BEGIN и END не ставится
Variable = expression Оператор присвоения; присваивает выражение столбцу, локальной переменной, входному или выходному параметру
/* comment_text */ Комментарий программиста. Может занимать несколько строк
EXCEPTION excep-tion_name Инициирует указанное исключение. Исключение - это генерируемая пользователем ошибка, которая может быть обработана с помощью оператора WHEN
EXECUTEPROCEDURE proc_name /Var [, var...]] [ RETURNIN G_V ALUES var [, var...]] Вызывает на выполнение указанную в proc_name хранимую процедуру со списком входных аргументов, задаваемых после имени процедуры, и списком возвращаемых значений, задаваемого после ключевых слов RETURNING_VALUES. Входные и выходные аргументы должны быть переменными, объявленными в процедуре. Допустимы вложенные процедуры и рекурсия
FOR <select_statement>

DO <com-pound_statement>

Обеспечивает повторение составного оператора, записанного после ключевого слова DO, для каждой из строк, полученных при выполнении запроса, заданного в конструкции <select_statement>. <select_statement> - обычная команда SELECT, за исключением того, что требует конструкции INTO, завершающей команду
<compound_statement> Составной оператор - это либо отдельный оператор на языке хранимых процедур и триггеров, либо блок, заключенный в скобки BEGIN и END
IF (<condition>)

THEN <com-pound_statement>

[ELSE <com-pound_statement> ]

Проверяет условие <condition> и, если оно принимает значение TRUE (истина), выполняет составной оператор, следующий за ключевым словом THEN, иначе выполняет составной оператор, следующий за ключевым словом ELSE, если оно указано. Условие <condition> представляет собой булевское выражение, принимающее одно из значений: (TRUE, FALSE или UNKNOWN). Обычно условие - это пара выражений, соединенных операцией сравнения (=, ! = , <,< = ...)
Команда Описание
POST_EVENT event_name Инициирует событие event_name
SUSPEND В SELECT-процедуре SUSPEND возвращает вызывающему приложению выходные параметры для каждой строки. Не рекомендуется для выполняемых процедур (т.е. вызываемых по EXECUTE PROCEDURE)
WHILE (<condition>)

DO <com-pound_statement>

До тех пор пока условие <condition> является истиной (TRUE), выполняется составной оператор <compound_statement>. Сначала проверяется условие <condition> и, если оно истинно, то выполняется оператор <compound_statement>. Цикл повторяется, пока условие остается истинным
WHEN

(<error> [, <error> .../ | ANY/

DO <com-pound_statement>

Команда управления обработкой ошибок. Когда возникает ошибка одного из указанных видов, выполняется составной оператор <compound_statement>. Команда WHEN, если она необходима, должна располагаться в конце блока непосредственно перед END. <error>: EXCEPTION exception_name;

SQLCODE errcode или GDSCODE number.

ANY указывает на необходимость обработки ошибок любых типов.

СИНТАКСИС

CREATE TRIGGER name FOR table /ACTIVE / INACTIVE]

{before / after}

{delete / INSERT / UPDATE}

/ ” POSITION number J AS <trigger_body> terminator

<trigger_body>::=

f<variable_declaration_list>] <block>

<variable„declaration_list>:;=

DECLARE VARIABLE variable <datatype>; /"<variable_declaration_list> ]

<block>::=

BEGIN

<compounds>

END

<compounds>; : =<compound_statement> /"<compounds> } <compound_statement>= {<block> / statement;}

<datatype>::= {

{SMALLINT / INTEGER / FLOAT / DOUBLE PRECISION}

/ {DECIMAL / NUMERIC} {(precision [, scale})}

/ {DATE / TIME / TIMESTAMP}

/ {CHAR / CHARACTER / CHARACTER VARYING / VARCHAR} [ (1. . .32767) J {CHARACTER SET charname J / {NCHAR / NATIONAL CHARACTER / NATIONAL CHAR} {varying} {(1.. .32767)]}

Замечание. Типы данных TIME j TIMESTAMP допустимы только в версиях, начиная с 6.

Таблица А.24. Синтаксические конструкции команды CREATE TRIGGER

Аргумент Описание
Name Имя триггера. Имя должно быть уникально в базе данных
Table Имя таблицы или обзора, при выполнении операций над которыми запускается триггер
ACTIVE Режим, означающий, что триггер включен (по умолчанию)
INACTIVE Режим, означающий, что триггер выключен
BEFORE Указывает, что триггер запускается перед выполнением данной операции
AFTER Указывает, что триггер запускается после выполнением данной операции
DELETE | INSERT | UPDATE Указывает операцию, инициирующую триггер
Аргумент Описание
POSITION number Определяет порядок запуска триггеров для выполнения до или после данной операции. Параметр number - целое в диапазоне от 0 до 32767 (по умолчанию - 0). Триггеры запускаются в порядке возрастания их номеров.

Порядок выполнения триггеров на одну и ту же операцию с одинаковыми номерами не определен (случаен)

DECLARE VARIABLE var

<datatype>

Объявляет локальные переменные, используемые только в данном триггере. Каждое объявление должно начинаться с DECLARE VARIABLE и заканчиваться

var - имя локальной переменной, уникальное в перечне переменных триггера; <datatype> - любой допустимый в InterBase тип

statement Любой простой оператор, допустимый в SQL для хранимых процедур и триггеров. Каждый оператор (кроме блоков BEGIN -END) должен заканчиваться
terminator Ограничитель, заданный командой SET TERM, указывающий конец тела процедуры. Используется только в ISQL

ПРИМЕР Триггер ITBOOKAUTHOR1 обеспечивает формирование при необходимости уникального первичного ключа и проверяет заполнение обязательных полей. Кроме того, триггер проверяет ссылочную целостность по таблицам TAUTHOR и ТВООК. Последнюю проверку можно также реализовать с помощью внешних ключей, что в большинстве случаев и проще и эффективней. Задание POSITION 0 обеспечивает, что данный триггер будет выполняться первым в группе триггеров вставки.

SET TERM ! ! ;

CREATE TRIGGER I_TB00K_AUTH0R_1 FOR TBOOK_AUTHOR ACTIVE BEFORE INSERT POSITION 0 as

begin

if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.AUTHOR is NULL) then exception NO_AUTHORKEY; if (new.BOOKKEY is NULL) then exception NO_BOOKKEY; if (NOT EXISTS(select * from TAUTHOR where (AUTHOR=new.AUTHOR)))

then exception NO_AUTHORKEY; if (NOT EXISTS(select * from TBOOK where (UNIKEY=new.BOOKKEY)))

then exception NO_BOOKKEY; end ! 1

SET TERM ; ! !

Триггер I_TBOOK_READER_l используется для генерации уникального номера в таблицу выдачи книг и проверяет правильность заполнения ссылок на таблицы читателей TREADER и книг ТВООК. Последнюю проверку можно также реализовать с помощью внешних ключей. И, наконец, проверяется наличие требуемой книги (поле num_presence таблицы ТВООК). В случае если такая книга есть, счетчик наличия num_presence в таблице ТВООК уменьшается на 1.

SET TERM ! ! ;

CREATE TRIGGER I_TBOOK_READER_l FOR TBOOK_READER ACTIVE BEFORE INSERT POSITION 0 '

as

declare variable nurn smallint; begin

if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1); i

if (new.READER is NULL) then exception NO_READERKEY;

if (new.BOOKKEY is NULL) then exception NO_BOOKKEY; if (NOT EXISTS(select * from TREADER where (UNIKEY=new.READER))) then exception NO_READERKEY; if (NOT EXISTS(select * from TBOOK wh e r e (UNIKEY=new.BOOKKEY))) then exception NO_BOOKKEY; select num_presence from TBOOK where (UNIKEY=new. BOOKKEY) into :num; if(num < 1) then exception NO_PRESENCE; update TBOOK set num_presence=:num; end ! !

SET TERM ; ! !

Триггер D_TBOOK_READER используется для обработки возврата книги, которому соответствует удаление записи из таблицы выдачи книг TBOOK_READER. В результате его работы увеличивается на 1 счетчик наличия книг numpresence в таблице ТВООК. Вообще говоря, изменение данных в другой таблице порождает включение соответствующих триггеров этой таблицы.

SET TERM ! ! ;

CREATE TRIGGER D_TBOOK_READER FOR TBOOK_READER ACTIVE BEFORE DELETE POSITION 0 AS

BEGIN

update tbook set num_presence=num_presence+l

where unikey=old.bookkey;

END

SET TERM ; !!

CREATE VIEW

ОПИСАНИЕ

CREATE VIEW описывает обзор данных, основанных на одной или нескольких таблицах базы данных. Строки обзора определяются командой SELECT, которая задает состав выводимых данных. В базе сохраняется только описание обзора, результаты выборки не запоминаются. В дальнейшем доступ к данным обзора осуществляется как к обычным таблицам, хотя сами они представляют лишь результаты выборки, которая осуществляется в момент обращения к обзору.

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

Указание имен столбцов в обзоре гарантирует, что обзор всегда содержит те же самые столбцы и столбцы всегда имеют те же самые имена. Имена столбцов и их порядок в обзоре соответствуют перечисленным в <select> (даже если перечень столбцов не указан явно).

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

Любые столбцы и используемые в выражении значения должны существовать прежде, чем выражение будет определено.

Предложение (конструкция) SELECT-команды не может включать предложение ORDER BY.

Когда используется конструкция SELECT *, а не список столбцов, порядок вывода основан на порядке, в котором столбцы хранятся в основной таблице.

Конструкция WITH CHECK OPTION дает возможность InterBase предотвратить добавление или модификацию обзора, если он не удовлетворяет условию выборки строк (опция where конструкции select). Не следует использовать WITH CHECK OPTION для обзора только для чтения. Обзор может быть использовано для обновления (обновляем), если:

. он является подмножеством одиночной таблицы или другого обновляемого обзора;

- все основные столбцы таблицы, исключенные из определения обзора, допускают значения NULL;

- конструкция SELECT обзора не содержит подзапросов, предикатов DISTINCT, предложения HAVING, агрегатных функций, присоединенных таблиц, определяемых пользователем функций (UDF), хранимых процедур.

Если определение обзора не удовлетворяет этим условиям, то это обзор только для чтения (read-only).

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

СИНТАКСИС

CREATE VIEW name [{LIST_v iew_c]l)

AS <select> [with CHECK option} ;

Таблица А.25. Синтаксические конструкции команды CREATE VIEW

Аргумент Описание
name Имя обзора. Должно быть уникальным в базе данных среди имен обзоров, таблиц и процедур
view_col Имя столбца обзора. Должно быть уникальным в обзоре среди имен столбцов. Обязательно, если обзор включает вычисляемые столбцы, иначе - не обязательно. По умолчанию имена столбцов берутся из соответствующих таблиц
<select> Задает состав и условия выборки данных
WITH CHECK OPTION Предотвращает операции INSERT или UPDATE в обновляемом обзоре, если INSERT или UPDATE нарушают условия поиска, указанные в опции WHERE конструкции <seiect> обзора

ПРИМЕР Обновляемый обзор - перечень книг. Строки таблицы ТВООК, соответствующие рубрикам отсечены. Данный обзор непосредственно не пригоден для обновления, поскольку содержит поля из нескольких таблиц.

CREATE VIEW NORUBRICS (

UNIKEY,

BOOKNM,

Bl)

AS select a.UNIKEY, a.BOOKNM, b.Bl from tbook a, tbook_author b where a.matherkey>0 and a.unikey=b.bookkey;

Следующий обзор получен из предыдущего удалением столбца В1. Теперь все столбцы обзора выбираются из одной таблицы. Обзор можно обновлять. Добавить здесь конструкцию WITH CHECK OPTION нельзя, поскольку -контроль осуществляется построчно, а столбца matherkey в обзоре нет,

CREATE VIEW NORUBRICS (

UNIKEY,

BOOKNM)

AS select a.UNIKEY, a.BOOKNM from tbook a where a.matherkey>0;

Команда обновления может выглядеть так:

update norubricl set

BOOKNM='Тайна за 7 печатями и одной пломбой' whereunikey=18;

Теперь рассмотрим еще раз первый обзор и добавим к нему триггер. После этого можно будет выполнять команды обновления.

CREATE TRIGGER NORUBRICS_BU FOR NORUBRICS ACTIVE BEFORE UPDATE POSITION 0 AS

BEGIN

if ( (new.unikey is NULL or new. unikey=old. unikey) and (new.bl is NULL or new.bl = old.bl) ) then update tbook set tbook.BOOKNM=new.booknm where tbook.unikey=old.unikey;

END

Отметим, что команды удаление и вставка будут отклонены. Для их подключения необходимо добавить соответствующие триггеры.

DECLARE CURSOR

ОПИСАНИЕ

DECLARE CURSOR объявляет набор строк, которые могут быть получены на его основе. DECLARE CURSOR - первая команда группы команд табличных курсоров, которые должны использоваться последовательно.

Конструкция выборки <select> определяет предложение SELECT, задающее выбираемые строки. Предложение SELECT не должно содержать конструкции INTO и ORDER BY .

Конструкция FOR UPDATE OF необходима для обновления и удаления строк в режиме, использующем конструкцию WHERE CURRENT OF в операциях обновления (UPDATE) и удаления (DELETE).

Курсор представляет собой односторонний указатель в упорядоченном наборе строк, полученных по выражению выбора команды DECLARE CURSOR. Это предполагает последовательный доступ к полученным строкам. Имеются четыре связанных команды курсора.

Таблица А.26. Команды работы с курсором

Jfen/n Команда Назначение
1 DECLARE CURSOR Объявляет курсор. Предложение

SELECT задает получаемые курсором строки

2 OPEN Получает строки, специфицированные в DECLARE CURSOR. Полученные строки образуют активный набор курсора
3 FETCH Получает текущую строку активного набора, начиная с первой. Последовательное выполнение команд FETCH перемещает курсор по набору
4 CLOSE Закрывает курсор и освобождает системные ресурсы

Команда может использоваться в SQL и DSQL. SQL форма:

DECLARE cursor CURSOR FOR <select>

[:FOR UPDATE OF LIST_<C0l> ] ;

DSQL форма:

DECLARE cursor CURSOR FOR <statement_id>

BLOB форма:

DECLARE cursor (BLOB)

Таблица А. 27. Синтаксические конструкции команды DECLARE CURSOR

Аргумент Описание
cursor Имя курсора
<select> Определяет состав получаемых строк
FOR UPDATE OF L1ST_< col> Разрешает команды UPDATE и DELETE для указанных столбцов полученных строк
<statement_id> Имя ранее подготовленной команды SQL. В данном случае команды SELECT. Только в DSQL.

ПРИМЕР Следующая команда внедренного SQL объявляет курсор с условием поиска:

EXEC SQL

DECLARE Mcursor CURSOR FOR

SELECT UNIKEY, MATHERKEY, BOOKNM FROM TBOOK;

Следующая команда DSQL объявляет курсор для предварительно подготовленной команды Dquery:

DECLARE Dcursor CURSOR FOR Dquery;

DECLARE CURSOR (BLOB)

ОПИСАНИЕ

DECLARE CURSOR (BLOB) объявляет курсор для чтения и вставки BLOB-данных. Курсор BLOB может быть связан только с одним столбцом BLOB.

Для чтения сегментов BLOB в случаях, когда переменная базового языка меньше длины сегмента BLOB, следует объявить курсор BLOB с опцией MAXIMUM^SEGMENT. Если длина меньше сегмента BLOB, FETCH вернет заданное число байтов, иначе - весь сегмент (принято по умолчанию).

Эта команда может быть использована в SQL.

СИНТАКСИС

DECLARE cursor CURSOR FOR {READ BLOB column FROM table

/ INSERT BLOB column INTO table} /FILTER /from subtype] TO subtype 7 [MAXIMUM_SEGMENT length];

Таблица А.28. Синтаксические конструкции команды DECLARE CURSOR (BLOB)

Аргумент Описание
cursor Имя курсора BLOB
column Имя столбца BLOB
table Имя таблицы
READ BLOB Объявляет операцию чтения BLOB
INSERT BLOB Объявляет операцию записи BLOB
/FILTER /'FROM subtype/ TO subtype 7 Специфицирует необязательный фильтр BLOB, используемый для перевода BLOB из одного пользовательского формата (типа) в другой. Тип определяет, какие фильтры используются для перевода
MAXIMUM_SEGMENT length Длина локальной переменной для получения данных BLOB командой FETCH

ПРИМЕР Следующая команда внедренного SQL объявляет курсор BLOB для чтения и использует опцию MAXIMUMJSEGMENT:

EXEC SQL

DECLARE ВС CURSOR FOR

READ BLOB JOB_REQUIREMENT FROM JOB MAXIMUM_SEGMENT

40;

Команда внедренного SQL объявляет курсор BLOB для вставки:

EXEC SQL

DECLARE BlobCur CURSOR FOR

INSERT BLOB REFERAT INTO TBOOK;

DECLARE EXTERNAL FUNCTION

ОПИСАНИЕ

DECLARE EXTERNAL FUNCTION создает описание в базе пользовательской функции (UDF - User Defined Function), включая ее имя, входные параметры, если они требуются, возвращаемое значение. Сама функция размещается в библиотеке вне базы данных.

Функция, вызываемая из базы, должна быть откомпилирована в соответствии с CDECL соглашением.

Опция 'entryname' - имя, под которым функция хранится в библиотеке. Имя функции в библиотеке и имя, объявленное в базе, вообще говоря, различны.

Нельзя использовать DECLARE EXTERNAL FUNCTION, если база размещена на сервере NetWare. Сервер NetWare не поддерживает библиотеки UDF.

СИНТАКСИС

DECLARE EXTERNAL FUNCTION name [LIST_<da taty]es> RETURNS f<datatype> [BY VALVE J j CSTRING (int) } /free_ItJ ENTRY_P0INT 'entryname1 MODULE_NAME 'modulename';

<datatypes>; . = <datatype> / CSTRING (int)

Таблица А.29. Синтаксические конструкции команды DECLARE EXTERNAL FUNCTION

Аргумент Описание
name Имя UDF
<datatype> Тип данных входных и выходного параметра. Все входные параметры передаются в UDF по ссылке. Возврат может осуществляться и по значению
RETURNS Специфицирует возвращаемое функцией значение
BY VALUE Указывает, что возврат осуществляется по значению, иначе - по ссылке
CSTRING (int) Указывает, что UDF возвращает заканчивающуюся 0 строку длины int байтов
FREEJT Признак того, что для возвращаемого значения в UDF была явно выделена память и InterBase должен ее освободить. В С, C++ для выделения памяти следует использовать функцию malloc
Аргумент Описание
'entryname' Строка в апострофах, специфицирующая имя функции в библиотеке
'modulename' Строка в апострофах, специфицирующая имя файла (библиотеки), в котором размещены UDF. В Widows библиотека должна быть размещена в поддиректории UDF директорий установки InterBase для версии 6. Для всех версий нужную директорию можно определить по расположению DLL ib_udf.dll.

ПРИМЕР Объявляется функция IFC , возвращающую символьную строку и получающую 3 параметра.

/* IFC D,C1,C2)=(D>0)?C1:C2 */

DECLARE EXTERNAL FUNCTION IFC DOUBLE PRECISION,

VARCHAR (256),

VARCHAR (256)

RETURNS VARCHAR (256)

ENTRY_POINT '_if_c' MODULE_NAME 'MyDLL.dll’;

DECLARE FILTER

ОПИСАНИЕ

DECLARE FILTER задает информацию о существующем фильтре BLOB в базе данных: где он находится, его имя и подтип BLOB, с которым он работает. Фильтр BLOB - это пользовательская программа, которая преобразовывает данные, сохраненные в столбцах BLOB из одного подтипа в другой.

INPUT_TYPE и OUTPUT_TYPE вместе определяют поведение фильтра BLOB. Каждый фильтр, объявленный в базе данных должен иметь уникальную комбинацию INPUTTYPE и OUTPUT_TYPE (цело-j численные коды). InterBase обеспечивает встроенный тип 1, для обработки текста. Определяемые пользователем типы должны быть заданы как отрицательные значения.

Параметр 'entryname' задает имя фильтра BLOB в библиотеке. Когда приложение использует фильтр BLOB, это вызывает функцию фильтра с указанным именем.

Нельзя использовать DECLARE FILTER при создании базы данных на сервере NetWare. Фильтры BLOB не поддерживаются на серверах NetWare.

СИНТАКСИС DECLARE FILTER filter

INPUT_TYPE subtype OUTPUT_TYPE subtype

ENTRYPOINT 'entryname' MODULE_NAME 'modulename';

Таблица А.ЗО. Синтаксические конструкции команды DECLARE FILTER

Аргумент Описание
filter Имя фильтра. Должно быть уникальным среди имен фильтров в базе данных
INPUT_TYPE subtype Определяет подтип BLOB, данные из которого должны быть преобразованы
OUTPUTTYPE

subtype

Определяет подтип BLOB, в который должны быть преобразованы данные
'entryname' Строка в апострофах, определяющая имя фильтра BLOB, как он хранится в библиотеке, указанной в 'modulename'
'modulename' Строка в апострофах, специфицирующая имя файла (библиотеки), в котором размещен фильтр. В Widows библиотека должна быть размещена в поддиректории UDF директорий установки InterBase для версии 6. Для всех версий нужную директорию можно определить по расположению DLL ib_udf.dll.

ПРИМЕР Следующая инструкция объявляет фильтр BLOB:

DECLARE FILTER TFILTER INPUT_TYPE -1 OUTPUT_TYPE -2 ENTRY_POINT '_TFilter' MODULE_NAME 'MYDLL.dl1' ;

DESCRIBE

ОПИСАНИЕ Команда DESCRIBE используется в двух случаях.

Во-первых, при описании команды вывода DESCRIBE записывает в XSQLDA описание столбцов из списка выбора предварительно подготовленной команды. Если команда PREPARE включала предложение INTO, нет необходимости использовать DESCRIBE как команду вывода.

Во-вторых, при описании команды ввода DESCRIBE записывает в XSQLDA описание динамических параметров, указанных в предварительно подготовленной команде.

DESCRIBE является одной из команд, образующих группу команд DSQL.

Таблица А.31. Команды, работающие с XSQLDA

Команда Назначение
PREPARE Подготавливает к выполнению команду DSQL
DESCRIBE Заносит в XSQLDA данные команды
EXECUTE Выполняет ранее подготовленную команду
EXECUTE IMMEDIATE Подготавливает команду DSQL, выполняет ее один раз и очищает ее

Для операций ввода и вывода должны выдаваться отдельные команды DESCRIBE. Чтобы сохранить информацию о динамическом параметре, должно использоваться ключевое слово INPUT.

Когда DESCRIBE используется для вывода, то, если значение, возвращенное в sqld-поле в XSQLDA, больше, чем sqln-поле, необходимо:

- выделить большее количество памяти для структур XSQLVAR,

- снова выдать команду DESCRIBE.

Та же самая структура XSQLDA может при желании использоваться как для ввода, так и для вывода.

Команда DESCRIBE может использоваться в SQL.

СИНТАКСИС

DESCRIBE [OUTPUT / INPUT] statement [INTO / USING} SQL DESCRIPTOR xsqlda;

Таблица А.32. Синтаксические конструкции команды DESCRIBE

Аргумент Описание
OUTPUT Указывает, что информация о столбце должна быть возвращена в XSQLDA (значении по умолчанию)
INPUT Указывает, что информация динамического параметра должна быть сохранена в XSQLDA
Аргумент Описание
Statement Ранее определенный для команды DESCRIBE псевдоним. Псевдонимы определяются в команде PREPARE
/INTO 1 USING,/ SQL DESCRIPTOR xsqlda Определяет XSQLDA для команды DESCRIBE

Следующая внедренная команда SQL получает информацию о выводе команды SELECT:

EXEC SQL

DESCRIBE Q1 INTO Work_xsqlda;

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

EXEC SQL

DESCRIBE INPUT Q2 USING SQL DESCRIPTOR Work_xsqlda; DISCONNECT

ОПИСАНИЕ

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

Чтобы вновь соединиться с базой данных, закрытой DISCONNECT, ледует выдать команду CONNECT.

Эта команда может использоваться в SQL.

СИНТАКСИС

DISCONNECT { {all / default} / L JST_dbhandle};

Таблица А.ЗЗ. Синтаксические конструкции команды DISCONNECT

Аргумент Описание
ALL|

DEFAULT

Любое ключевое слово закрывает все открытые базы данных
dbhandle Ранее объявленный дескриптор, идентифицирующий отсоединяемую базу данных

Следующие команды внедренного SQL закрывают все базы данных:

EXEC SQL

DISCONNECTDEFAULT;

EXEC SQL

DISCONNECTALL;

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

EXEC SQL

DISCONNECTDB1;

EXEC SQL

DISCONNECT DB1 , DB2 ;

DROP DATABASE

ОПИСАНИЕ

DROP DATABASE удаляет подключенную базу данных, включая все связанные вторичные, теневые базы и журналы. Удаляются все данные, которые она содержит. База данных может быть удалена ее создателем и пользователем SYSDBA.

СИНТАКСИС DROP DATABASE;

ПРИМЕР DROP D_Base;

DROP DOMAIN

ОПИСАНИЕ

DROP DOMAIN удаляет существующее определение домена из базы данных. Если домен используется в каком-либо определении столбца в базе данных, DROP не выполняется. Для предотвращения отказа следует перед выполнением DROP DOMAIN выполнить команды ALTER TABLE, чтобы удалить столбцы, основанные на домене. Домен может быть удален его создателем и пользователем SYSDBA.

СИНТАКСИС DROP DOMAIN name;

Таблица А.34. Синтаксические конструкции команды DROP DOMAIN

Аргумент Описание
name Имя существующего домена

ПРИМЕР

DROP DOMAIN DMONTH;

DROP EXCEPTION

ОПИСАНИЕ

DROP EXCEPTION удаляет исключение из базы данных. Исключения, используемые в существующих процедурах или триггерах, не могут быть удалены. Отображение списка исключений и использующих их процедур и триггеров можно получить с помощью команды SHOW EXCEPTION. Исключение может быть удалено его создателем и пользователем SYSDBA.

СИНТАКСИС

DROP EXCEPTION name;

Таблица А.35. Синтаксические конструкции команды DROP EXCEPTION

Аргумент Описание
name Имя существующего сообщения исключения

ПРИМЕР

DROP EXCEPTION NO_AUTHORKEY;

DROP EXTERNAL FUNCTION

ОПИСАНИЕ

DROP EXTERNAL FUNCTION удаляет UDF-объявление (объявление функции пользователя) из базы данных. Удаление UDF-объявления из базы данных не удаляет саму функцию из связанной UDF-библиотеки, но делает ее недоступной в базе данных. Если объявление удалено, любые приложения, которые используют UDF, возвратят ошибки во время выполнения.

Объявление UDF может быть удалено его создателем и пользователем SYSDBA.

UDF не доступны на серверах NetWare. Если UDF все же объявлена, для удаления объявления следует выполнить команду DROP EXTERNAL FUNCTION.

СИНТАКСИС

DROP EXTERNAL FUNCTION name;

Таблица А.36. Синтаксические конструкции команды DROP EXTERNAL FUNCTION

Аргумент Описание
name Имя существующей UDF

ПРИМЕР

DROP EXTERNAL FUNCTION ifc;

DROP FILTER

ОПИСАНИЕ

DROP FILTER удаляет объявление фильтра BLOB из базы данных. Удаление'объявления фильтра BLOB из базы не удаляет сам фильтр BLOB из связанной библиотеки, но делает его недоступным в базе данных. Если объявление удалено, любые приложения, которые используют фильтр, возвратят ошибки во время выполнения.

DROP FILTER завершится аварийно, если он используется каким-либо объектом базы, например процедурой или триггером.

Объявление фильтра может быть удалено его создателем и пользователем SYSDBA.

Фильтры BLOB не доступны на серверах NetWare. Если фильтр все же объявлен, для удаления объявления следует выполнить команду DROP FILTER.

СИНТАКСИС DROP FILTER name;

Таблица А.37. Синтаксические конструкции команды DROP FILTER

Аргумент Описание
name Имя существующего фильтра

ПРИМЕР

DROP FILTER TFILTER;

DROP INDEX

ОПИСАНИЕ

DROP INDEX удаляет пользовательский индекс из базы. Команда неприменима для системных индексов, обеспечивающих логическую целостность данных, таких как UNIQUE, PRIMARY KEY, FOREIGN KEY.

Индекс может быть удален только после окончания его использования всеми приложениями и только создателем и пользователем SYSDBA

СИНТАКСИС

DROP INDEX name;

Таблица А.38. Синтаксические конструкции команды DROP INDEX

Аргумент Описание
name Имя существующего индекса

ПРИМЕР

DROP INDEX TREADER_RDNAME;

DROP PROCEDURE

ОПИСАНИЕ

DROP PROCEDURE удаляет существующую хранимую процедуру из базы. Процедура, используемая другими процедурами, триггерами или обзорами, не может быть удалена. Она также не может быть удалена, пока не завершится использующее ее приложение (транзакция).

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

Хранимая процедура может быть удалена ее создателем и пользователем SYSDBA.

СИНТАКСИС

DROP PROCEDURE name;

Таблица А.39. Синтаксические конструкции команды DROP PROCEDURE

Аргумент Описание
name Имя существующей хранимой процедуры

ПРИМЕР

DROP PROCEDURE PBOOKAUTHOR;

DROP SHADOW

ОПИСАНИЕ

DROP SHADOW удаляет набор файлов тени и отключает процесс ведения тени. Для просмотра набора файлов тени можно использовать команду SHOW DATABASE.

Тень может быть удалена ее создателем и пользователем SYSDBA.

СИНТАКСИС

DROP SHADOW set_num;

Таблица А.40. Синтаксические конструкции команды DROP SHADOW

Аргумент Описание
set_num Положительное целое, идентифицирующее набор файлов тени

ПРИМЕР DROP SHADOW 1;

DROP TABLE

ОПИСАНИЕ

DROP TABLE удаляет из таблицы данные, а из базы - описание самой таблицы, индексы и все, связанные с таблицей триггеры. Не могут быть удалены таблицы, которые используются в SQL-выражениях, обзорах, ограничениях логической целостности, хранимых процедурах. Также нельзя удалить таблицу до тех пор, пока она используется в незавершенной транзакции.

При выдаче команды DROP TABLE для внешней таблицы происходит удаление только ее описания из базы. Внешний файл не удаляется.

Таблица может быть удалена ее создателем и пользователем SYSDBA.

СИНТАКСИС

DROP TABLE name;

Таблица А.41. Синтаксические конструкции команды DROP TABLE

Аргумент Описание
name Имя существующей таблицы

ПРИМЕР

DROP TABLE tbook;

DROP TRIGGER

ОПИСАНИЕ

DROP TRIGGER удаляет триггер из базы данных. Системные триггеры, подобные триггерам, создаваемым по ограничениям CHECK, не могут удаляться командой DROP TRIGGER. Для удаления таких триггеров можно использовать команду ALTER TABLE с опцией DROP для соответствующих конструкций CHECK.

Нельзя удалить триггер до тех пор, пока он используется в незавершенной транзакции.

Триггер может быть удален ее создателем и пользователем SYSDBA. Для временного отключения триггера следует использовать команду ALTER TRIGGER, указав в заголовке триггера INACTIVE.

СИНТАКСИС

DROP TRIGGER name;

Таблица А.42. Синтаксические конструкции команды DROP TRIGGER

Аргумент Описание
name Имя существующего триггера

ПРИМЕР

DROP TRIGGER I_TBOOK_l;

DROP VIEW

ОПИСАНИЕ

DROP VIEW удаляет описание обзора из базы, если оно не используется в другом обзоре, хранимой процедуре или ограничении CHECK.

Обзор может быть удален его создателем и пользователем SYSDBA.

СИНТАКСИС DROP VIEW name;

Таблица А. 43. Синтаксические конструкции команды DROP VIEW

Аргумент Описание
name Имя существующего обзора

ПРИМЕР

DROP VIEW NORUBRICS;

END DECLARE SECTION

ОПИСАНИЕ

END DECLARE SECTION используется в приложениях с внедренным SQL для идентификации конца объявлений переменных базового языка в отношении переменных, которые будут использоваться в последующих командах SQL.

Эта инструкция может использоваться в SQL.

СИНТАКСИС

END DECLARE SECTION;

ПРИМЕР Следующие инструкции внедренного SQL объявляют раздел, переменные базового языка и фиксируют конец объявлений:

EXEC SQL

BEGIN DECLARE SECTION;

BASED ON TBOOK. REFERAT blob_id;

BASED ON TBOOK.REFERAT.SEGMENT blob_segment_buf;

BASED ON TBOOK.UNIKEY key;

unsigned short blob_seg_len;

EXEC SQL

END DECLARE SECTION;

EVENT INIT

ОПИСАНИЕ

EVENT INIT задает первый этап в двухэтапном механизме синхронизации событий InterBase:

1. EVENT INIT регистрирует интерес приложения к событию.

2. EVENT WAIT заставляет приложение ожидать появления указанного события.

EVENT INIT регистрирует интерес приложения к событиям; перечень событий задается в виде списка в круглых скобках. Список должен соответствовать событиям, зарегистрированным в базе данных хранимыми процедурами или триггерами. Если приложение регистрирует интерес к нескольким событиям в одном EVENT INIT, то, когда происходит одно из этих событий, приложение должно определить, какое именно событие произошло. События инициируются командой POST_EVENT в хранимой процедуре или триггере.

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

Эта инструкция может использоваться в SQL.

СИНТАКСИС

EVENT INIT request_name /"<dbhandle> ]

(LJ,ST_<eventnames>) ;

<eventnames> string" / :<variable>

Таблица А. 44. Синтаксические конструкции команды EVENT INIT

Аргумент Описание
request_name Дескриптор события
<dbhandle> Специфицирует базу данных, в которой контролируется возникновение событий. Если пропущено, используется база данных, для которой была выдана последняя команда SET DATABASE
"<string>" Уникальное имя, идентифицирующее событие, которое инициируются командой POSTEVENT в хранимой процедуре или триггере

15 Введение в InterBase

Аргумент Описание
:<variable> Символьный массив базового языка, содержащий связанное с командой уникальное имя, идентифицирующее событие, которое инициируются командой POST EVENT в хранимой процедуре или триггере

ПРИМЕР Следующие команды внедренного SQL регистрируют имя события приложения и указывают, что программа переходит к его ожиданию: Регистрирует интерес приложения к событиям.

EXEC SQL

EVENT INIT Event_l MYBASE ("Ev_001") ;

Ожидается событие.

EXEC SQL

EVENT WAIT Event_l;

Само событие устанавливается внутри базы в триггере или хранимой процедуре.

if(ABC > 1000) begin

POST_EVENT ’Ev_001'; end

EVENT WAIT

ОПИСАНИЕ

EVENT WAIT задает второй этап в двухэтапном механизме синхронизации событий InterBase.

После того как приложение регистрирует интерес к событию, EVENT WAIT заставляет приложение ожидать появления указанного события.

Эта инструкция может использоваться в SQL.

СИНТАКСИС

EVENT WAIT request_name;

Таблица А.45. Синтаксические конструкции команды EVENT WAIT

Аргумент Описание
request_name Дескриптор события, объявленный ранее в команде EVENT INIT

ПРИМЕР Следующие команды внедренного SQL регистрируют имя события приложения и указывают, что программа переходит к его ожиданию: Регистрирует интерес приложения к событиям.

EXEC SQL

EVENT INIT Event_l MYBASE ("Ev_001");

Ожидается событие.

EXEC SQL

EVENT WATT Event_l ;

Само событие устанавливается внутри базы в триггере или хранимой процедуре.

if(ABC > 1000) begin

POST_EVENT 'Ev_001' ;

end

EXECUTE

ОПИСАНИЕ

EXECUTE выполняет предварительно подготовленную команду DSQL. Это - одна из группы команд для выполнения команд DSQL.

Таблица А.46. Команды подготовки и выполнения инструкций SQL

Команда Назначение
PREPARE Подготавливает команду DSQL к выполнению
DESCRIBE Заполняет XSQLDA информацией об инструкции
Команда Назначение
EXECUTE Выполняет ранее подготовленную команду
EXECUTE IMMEDIATE Подготавливает команду DSQL, выполняет и очищает ее

Прежде чем команда будет выполнена, она должна быть подготовлена командой PREPARE. В качестве исполняемой команды могут выступать любые SQL-команды описания данных, манипуляции с данными или управления транзакциями. Один раз подготовленная команда может быть затем выполнена любое число раз.

В приложениях SQL, выполняющих одновременно несколько транзакций, может использоваться конструкция TRANSACTION для указания, какой именно транзакцией контролируется операция EXECUTE.

Конструкция USING DESCRIPTOR позволяет команде EXECUTE извлекать параметры команд из предварительно загруженной данными приложения структуры XSQLDA. Конструкция USING DESCRIPTOR необходима только при использовании команд, имеющих динамические параметры.

Конструкция INTO DESCRIPTOR позволяет команде EXECUTE сохранять для приложения, возвращаемые выполненной командой значения, в указанной структуре XSQLDA. Требуется только для инструкций DSQL с возвращаемыми значениями.

Если команда EXECUTE предусматривает и конструкцию USING DESCRIPTOR, и конструкцию INTO DESCRIPTOR, то необходимо задавать две структуры XSQLDA.

Эта инструкция может использоваться в SQL.

СИНТАКСИС

EXECUTE {TRANSACTION transaction] statement [USING SQL DESCRIPTOR xsqldaJ {INTO SQL DESCRIPTOR xsqlda] ;

Таблица А.47. Синтаксические конструкции команды EXECUTE

Аргумент Описание

TRANSACTION

transaction Специфицирует транзакцию, контролирующую выполнение команды
Аргумент Описание
statement Псевдоним ранее подготовленного к выполнению предложения
USING SQL DESCRIPTOR Указывает, что соответствующие значения в подготовленном предложении должны выбираться из специфицированного XSQLDA
INTO SQL DESCRIPTOR Указывает, что возвращаемые командой значения должны быть сохранены в специфицированной XSQLDA
xsqlda XSQLDA-переменная базового языка

ПРИМЕР Следующая команда внедренного SQL выполняет предварительно подготовленную команду DSQL:

EXEC SQL

EXECUTE DSQL_Query;

Следующая команда внедренного SQL выполняет предварительно подготовленную команду с параметрами, сохраненными в XSQLDA:

EXEC SQL

EXECUTE DSQL_Query USING DESCRIPTOR Work_xsqlda;

Следующая команда внедренного SQL выполняет предварительно подготовленную команду с параметрами в одном XSQLDA и сохраняет результаты в другом XSQLDA:

EXEC SQL

EXECUTE DSQL_Query USING DESCRIPTOR xsqlda_In INTO DESCRIPTOR xsqlda_Out;

EXECUTEIMMED/A ТЕ ОПИСАНИЕ

EXECUTE IMMEDIATE подготавливает команду DSQL, сохраняет в переменной базового языка или символьной строке, выполняет ее и очищает. Чтобы подготовить команду для многократного использования, вместо EXECUTE IMMEDIATE следует использовать команды PREPARE и EXECUTE.

Конструкция TRANSACTION может применяться в приложениях, использующих одновременно несколько транзакций, чтобы специфици ровать, под управлением какой именно из них работает EXECUTE IMMEDIATE.

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

Конструкция USING DESCRIPTOR позволяет команде EXECUTE IMMEDIATE извлекать параметры команд из структуры XSQLDA, предварительно загруженной данными приложения. Конструкция USING DESCRIPTOR необходима только при использовании команд, имеющих динамические параметры.

Эта команда может использоваться в SQL.

СИНТАКСИС

EXECUTE IMMEDIATE /’TRANSACTION transaction]

{:<variable> / "string"} /"USING SQL DESCRIPTOR xsqlda] ;

Таблица А.48. Синтаксические конструкции команды EXECUTE IMMEDIATE

Аргумент Описание
TRANSACTION

transaction

Специфицирует транзакцию, контролирующую выполнение команды
:<variable> Имя переменной базового языка, содержащей предназначенную для выполнения команду
USING SQL DESCRIPTOR Указывает, что соответствующие значения в подготовленном предложении должны выбираться из специфицированного XSQLDA
xsqlda XSQLDA-переменная базового языка

ПРИМЕР Следующая команда внедренного SQL готовит и выполняет команды, помещенные в переменной базового языка.

EXEC SQL

EXECUTE IMMEDIATE :Query_Data;

EXECUTE PROCEDURE

ОПИСАНИЕ

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

СИНТАКСИС ДЛЯ ISQL

EXECUTE PROCEDURE name _ ILIST param 1:

СИНТАКСИС ДЛЯ SQL (ВЫЗОВА ИЗ ПРОЦЕДУР И ТРИГГЕРОВ)

EXECUTE PROCEDURE name [LISIbaraia 1 [ RETURNINGJVALUES [LIST_param]

СИНТАКСИС ДЛЯ DSQL

EXECUTE PROCEDURE [TRANSACTION transaction] name |LTST_<dparam] fRETURNlNG_VALUES LIST_<dparam> J ;

<dparam> .-= :param [ [INDICATOR] : indicator ]

Таблица А.49. Синтаксические конструкции команды EXECUTE PROCEDURE

Аргумент Описание
name Имя существующей хранимой процедуры
param Входные параметры; должны быть константами для ISQL либо константами или переменными для SQL и DSQL
TRANSACTION

transaction

Имя транзакции, в рамках которой выполняется команда
/indicator/

•.indicator

Имя базовой переменной, в которую записывается признак того, что возвращенное значения - NULL

ПРИМЕР

ISQL вызов. Применяется для процедур, выполняющих изменение данных.

EXECUTE PROCEDURE ABC 100;

Вызов процедуры из другой процедуры, возвращающей значение в переменную AUTHORS

execute procedure PBUTHOR :UNIKEY RETURNING_VALUES :AUTHORS;

Аналогичный вызов процедуры из приложения, возвращающей значение в переменную AUTHORS

EXEC SQL

EXECUTE PROCEDURE TRANSACTION tr_l PBUTHOR swUNIKEY RETURNING_VALUES :wAUTHORS ;

FETCH

ОПИСАНИЕ

FETCH выбирает в программу одну строку из активного набора курсора. Первая команда FETCH выбирает первую строку активного набора. Последующие команды FETCH продвигают курсор последовательно по активному набору, пока не будет достигнут его конец, тогда SQLCODE устанавливается в 100.

Курсор - это односторонний указатель в упорядоченном наборе строк, полученных выражением SELECT в команде DECLARE CURSOR. Курсор допускает только последовательный доступу к отысканным строкам. Имеются четыре связанных команда! курсора:

Таблица А.50. Команды работы с курсором

Мп/п Команда Назначение
1 DECLARE CURSOR Объявляет курсор. Конструкция SELECT определяет состав столбцов курсора
2 OPEN Получает строки, указанные в DECLARE CURSOR. Полученные строки образуют активный набор курсора
Лё п/п Команда Назначение
3 FETCH Получает очередную строку активного набора, начиная с первой. Последовательное выполнение FETCH продвигает курсор по набору
4 CLOSE Закрывает курсор и освобождает системные ресурсы

Число, размер, тип данных и порядок столбцов в FETCH должен быть тем же, что и в конструкции запроса соответствующей ему команды DECLARE CURSOR. Если это не так, результат может оказаться неверным.

Эта команда может использоваться в SQL и DSQL.

СИНТАКСИС SQL form:

FETCH Cursor

[INTO .-hostvar [ (INDICATOR] : indvar ]

[, :hostvar [ [INDICATOR ] : indvar] ...]];

DSQL form:

FETCH cursor {INTO /USING} SQL DESCRIPTOR xsqlda Blob form:

Cm. FETCH (BLOB).

Таблица А.51. Синтаксические конструкции команды FETCH

Аргумент Описание
Cursor Имя открытого курсора, используемого для получения строк
: hostvar Переменная базового языка, получающая данные по команде FETCH,

Необязательна, если FETCH получает строки для удаления или обновления.

Требуется, если строка выводится перед удалением или обновлением

Аргумент Описание
rindvar Управляющая переменная, указывающая, что столбец содержит неизвестную величину или NULL
/INTO | USING7 SQLDESCRIPTOR Означает, что значение должно быть возвращено в указанной XSQLDA
xsqlda Переменная XSQLDA базового языка

ПРИМЕР

EXEC SQL

DECLARE Mcursor CURSOR FOR

SELECT UNIKEY, MATHERKEY, BOOKNM FROM TBOOK;

do

{

EXEC SQL

FETCH Mcursor INTO :wUNIKEY, :wMATHERKEY, :wBQOKNM;

if(SQLCODE)break;

}while(1);

GRANT

ОПИСАНИЕ

GRANT устанавливает права на объекты базы данных пользователям или другим объектам базы данных. Когда объект создается, права на него имеет только его создатель и только он может выдавать права другим пользователям или объектам.

Для доступа к таблице или обзору пользователь или объект нуждается в правах на SELECT, INSERT, UPDATE или DELETE. Все права могут быть даны опцией ALL. ;

Для вызова процедуры в приложении пользователь должен иметь, права на EXECUTE.

Пользователи могут получить разрешение выдавать права другим пользователям передачей списка права по списку <userlist>, который задается опцией WITH GRANT OPTION. Пользователь может выдавать другим только те права, которыми располагает сам.

Права могут быть даны всем пользователям опцией PUBLIC на месте списка имен пользователей. Указание опции PUBLIC распространяется только на пользователей, но не на объекты базы данных.

Таблица А.52. Права, предоставляемые пользователям и объектам базы данных

Право Позволяет пользователям
ALL SELECT, DELETE, INSERT, UPDATE и EXECUTE
SELECT выбирать строки из таблицы или обзора
DELETE удалять строки из таблицы или обзора
INSERT вставлять строки в таблицу или обзор
UPDATE изменять строки в таблице или обзоре. Может быть задано для определенного набора столбцов
EXECUTE выполнять хранимую процедуру

Права могут быть ликвидированы пользователем, выдавшим их, используя команду REVOKE. Если права были выданы с помощью ALL, то и ликвидированы они могут быть только в режиме ALL, если права были выданы с помощью PUBLIC, то и ликвидированы они могут быть только в режиме PUBLIC.

СИНТАКСИС

GRANT {

{all [PRIVILEGES ] / SELECT / DELETE / INSERT

/ UPDATE [ (LJSlLcol) ]}

ON [TABLE} [tablename / viewname}

TO [<object> / <userlist>}

/ EXECUTE ON PROCEDURE procname

TO [<object> / <userlist>}

J;

<object>.-:= PROCEDURE procname / TRIGGER trigname / VIEW viewname

/ [USER] username / PUBLIC [, <object>7

<userlist>: : = [USER} username {, [USER} username ...7

[WITH GRANT OPTION]

Таблица А.53. Синтаксические конструкции команды GRANT

Аргумент Описание
col Имя столбца, на который выдаются права
tablename Имя существующей таблицы, на которую распространяются права
viewname Имя существующего обзора, на который распространяются права
<object> Имя существующего объекта базы, на который распространяются права
<userlist> Список пользователей, которым передаются права
WITH GRANT OPTION Разрешает дальнейшую передачу прав пользователям, перечисленным в списке <userlist>

ПРИМЕР Следующая команда передает права пользователю на SELECT и DELETE. Опция WITH GRANT OPTION дает право на дальнейшую их передачу.

GRANT SELECT, DELETE ON TBOOK TO MISHA WITH GRANT OPTION;

Данная команда дает право на выполнение процедуры PBUTHOR процедуре PBOOKAUTHOR и пользователю.

GRANT EXECUTE ON PROCEDURE PBUTHOR

TO PROCEDURE PBOOKAUTHOR, MISHA;

INSERT

ОПИСАНИЕ

INSERT добавляет одну или несколько новых строк данных в существующую таблицу или обзор. Значения вставляются в строку в порядке столбцов в таблице, если не указан явно необязательный список вставляемых столбцов. Если список вставляемых столбцов - подмножество доступных столбцов, то заданные по умолчанию или NULL-значения автоматически устанавливаются во всех неперечисленных столбцах. Если необязательный список целевых столбцов опущен, предложение VALUES должно задавать значения для всех столбцов в таблице.

Для вставки одиночной строки данных предложение VALUES должно включать список вставляемых значений.

Для вставки множества строк, необходимо задать выражение выборки <select_expr>, которое выбирает существующие данные из других таблиц, чтобы вставить в данную. Выбранные столбцы должны соответствовать столбцам, перечисленным в списке для вставки.

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

Для выполнения команды необходимо наличие соответствующих прав. Выдача и аннулирование прав осуществляется командами GRANT и REVOKE.

СИНТАКСИС

INSERT /TRANSACTION transaction} INTO <object>

[(LIST_col) ]

{VALUES (LIST_<val>) j <select_expr>} ;

<object> .•= tablename / viewname <val>.-;= {

<constant> / <expr>/ <function> / NULL / USER

} /COLLATE collation] .

Опция COLLATE недопустима для BLOB данных.

<constant>;:= num j "string" j charsetname "string"

<expr> - любое допустимое SQL-выражение, которое в качестве результата возвращает единственное значение.

<function>.-.• = {

CAST (<val> AS <datatype>)

/ UPPER (<val>)

/ GSJ_ID (generator, <val>) '

}

<select_expr> - SELECT, возвращающая несколько (возможно 0) строк, причем количество столбцов в SELECT соответствует количеству вставляемых столбцов.

Таблица А'.54. Синтаксические конструкции команды INSERT

Аргумент Описание
INTO <object> Имя существующей таблицы или обзора, куда вставляются данные
col Имя существующего столбца в таблице или обзоре, в который вставляются значения
VALUES (<val> [, <val> ...]) Список значений, вставляемых в таблицу или обзор. Значения должны перечисляться в том же порядке, что и столбцы, в которые они вставляются
<select_expr> Запрос, возвращающий строки значений для вставки в указанные столбцы таблицы или обзора
TRANSACTION

transaction

Задает имя транзакции, в рамках которой выполняется команда

ПРИМЕР Следующая команда добавляет строку к таблице, присваивая значения двум столбцам:

INSERT INTO TREADER (RDNUMB, RDNAME)

VALUES ('1111-98', 'Пугачева А.Б.');

Следующая команда задает значения для вставки в таблицу, используя результаты выборки командой SELECT:

INSERT INTO TREADER (RDNUMB, RDNAME)

SELECT CAST (AUTHOR as VARCHAR ( 8 ) ) I I ' -00 ' , AUNAME FROM TAUTHOR

where AUNAMEc'fl';

t

INSERT CURSOR

ОПИСАНИЕ

INSERT CURSOR записывает BLOB-данные в столбец. Размер данных, записываемых из модулей приложения, не должен превышать размер сегмента BLOB. Перед вставкой данных в BLOB-курсор необходимо:

- объявить локальную переменную для хранения вставляемых данных;

- объявить длину переменной bufferlen;

- объявить BLOB-курсор для вставки (INSERT) и открыть его.

Каждая команда вставки (INSERT) в столбец BLOB вставляет текущее содержимое буфера. Между вставками необходимо заполнять буфер новыми данными. Команду INSERT следует повторять, пока не будут вставлены все данные.

INSERT CURSOR требует наличия прав на вставку (INSERT), управляемую командами GRANT и REVOKE.

Эта инструкция может использоваться в SQL.

СИНТАКСИС

INSERT CURSOR cursor

\ALUES (:buffer [INDICATOR] :bufferlen};

Таблица А.55. Синтаксические конструкции команды INSERT CURSOR

Аргумент Описание
cursor Имя BLOB-курсора
VALUES Конструкция, содержащая имя и длину переменной-буфера для вставки
:buffer Имя переменной базового языка - переменной-буфера, содержащей вставляемую информацию
INDICATOR Индикатор, указывающий, что за ним размещается длина данных, помещаемых в буфер
:bufferlen Длина в байтах буфера для вставки

ПРИМЕР Следующая команда внедренного SQL демонстрирует вставку в BLOB-курсор BlobCr данных из переменной wBuf, размер данных задается переменной wLen:

EXEC SQL

INSERT CURSOR BlobCr VALUES (:wBuf INDICATOR :wLen);

OPEN

ОПИСАНИЕ

OPEN выполняет поиск в соответствии с условиями в команде DECLARE CURSOR. Выбранные строки становятся активным набором для курсора.

Курсор - это односторонний указатель в упорядоченном наборе строк, полученном с помощью конструкции SELECT команды DECLARE

CURSOR. Курсор допускает только последовательный доступу к выбранным строкам. Имеются четыре связанных команды курсора: ■

Таблица А.56. Перечень команд для работы с курсором

Jfsn/n Команда Назначение
1 DECLARE CURSOR Объявляет курсор. Конструкция SELECT определяет состав столбцов курсора
2 OPEN Получает строки, указанные в DECLARE CURSOR. Полученные строки образуют активный набор курсора
3 FETCH Получает очередную строку активного набора, начиная с первой. Последовательное выполнение FETCH продвигает курсор по набору
4 CLOSE Закрывает курсор и освобождает системные ресурсы

Эта инструкция может использоваться в SQL и DSQL. СИНТАКСИС SQL form:

OPEN /"TRANSACTION transaction7 cursor;

DSQL form:

OPEN /TRANSACTION transaction} cursor /USING SQL DESCRIPTOR xsqlda}

Blob form:

OPEN /TRANSACTION name7 cursor {INTO / USING} :blob_id;

Подробнее см. OPEN (BLOB).

Аргумент конструкции команды open

Описание

TRANSACTION transaction Имя транзакции, в рамках которой выполняется команда OPEN
Аргумент Описание
Cursor Имя ранее объявленного курсора
USING DESCRIPTOR xsqlda Передает значения в расширенной области дескриптора (XSQLDA) в соответствии с подготовленными параметрами команды

ПРИМЕР

EXEC SQL

DECLARE Mcursor CURSOR FOR SELECT ...;

EXEC SQL OPEN Mcursor;

// Открытие цикла чтения

EXEC SQL

FETCH Mcursor INTO ...;

// Проверка на конец выборки и выход из цикла

// Окончание цикла чтения EXEC SQL

CLOSE Mcursor ;

OPEN (BLOB)

ОПИСАНИЕ

OPEN подготавливает ранее объявленный курсор для чтения или вставки BLOB-данных. В зависимости от того, что объявляет команда DECLARE CURSOR: чтение (READ BLOB) или запись (INSERT BLOB), значение blob_id обрабатывается командой OPEN по-разному.

Для конструкции READ BLOB значение bloMd поступает из курсора внешней таблицы. Для конструкции INSERT BLOB это значение возвращается системой.

Эта команда может использоваться в SQL.

СИНТАКСИС

OPEN /TRANSACTION name J cursor {INTO / USING} :blob_id;

Таблица А.58. Синтаксические конструкции команды OPEN (BLOB)

Аргумент Описание
TRANSACTION

name

Специфицирует транзакцию, в рамках которой открывается курсор. Если не указан, то применяется транзакция по умолчанию
Cursor Имя BLOB-курсора
INTO | USING В зависимости от типа BLOB-курсора применяется одна из конструкций:

INTO: For INSERT BLOB;

USING: For READ BLOB

blob_id Идентификатор BLOB-столбца

ПРИМЕР Следующая команда внедренного SQL объявляет и открывает BLOB-курсор.

EXEC SQL

BEGIN DECLARE SECTION;

BASED ON TBOOK.REFERAT blob_id;

BASED ON TBOOK.REFERAT.SEGMENT blob_Segment_buf; BASED ON TBOOK.UNIKEY key;

unsigned short blob_seg_len;

EXEC SQL

END DECLARE SECTION;

EXEC SQL

DECLARE BLOBCURSOR CURSOR FOR INSERT INTO TBOOK;

EXEC SQL

OPEN BLOBCURSOR INTO :blob_id;

PREPARE

ОПИСАНИЕ

PREPARE подготавливает команду DSQL для многократного использования. Проверяет ее на отсутствие синтаксических ошибок. Опре деляет типы данных для произвольно указанных динамических параметров. Оптимизирует выполнение команды.

Компилирует команду для выполнения с помощью EXECUTE. PREPARE является частью группы команд, которые подготавливают команды DSQL к выполнению.

Таблица А.59. Перечень команд подготовки и выполнения инструкций SQL

Команда Назначение
PREPARE Подготавливает команды DSQL к выполнению
DESCRIBE Заполняет XSQLDA данными о команде
EXECUTE Выполняет подготовленную ранее команду
EXECUTE IMMEDIATE Подготавливает команду DSQL, выполняет и освобождает ее

После подготовки команда доступна для многократного выполнения в течение текущего сеанса. Чтобы подготовить и выполнить команду только один раз, можно использовать EXECUTE IMMEDIATE.

Команда устанавливает символическое имя для фактической подготовки команды DSQL. Оно не объявляется как переменная базового языка. Кроме программ С, GPRE не делает различий между верхним и нижним регистрами в командах, обрабатывая "В" и "Ь" как один и тот же символ. В программах на С для активации чувствительности к регистру во время предварительной обработки используется переключатель gpre-either_case.

Если используется необязательный режим INTO, команда PREPARE заполняет также в списке выбранных столбцов подготовленной команды в области расширенного SQL дескриптора (XSQLDA) данные об их типах, длине и именах.

Вместо конструкции INTO для заполнения списка выбора в XSQLDA можно использовать команду DESCRIBE.

Конструкция FROM специфицирует для подготовки с помощью PREPARE реальной команды DSQL. Она может быть переменной базового языка или символьной строкой в кавычках. Подготавливаемая команда DSQL может быть любой командой объявления данных, манипулирования данными или управления транзакциями.

Эта команда может использоваться в SQL.

СИНТАКСИС

PREPARE [TRANSACTION transaction/ statement

[INTO SQL DESCRIPTOR xsqlda ] TROM {:<variable> / "string"/;

Таблица А.60. Синтаксические конструкции команды PREPARE

Аргумент Описание
transaction Имя транзакции, в рамках которой выполняется команда
statement Устанавливает псевдоним (алиас) для подготовленного предложения, которое может быть использовано в последовательности команд DESCRIBE и EXCUTE
INTO xsqlda Задает XSQLDA, которая будет заполняться описаниями выбираемых столбцов в подготовленной команде
:<variable> j "string" Текст подготавливаемой командой PREPARE команды DSQL. Может быть переменной базового языка или символьной строкой

ПРИМЕР Следующая команда внедренного SQL готовит команду DSQL из переменной базового языка buf. Поскольку она использует необязательное предложение INTO, можно предположить, что команда DSQL в переменой базового языка является командой SELECT.

EXEC SQL

PREPARE Q INTO xsqlda FROM :buf;

Данная команда может быть подготовлена и описана следующим об+ разом:

EXEC SQL

PREPARE Q FROM :buf;

EXEC SQL

DESCRIBE Q INTO SQL DESCRIPTOR xsqlda;

REVOKE

ОПИСАНИЕ

REVOKE ликвидирует права доступа к объектам базы данных. Права

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

Таблица А.61. Перечень прав, ликвидируемых по команде REVOKE

Право Запрещаетпользователям
ALL использовать SELECT, DELETE, INSERT, UPDATE и EXECUTE
SELECT выбирать строки из таблицы или обзора
DELETE удалять строки из таблицы или обзора
INSERT вставлять строки в таблицу или обзор
UPDATE изменять строки в таблице или обзоре. Может быть задано для определенного набора столбцов
EXECUTE выполнять хранимую процедуру
GRANT OPTION FOR делегировать права другим пользователям

Следует отметить ограничения при использовании команды REVOKE. Ликвидировать права может только тот пользователь, кто их выдал. Одному пользователю могут быть переданы одни и те же права на объект базы данных от любого числа разных пользователей. Команда REVOKE влечет за собой лишение выданных ранее именно этим пользователем прав. Права, выданные всем пользователям опцией PUBLIC, могут быть ликвидированы командой REVOKE только с опцией PUBLIC.

СИНТАКСИС

REVOKE {GRANT OPTION FOR] {

{ALL {PRIVILEGES] I SELECT / DELETE / INSERT / UPDATE {(col [, col ...])]}

ON {TMLE7 {tablename / viewname}

FROM {<object> / <userlist>.?

/ EXECUTE ON PROCEDURE procname

FROM {<object> / <userlist>7

<object> = PROCEDURE procname / TRIGGER trigname / VIEW viewname

/ {USER7 username / PUBLIC [, <object>7

< u s e r l i s t > = [USER Jusername [, {USER J username .. . ]

Таблица А.62. Синтаксические конструкции команды REVOKE

Аргумент Описание
GRANT OPTION FOR Отменяет у пользователей, перечисленных в <userlist>, права на делегирование прав на объекты базы данных. Неприменим по отношению к объектам (<object>) базы данных
col Имя столбца, на который выдаются права
tablename Имя существующей таблицы, на которую распространяются права
viewname Имя существующего обзора, на который распространяются права
<object> Имя существующего объекта базы, на который распространяются права
<userlist> Список пользователей, которым передаются права

ПРИМЕР Следующая команда ликвидирует у пользователя права на чтение таблицы:

REVOKE SELECT ON ТВООК FROM MISHA;

Следующая команда отменяет право на выполнение процедуры PBUTHOR у процедуры PBOOKAUTHOR и пользователя:

REVOKE EXECUTE ON PROCEDURE PBUTHOR

FROM PROCEDURE PBOOKAUTHOR, MISHA;

ROLLBACK

ОПИСАНИЕ

ROLLBACK отменяет все команды ПО изменению данных (DML), произведенные после последней команды COMMIT. Команды DDL (описания данных) записываются автоматически, поэтому ROLLBACK к ним неприменима.

СИНТАКСИС

ROLLBACK /"WORK ] ;

Таблица А.63. Синтаксические конструкции команды REVOKE

Аргумент Описание
WORK Необязательное слово; используется для совместимости

ПРИМЕР Следующие команды иллюстрируют применение ROLLBACK в ISQL. Первая команда ROLLBACK отменяет вставку данных (команду INSERT), но не создание таблицы (CREATE TABLE), вторая - не оказывает никакого действия, поскольку результаты команды INSERT уже были сохранены (выдана команда COMMIT).

CREATE TABLE Т (A INT) ;

INSERT INTO T VALUES (5) ;

ROLLBACK;

INSERT INTO T VALUES (7);

COMMIT;

ROLLBACK;

SELECT * FROM T;

SELECT

ОПИСАНИЕ

SELECT получает данные из таблиц, обзоров и хранимых процедур. Различные варианты команды SELECT позволяют:

• Получить отдельную строку или ее часть из таблицы. Такой вариант команды SELECT называют однострочным (singleton select).

• Получить множество строк или их частей из таблицы (многострочный SELECT).

• Получить логически связанные строки или части строк из соединения двух или нескольких таблиц.

• Получить логически связанные строки или части строк из объединения двух или большего числа таблиц.

Все команды SELECT содержат две обязательные конструкции (SELECT, FROM) и могут содержать комбинацию из нескольких необязательных конструкций (WHERE, GROUP BY, HAVING, UNION, PLAN, ORDER BY).

Конструкции SELECT и FROM требуются как в однострочной, так и в многострочной команде SELECT. Остальные конструкции являются необязательными. Назначение отдельных конструкций SELECT приведено в таблице.

Таблица А.64. Основные синтаксические конструкции команды SELECT

Конструкция Назначение
SELECT Задает список выбираемых столбцов
FROM Идентифицирует таблицы, обзоры или хранимые процедуры, из которых выбираются данные
WHERE Специфицирует условия выборки данных. Конструкция WHERE может содержать собственные команды SELECT, называемые подзапросами
GROUP BY Группирует строки на основе одинаковых значений в столбцах. Может использоваться вместе с конструкцией HAVING
HAVING Используется для задания дополнительных условий выборки из списка строк, полученного применением конструкции GROUP BY
UNION Объединяет результаты двух или нескольких команд SELECT, образуя единую динамическую таблицу без повторяющихся строк
ORDER BY Задает порядок сортировки возвращаемых командой SELECT строк: по возрастанию (ASC) или убыванию (DESC) значений в указанных столбцах
PLAN Задает план выполнения запроса, который будет использован оптимизатором запросов, вместо того, который был бы выбран автоматически

СИНТАКСИС

SELECT /DISTINCT / ALL] {* / <val> [, <val> ...]}

FROM <tableref> [, <tableref> ... 7 [WHERE <search_condition>]

/"GROUP BY col /"COLLATE collation./ [, col /COLLATE collation] . . . ]

/"HAVING <search_condition>]

/UNION <select_expr>] fPLAN <plan_expr>]

/ORDER BY <order_list>]

<val> = {

col /"<array_dim> ] / <constant> / <expr> / <function>

/ NULL / USER / RDB$DB_KEY

}

<array_dim> ;; = [ LIST_< dim]

Квадратные скобки при описание массива являются частью синтаксиса, а не признаком необязательности.

<dim>;:= x[:yj

I

<constant>: .«= пшп / "string" j charsetname "string"

<expr> - любое допустимое выражение в SQL, возвращающее единственное значение (кроме массива и BLOB) .

<function> = {

COUNT (* / [ALL ] <val> / DISTINCT <val>)

/SUM ( [ALL] <val> / DISTINCT <val>)

/ AVG ( [ALL] <val> / DISTINCT <val>)

/ MAX ( [ALL] <val> / DISTINCT <val>)

/MIN ( [ALL] <val> / DISTINCT <val>)

/ CAST (<val> AS <datatype>)

/ UPPER (<val>)

/ GEN_ID (generator, <val>)

}

<tableref>::= <joined_table> / table / view / procedure [(<val> [, <val> ...])] [alias] .

<joined_table><tableref> <join_type> JOIN <tableref>

ON <search_condition> / (<joined_table>)

<join-type>;;= { [INNER] / [LEFT / RIGHT / FULL j

[OUTER] j JOIN

<search_condition> = [<val> <operator>

[<val> / (<select_one>) j

I <val> [NOT] BETWEEN <val> AND <val>

/ <val> [тот] LIKE <val> [ESCAPE <val>7

I <val> [NOT 7 IN (<val> [, <val> ...] \ <se-

lect_list>)

/ <val> IS /"NOT7 MULL

/ <val> [ [NOT7 {= I < I >} j >= I < = }

{ALL / SOME / ANY} (<select_list>)

/ EXISTS (<select_expr>)

/ SINGULAR (<select_expr>)

/ <val> [NOT} CONTAINING <val>

/ <val> [NOT} STARTING [WITH} <val>

/ (<search_condition>)

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_condition>7

<operator>= {= j < /> /<= />= / !< / !> /<> / ' •=}

<select_one> - SELECT, возвращающая один столбец в одной строке.

<select_list> - SELECT, возвращающая один столбец в нескольких (возможно 0) строках.

<select_expr> - SELECT, возвращающая несколько столбцов в нескольких (возможно 0) строках.

<plan_expr>::=

[JOIN / [вОЯН] MERGE ] (<plan_item> / <plan_expr>

[, <plan_item> / <plan_expr> ...])

<plan_item>.• .-= [table / alias}

NATURAL / INDEX (<index> [, <index> ...]) / ORDER

<index>

<order_list>:;=

[col / int} [CO^ATO collation} [ASC [ENDING} /

DESC [ending J ]

[, <order_list>]

Таблица А.65. Синтаксические конструкции команды SELECTu их опции

Аргумент Описание
SELECT /DISTINCT |

ALL/

Задает перечень выбираемых данных. Опция DISTINCT запрещает выборку повторяющихся значений.

Опция ALL (по умолчанию) выбирает любые значения

{* | <val> [, <val> ...] * задает режим выборки всех столбцов указанных таблиц.

<val> [, <val> ...7 задает выборку указанных столбцов и выражений

FROM <tableref> [, <ta-bleref>...] Задает список таблиц, обзоров и хранимых процедур, из которых осуществляется выборка данных. Список может содержать присоединения, и эти присоединения могут быть вложенными
table Имя существующей в базе таблицы
view Имя существующего в базе обзора
procedure Имя существующей в базе хранимой процедуры, функционирующей аналогично команде SELECT
alias Алиас - альтернативное имя для таблицы или обзора. После объявления в ctablerefi* алиас может использоваться для указания ссьшок на таблицу или обзор
<joined_tabIe> Указание на таблицу, содержащую конструкцию JOIN
<join_type> Тип используемого соединения. По умолчанию принимается INNER
WHERE <search_cond> Задает условие выборки строк
GROUP BY <col> [, <col> Разбивает множество выбранных строк на группы, содержащие все строки с одинаковыми значениями в перечисленных столбцах
COLLATE collation Задает порядок сравнения данных, получаемых по запросу
HAVING <search_cond> Используется вместе с конструкцией GROUP BY. Задает дополнительные условия отбора результирующих строк
Аргумент Описание
UNION Задает объединение результатов двух или нескольких выборок с идентичным составом столбцов. Каждая из выборок может осуществляться из различных таблиц, обзоров или хранимых процедур
PLAN <plan_expr> Задает план выполнения запроса, который будет использован оптимизатором запросов, вместо того, который был бы выбран автоматически
<plan_item> Указывает табличные и индексные методы для плана
ORDER BY <order_list> Задает порядок сортировки строк (по значениям столбцов, перечисленных в <order_list>)

ПРИМЕР Следующая команда выбирает, используя шаблон *, все столбцы из таблицы:

SELECT * FROM TREADER;

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

SELECT RDNUMB ,RDNAME FROM TREADER ORDER BY RDNAME;

Следующая команда выбирает перечисленные столбцы из двух таблиц (перечень читателей и взятых ими книг), используя для связи третью таблицу, и упорядочивает выборку по фамилиям:

SELECT TREADER.гdnumb, TREADER.rdname, TBOOK.booknm

FROM TREADER, TBOOK, TBOOK_READER where tbook_reader.reader=treader.unikey and tbook_reader.bookkey=tbook.unikey order by rdname;

Следующая команда использует в качестве дополнительного условия подзапрос (список книг невостребованных читателями):

SELECT BOOKNM,unikey from TBOOK where matherkey!=0 and

not EXISTS

(select * from TBOOK_READER where bookkey=TBOOK.unikey)

Следующая команда использует контекстный поиск:

SELECT BOOKNM, unikey from ТВООК where BOOKNM CONTAINING 'C++'

Следующая команда использует агрегатную функцию SUM для подсчета количества строк в таблице по каждой из групп строк, задаваемых полем RDNAME. Полученная выборка дополнительно фильтруется, оставляя в результате только те строки, которым в исходных таблицах соответствует более чем одна строка. В данном случае выбирается перечень читателей, взявших более 1 книги. Для уточнения из каких именно таблиц выбираются данные, используются алиасы.

select a.RDNAME, SUM(l) sumbook

FROM TREADER a, TBOOK_READER b Where (a.UNIKEY=b.READER) GROUP BY RDNAME HAVING SUM(1)>1;

Следующая команда задает левое соединение, используя подзапрос;'

SELECT a.rdnumb, a.rdname, b.booknm FROM TREADER a LEFT JOIN TBOOK b on EXISTS(SELECT * FROM TBOOK_READER ab where ab.reader=a.unikey and ab.bookkey=b.unikey);

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

SELECT TREADER.rdnumb, TREADER.rdname, TBOOK.booknm FROM TREADER, TBOOK, TBOOK_READER where tbook_reader.reader=treader.unikey and

tbook_reader.bookkey=tbook.unikey PDAN sort(JOIN(TBOOK_READER NATURAL,TBOOK INDEX (RDB$PRIMARY4),TREADER INDEX (RDB $ PRIMARY9 ) ) ) order by rdname;

Следующая команда использует пользовательскую функцию для преобразования текста заданного столбца, содержащего кириллицу в верхний регистр:

SELECT rupper(BOOKNM) from TBOOK where unikey=6 or unikey=7;

Функция объявлена, как:

DECLARE EXTERNAL FUNCTION RUPPER CSTRING (256)

RETURNS CSTRING (256)

ENTRY_POINT '_srupper' MODULE_NAME 'MYDLL.dl1 ' ;

SET DATABASE

ОПИСАНИЕ

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

dbhandle - определенное приложением имя дескриптора базы данных. Обычно имя дескриптора - это сокращение фактического имени базы данных. Однажды объявленный, дескриптор может использоваться в последовательностях команд CONNECT, COMMIT, ROLLBACK. Дескрипторы могут также использоваться в транзакциях, чтобы разделить таблицы, имеющие одинаковые имена в разных базах данных.

"<dbname>" является платформно-зависимой файловой спецификацией базы данных, связанной с dbhandle. Она должна следовать соглашениями синтаксиса файла для сервера, где находится база данных.

GLOBAL, STATIC и EXTERN - необязательные параметры, которые определяют область действия объявления базы данных. Область действия имени по умолчанию - GLOBAL - означает, что дескриптор базы данных доступен всем модулям кода в приложении. STATIC означает, что дескриптор базы данных доступен в том модуле кода, где он объявлен. EXTERN ссылается на глобальный дескриптор базы данных, объявленный в другом модуле.

Необязательные параметры COMPILETIME и RUNTIME дают возможность одному дескриптору базы данных относиться к одной базе данных, когда приложение подготавливается, и к другой базе данных, когда приложение выполняется пользователем. Если опущены или если указана только база данных COMPILETIME, то InterBase будет использовать указанную базу и во время подготовки и во время выполнения.

Параметры USER (имя пользователя) и PASSWORD (пароль) требуются для всех приложений клиента PC, но не обязательны для других удаленных соединений. Имя пользователя и пароль проверяются сервером в базе данных защиты перед разрешением соединения удаленным приложениям.

Эта команда может использоваться в SQL.

СИНТАКСИС

SET {DATABASE / SCHEMA} dbhandle =

/GLOBAL / STATIC / EXTERN]

/'COMPILETIME ] /"FILENAME ] "<dbname>"

[USER "<name>" PASSWORD '^string:»" ]

^RUNTIME /FILENAME 7 /"<dbname>“ / :var}

/USER /"<name>" / :var7 PASSWORD /"«string:»" / : var } ] ] ;

Таблица А.66. Синтаксические конструкции команды SET DATABASE

Аргумент Описание
dbhandle Задает алиас (псевдоним) для указанной базы данных. Алиас должен быть уникальным внутри программы. Он используется в командах SQL, поддерживающих дескрипторы баз данных
GLOBAL Область действия имени по умолчанию - GLOBAL означает, что дескриптор базы данных доступен всем модулям кода в приложении
STATIC STATIC означает, что дескриптор базы данных доступен в том модуле кода, где он объявлен
EXTERN Ссылается на глобальный дескриптор базы данных, объявленный в другом модуле
COMPILETIME Указывает базу данных, используемую для просмотра столбцов на подготовительном этапе. Если в конструкции SET DATABASE указана только одна база, она будет использоваться и на этапе выполнения
"<dbname>" Задает имя и путь к базе данных, заданных дескриптором. Задание параметра зависит от платформы, на которой реализуется база
RUNTIME Указывает на другую базу данных для использования на этапе выполнения, отличную от используемой на подготовительном этапе
:<var> Переменная базового языка, содержащая спецификацию базы, имя пользователя, пароль
Аргумент Описание
USER "<name>" Требуется для клиентского PC-соединения, не обязательна для других. Обеспечивает контроль имени пользователя на сервере, где размещается база данных. Используется вместе с паролем (PASSWORD) для контроля прав доступа пользователя на сервере
PASSWORD

"<string>"

Требуется для клиентского PC-соединения, не обязательна для других. Обеспечивает контроль пароля на сервере, где размещается база данных. Используется вместе с именем пользователя (USER "<name>") для контроля прав доступа пользователя на сервере |

ПРИМЕР Следующая команда внедренного SQL объявляет дескриптор базы данных:

EXEC SQL

SET DATABASE DB1 = "testbase.gdb";

Для корректной работы препроцессора, ему необходимо подсоединиться к базе данных. В то же время, сами данные ему не нужны. Таким образом, препроцессор может использовать одну базу, а работающее приложение другую.

Следующая команда внедренного SQL объявляет две базы данных: для подготовительного этапе и этапе выполнения. Для указания базы данных этапа выполнения используется переменная базового языка WorkBase:

EXEC SQL

SET DATABASE EMDBP = "testbase.gdb" RUNTIME : WorkBase;

SET GENERATOR

ОПИСАНИЕ

SET GENERATOR инициализирует начальное значение для вновь созданного генератора или сбрасывает значение существующего. Генератор обеспечивает формирование уникального последовательного числового значение функцией GEN_ID (). Если вновь созданный генератор не инициализирован с помощью SET GENERATOR, его значения по умолчанию - 0. Int задает новое значение для генератора. Когда GENID () используется для вставки или модификации значений в столбцах, то ее возвращаемое значение равно int плюс приращение - параметр шага, указанный в GENID ().

Чтобы указать, что первое выдаваемое значение было равно 1, следует указать в SET GENERATOR стартовое значение равным 0 и установить значение шага в функции GEN_ID() в 1.

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

СИНТАКСИС

SET GENERATOR name ТО int;

Таблица А.67. Синтаксические конструкции команды SET GENERA TOR

Аргумент Описание
Name Имя существующего генератора
Int Значение, которое задается генератору в качестве стартового, должно лежать в диапазоне от -231 до 231-1

ПРИМЕР

SET GENERATOR SYSNUMBER TO 1000;

Если функция GEN_ID() вызовет генератор с шагом 1, то первый возвращенный номер будет 1001.

SET NAMES

ОПИСАНИЕ

SET NAMES задает набор символов для использования при последующих соединениях с базой данных. Это дает возможность ISQL переопределить заданный по умолчанию набор символов для базы данных.

Команда SET NAMES должна появляться перед командой CONNECT, на которую она должна воздействовать.

СИНТАКСИС

SET NAMES [charset 7 ;

Таблица А.68. Синтаксические конструкции команды SET NAMES

Аргумент Описание
Charset Имя набора символов, идентифицирующего активный набор символов для данного процесса. Значение по умолчанию -NONE

ПРИМЕР

SET NAMES WIN1251;

CONNECT "testbase.gdb”;

SET STATISTICS

ОПИСАНИЕ

SET STATISTICS дает возможность вычислить селективность индекса. Индексная селективность - число, основанное на количестве различных строк в таблице, которое используется оптимизатором InterBase при обращении к таблице. Индексная селективность используется оптимизатором для определения плана выполнения запроса, исходя из минимизации ожидаемого количества просматриваемых строк таблицы. В таблицах, где число двойных значений в индексированных столбцах радикально увеличивается или уменьшается, периодическое вычисление индексной селективности может существенно ускорить время выполнения.

Только создатель индекса может использовать команду SET STATISTICS.

Команда SET STATISTICS не перестраивает индекс. Для перестройки индекса следует использовать команду ALTER INDEX.

СИНТАКСИС

SET STATISTICS INDEX name;

Таблица A.69. Синтаксические конструкции команды SET STATISTICS INDEX

Аргумент Описание
name Имя существующего индекса, для которого рассчитывается индексная селективность

ПРИМЕР

SET STATISTICS INDEX TREADER_RDNAME;

SET TERM

ОПИСАНИЕ Определяет символ или символы для индикации конца команд. Значение по умолчанию - точка с запятой (;).

СИНТАКСИС SET TERM string;

Таблица АЛО. Синтаксические конструкции команды SET TERM

Аргумент Описание
string Определяет символ или символы для индикации конца команд. Значение по умолчанию - точка с запятой (;)

По умолчанию ISQL команды должны заканчиваться точкой с запятой (;). Чтобы изменить символ индикации конца используется команда SET TERM.

SET TERM обычно используется с командой CREATE PROCEDURE или CREATE TRIGGER. Процедуры и триггеры определяются, используя язык процедур и триггеров, в котором команды всегда заканчиваются точкой с запятой. Процедура или триггер в целом сами должны быть завершены символом, отличным от точки с запятой.

Текстовый файл, содержащий определение CREATE PROCEDURE или CREATE TRIGGER, должен включать одну команду SET TERM перед определениями и одну команду SET TERM после определений. Сначала SET TERM определяет новый символ завершения; в конце - восстанавливает точку с запятой (;), как значение по умолчанию.

Использование SET TERM из isql сеанса дает тот же эффект, что и использование признака конца в командной строки.

ПРИМЕР Следующий пример содержит использование команды SET TERM при создании хранимой процедуры. Первая команда SET TERM задает ## как символ окончания; завершающая команда SET TERM восстанавливает ";" в качестве символа окончания.

SET TERM л ;

CREATE PROCEDURE PAUTHOR (

Pi CHAR (1),

P2 CHAR (1))

RETURNS (

AUTHOR INTEGER,

AUNAME VARCHAR (60))

AS

begin

for select author, auname from tauthor into :author, :auname

do

if(auname>pl) then if(auname<p2) then suspend; end л

SET TERM ; л

SET TRANSACTION

ОПИСАНИЕ

SET TRANSACTION определяет заданный по умолчанию доступ к базе данных из транзакции, обработку конфликта блокировки и уровень взаимодействия с другими параллельно работающими транзакциями, об. ращающимися к тем же самым данным. Команда может также резервировать блокировки для таблиц.

По умолчанию, транзакция имеет к базе доступ на чтение и запись. Если транзакция должна только читать данные, следует задать параметр read only.

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

ISOLATION LEVEL определяет, как заданная по умолчанию транзакция взаимодействует с другими транзакциями, обращающимися к тем же таблицам. Заданный по умолчанию уровень изоляции - SNAPSHOT (снимок). Это обеспечивает повторный просмотр базы данных в момент старта транзакции. Изменения, сделанные другими транзакциями, невидимы. SNAPSHOT TABLE STABILITY обеспечивает повторное чтение базы данных, гарантируя, что транзакции не могут записывать в таблицы, хотя они могут читать из них.

READ COMMITTED дает возможность заданной по умолчанию транзакции видеть последние изменения, сделанные другими транзакциями. Можно также модифицировать строки, пока не происходит никаких конфликтов модификаций. Нейтральные изменения, сделанные другими транзакциями, остаются невидимыми, пока не будет выдана команда COMMIT. Режим READ COMMITTED имеет также два необязательных параметра:

1. NO RECORD_VERSION (значение по умолчанию) читает только самую последнюю версию строки. Если определена опция, разрешающая блокировку ожидания (WAIT), то транзакция ждет, пока самая последняя версия строки не будет сохранена или восстановлена (rolled back), и повторяет ее чтение.

2. RECORD_VERSION читает самую последнюю завершенную версию строки, даже если более новая (но незавершенная) версия также постоянно находится на диске.

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

СИНТАКСИС

SET TRANSACTION fREAD WRITE / READ ONLY J /WAIT / NO WAIT7

[ /ISOLATION LEVEL J {SNAPSHOT /TABLE STABILITY]

/ READ COMMITTED [ [m ] RECORDJVERSION ] } ]

[RESERVING <reserving_clause>;

<reserving_clause>; .• = table [, table ...]

[for /SHARED / PROTECTED7 fREAD / WRITE7 7

[,<reserving_clause>]

Таблица А.71. Синтаксические конструкции команды SET TRANSACTION

Аргумент Описание
READ WRITE Специфицирует, что транзакция может читать и писать таблицы (по умолчанию)
READ ONLY Специфицирует, что транзакция может только читать таблицы
WAIT Специфицирует, что транзакция ждет доступа, если возникает конфликт блокировок с другой транзакцией (по умолчанию)
NO WAIT Специфицирует, что транзакция немедленно завершается, если возникает конфликт блокировок с другой транзакцией
Аргумент Описание
ISOLATION LEVEL Специфицирует уровень изоляции для данной транзакции при попытке доступа к таблицам одновременно с другими транзакциями (по умолчанию SNAPSHOT)
RESERVING

<reserving_clause >

Резервирует перечень возможных блокировок таблиц при старте транзакций

ПРИМЕР Следующая команда устанавливает заданную по умолчанию транзакцию (gds_$trans) с уровнем изоляции READ COMMITTED. Если транзакция сталкивается с конфликтом модификаций, она ждет и перехватит управление сразу после завершения или отката блокирующей транзакции.

SET TRANSACTION WAIT ISOLATION LEVEL READ COMMITTED; Следующая команда резервирует три таблицы:

SET TRANSACTION

ISOLATION LEVEL READ COMMITTED NO RECORD_VERSION WAIT

RESERVING TABLE1, TABLE2 FOR SHARED WRITE,

TABLE3 FOR PROTECTED WRITE;

UPDATE

ОПИСАНИЕ Команда UPDATE изменяет одну или несколько существующих строк в таблице или обзоре. Необязательное предложение WHERE используется, чтобы ограничить модификации требуемым подмножеством строк в таблице. UPDATE не может модифицировать часть массива. Без опции WHERE команда модифицирует все строки таблицы.

При обновлении столбца BLOB команда UPDATE заменяет содержимое BLOB новым значением.

Права на выполнение UPDATE регулируются командами GRANT и REVOKE.

СИНТАКСИС

UPDATE [table / view}

SET col = <val> [, col = <val> ... ]

[WHERE <search_condition> ] ;

<val>:;= {

col [<array_dim>7 j <constant> j <expr> / <function>

NULL / USER

<array_dim> : : = [LXST_<dim>]

Здесь квадратные скобки являются частью синтаксиса описания массивов, а не элементом метаязыка.

<dim>:;= х[:у]

<constant> num / " string" J charsetname "string"

I _

:<expr> - любое допустимое в SQL выражение, возвращающее |единственное значение (кроме массивов и BLOB) .

<function> = {

CAST (<val> AS <datatype>)

/ UPPER (<val>)

QEN_ID (generator, <val>)

I ;

<search_condition>:. • =

[<val> <operator> [<val> / (<select_one>) }

j <val> [MOT ] BETWEEN <val> MJD <val>

/ <val> [HOT] LIKE <val> /"ESCAPE <val>J

/ <val> [not ] IN (<val> [, <val> . . .] / <se-

lect_list>)

/ <val> IS [NOT7 NOLL

/ <val> [[not7 {= I < I >} I >= I <=}

[all / SOME / лик} (<select_list>)

1 / EXISTS (<select_expr>)

/ SINGULAR (<select_expr>) .

/ <val> [NOT] CONTAINING <val>

/ <val> [^»7 STATING [WITHJ <val>

/ (<search_condition>)

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_condition>7

Таблица А.72. Синтаксические конструкции команды UPDATE

Аргумент Описание
table | view Имя существующей таблицы или обзора
SET col = <val> Специфицирует изменяемые столбцы и присваиваемые им значения
WHERE

<search_cond>

Определяет условия, при которых производится модификация строк

ПРИМЕР Следующая инструкция изменяет столбец для всех строк в таблице:

UPDATE TBOOK SET NUM_PRESENCE = NUM_ALL;

Следующая инструкция использует предложение WHERE, чтобы ог+ раничить модификацию столбца подмножеством строк:

UPDATE TREADER SET RDNUMB='1278-98' ,

RDNAME=' Гребенкина H.' where UNIKEY=39;

WHENEVER

ОПИСАНИЕ

WHENEVER перехватывает SQLCODE ошибки и предупреждения^ Каждая выполнимая команда SQL возвращает значение SQLCODE, чтобь! указать ее успех или неудачу. Если SQLCODE равен 0, команда завершилась успешно. Ненулевое значение указывает на ошибку, предупрежден ние или регистрирует состояние «не найдено». Если соответствующе состояние возникло, WHENEVER позволяет, используя метку GOTOi перейти к подпрограмме обработки ошибок в приложении или, используя CONTINUE, игнорировать ошибку.

WHENEVER может ограничить размер приложения, потому что приложение может использовать один набор подпрограмм для обработки всех ошибок и предупреждений.

WHENEVER-команды должны предшествовать любой команде SQL,( которая может приводить к ошибке. Каждое перехватываемое состояние требует отдельной команды WHENEVER. Если WHENEVER опущена для какого-либо состояния, то оно не перехватывается.

Команды WHENEVER . . . CONTINUE должны быть в начале программы обработки ошибок, чтобы предупредить возникновение бесконечных циклов в программах.

Эта команда может использоваться в SQL.

СИНТАКСИС

WHENEVER NОТ FOUND / SQLERROR / SQLWARNING} jfGOTO label / CONTINUE} ;

Таблица А.73. Синтаксические конструкции команды WHENEVER

Аргумент Описание
NOT FOUND Перехватывает SQLCODE = 100: не найдено указанных строк в выполненной команде
SQLERROR Перехватывает SQLCODE < 0: аварийное завершения команды
SQLWARNING Перехватывает SQLCODE > 0 AND < 100: системное предупреждение или информационное сообщение
GOTO label Переход к указанной точке программы при обнаружении ошибки или предупреждения
CONTINUE Игнорирует ошибки и предупреждения и пытается продолжить программу

ПРИМЕР В следующем фрагменте программы внедренного SQL три команды WHENEVER определяют, к какой метке следует перейти при возникновении предупреждения или ошибки:

Переход к метке при возникновении любой ошибки.

EXEC SQL

WHENEVER SQLERROR GO TO Error;

Переход к метке при возникновении ситуаций типа «конец данных» (SQLCODE = 100).

EXEC SQL

WHENEVER NOT FOUND GO TO AllDone;

Игнорируются любые ошибки.

EXEC SQL

WHENEVER SQLWARNING CONTINUE;

Функции

Таблица А.74. Перечень стандартных функций InterBase

Функция Тип Назначение ,
AVG() Агрегатная Вычисляет среднее значение ,
CAST() Преобразование Преобразует данные одного типа в другой
COUNT() Агрегатная Подсчитывает количество строк, удовлетворяющих условию
GEN_ID() Числовая Возвращает сгенерированное системой значение
МАХ() Агрегатная Находит минимальное значение
MIN() Агрегатная Находит минимальное значение
SUM() Агрегатная Вычисляет сумму
UPPER() Преобразование Преобразует строку в верхний регистр

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

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

Числовая функция GEN_ID() выдает сгенерированный системой номер, который может быть вставлен в столбец, требующий числовой тип данных.

AVG()

ОПИСАНИЕ

AVG() - агрегатная функция, которая возвращает среднее число из множества значений в указанном столбце или выражении. AVG() применима только к числовым типам данных.

Если значение одного из полей, по которым вычисляется среднее, NULL, то оно автоматически исключается из вычислений. Автоматическое исключение предотвращает искажение средних от включения бессмысленных данных. AVG() вычисляется по диапазону выбранных строк. Если число строк, возвращенных командой SELECT, равно О, AVG() возвращает значение NULL.

СИНТАКСИС

AVG ([ил] <val> / DISTINCT <val>)

\ Таблица А.75. Синтаксические конструкции функции A VG()

Аргумент Описание
ALL Возвращает среднее по всем величинам
| DISTINCT Исключает повторяющиеся величины перед расчетом
■<val> Столбец или выражение, по которому вычисляется среднее

ПРИМЕР Следующая команда иллюстрирует использование функции AVG() для выбранного множества строк таблицы с приведением исходных данных с помощью функции CAST к типу double precision для корректного подсчета:

SELECT AVG (CAST (BNUMBER as double precision) )

FROM TBOOK_PLACE

WHEREPLACEKEY = 4 3 ;

CAST()

ОПИСАНИЕ

CAST() позволяет смешивать числовые и символьные данные в одном выражении, преобразуя <val> к указанному типу данных. Обычно только однотипные данные могут сравниваться в условиях поиска. CAST() может использоваться в условиях поиска, преобразуя один тип данных в другой для сравнения. Допустимые преобразования показаны в таблице.

Таблица А.76. Типы данных, преобразуемых функцией CASTQ

Исходный тип данных Результирующийтипданных
NUMERIC CHARACTER, VARYING CHARACTER, DATE
CHARACTER, VARYING CHARACTER NUMERIC, DATE
DATE CHARACTER, VARYING CHARACTER, DATE

Если преобразование невозможно, генерируется сообщение об ошибке.

СИНТАКСИС

CAST (<val> AS <datatype>);

Таблица А.77. Синтаксические конструкции функции CASTQ

Аргумент Описание
<val> Столбец, константа или выражение, которое преобразуется к символьному типу
<datatype> Тип данных, к которому производится преобразование

ПРИМЕР Следующая команда иллюстрирует использование функции CAST для приведения исходных данных к типу double precision, обеспечивая корректный подсчет средних значений с помощью функции AVG() по выбранному множеству строк таблицы:

SELECT AVG(CAST(BNUMBER as double precision) )

FROM TBOOK_PLACE

WHEREPLACEKEY=4 3 ;

GENJDQ

ОПИСАНИЕ Функция GEN_ID():

• увеличивает текущее значение указанного генератора на заданную величину (шаг),

• возвращает текущее значение указанного генератора.

• GEN_ID() удобно использовать для автоматической генерации уникальных значений столбцов первичного (PRIMARY KEY) или уникального ключа (UNIQUE). Для вставки сгенерированного значения в столбец можно использовать триггер, процедуру или команду SQL, вызывающую функцию GEN_ID().

Генератор создается командой CREATE GENERATOR. По умолчанию, начальное значение генератора 0. Другое значение можно установить командой SET GENERATOR.

СИНТАКСИС

GEN_ID (generator, step)

|Таблица А.78. Синтаксические конструкции функции GEN ID ()

Аргумент Описание
generator Имя существующего генератора
step Целое или выражение, задающее приращение для увеличения или уменьшения значения генератора. Значение лежит в диапазоне от -231 до 231-1

ПРИМЕР Следующее определение триггера включает запрос к GENID ():

SET TERM ! ! ;

CREATE TRIGGER I_TREADER_1 FOR TREADER ACTIVE BEFORE INSERT POSITION 0 as

begin

if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.RDNUMB is NULL) then exception NO_RDNUMB; if (new.RDNAME is NULL) then exception NO_RDNAME; end

SET TERM ; !!

При первом включении триггера NEW.RDNUMB получит значение 1, затем 2 и т.д.

МАХ()

ОПИСАНИЕ МАХ() - агрегатная функция, которая возвращает наибольшее число из множества значений в указанном столбце или выражении. Если значение одного из полей, по которым вычисляется среднее, NULL, то оно автоматически исключается из вычислений. МАХ() вычисляется по диапазону выбранных строк. Если число строк, возвращенных командой SELECT, равно О, МАХ() возвращает значение NULL.

Если МАХ() применяется для столбцов типа CHAR, VARCHAR или текстовый BLOB, максимум определяется в зависимости от символьного набора (CHARACTER SET) и порядка сравнения (COLLATION).

СИНТАКСИС (/all7<val> / DISTINCT <val>);

Таблица А.79. Синтаксические конструкции функции МАХ()

Аргумент Описание
ALL Поиск ведется среди всех значений в столбце
DISTINCT Повторяющиеся значения исключаются перед поиском наибольшего
<val> Столбец или выражение, которое преобразуется к числовому типу

ПРИМЕР Следующая команда иллюстрирует использование функций SUM(),

• MIN() и МАХ() для множества строк таблицы:

SELECT SUM(BNUMBER), MAX(BNUMBER), MIN(BNUMBER)

FROM TBOOK_PLACE;

MINQ

ОПИСАНИЕ

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

Если MIN() применяется для столбцов типа CHAR, VARCHAR или текстовый BLOB, минимум определяется в зависимости от символьного набора (CHARACTER SET) и порядка сравнения (COLLATION).

СИНТАКСИС

MIN ( /all ] <val> / DISTINCT <val>) ,•

Таблица А.80. Синтаксические конструкции функции МАХ()

Аргумент Описание
ALL Поиск ведется среди всех значений в столбце
DISTINCT Повторяющиеся значения исключаются перед поиском наименьшего
<val> Столбец или выражение, которое преобразуется к числовому типу

ПРИМЕР Следующая команда иллюстрирует использование функций SUM(), MIN() и МАХ() для множества строк таблицы:

SELECT SUM(BNUMBER), MAX(BNUMBER), MIN(BNUMBER)

FROM TBOOK_PLACE;

sumo

ОПИСАНИЕ

SUM() - агрегатная функция, которая возвращает сумму из множества значений в указанном столбце или выражении. Если значение одного из полей, по которым вычисляется среднее, NULL, то оно автоматически исключается из вычислений. SUM() вычисляется по диапазону выбранных строк. Если число строк, возвращенных командой SELECT, равно О, SUM() возвращает значение NULL.

СИНТАКСИС

SUM < [ALL] <val> / DISTINCT <val>) ;

Таблица А.81. Синтаксические конструкции функции SUMQ

Аргумент Описание
ALL Сумма значений в столбце
DISTINCT Повторяющиеся значения исключаются перед расчетом суммы
<val> Столбец или выражение, которое преобразуется к числовому типу

ПРИМЕР Следующая команда иллюстрирует использование функций SUM(), MIN() и МАХ() для множества строк таблицы:

SELECT SUM(BNUMBER), MAX(BNUMBER), MIN(BNUMBER)

FROM TBOOK_PLACE;

UPPERQ

ОПИСАНИЕ

UPPER() преобразует заданную строку к верхнему регистру.

Если в указанном символьном наборе нет чувствительности к регистру, то функция UPPER() не изменяет данные.

СИНТАКСИС

UPPER (<val>);

Замечание. Функция UPPER не работает с кириллицей. Для соответствующих преобразований следует использовать функцию пользователя (UDF), выполняющую аналогичные действия.

Таблица А.82. Синтаксические конструкции функции UPPERQ

Аргумент Описание
<val> Столбец, константа или выражение, преобразуемое к символьному типу

ПРИМЕР Если поле ABC содержит строку «asdfghjk» , то результатом вызова функции UPPER будет «ASDFGHJK».

UPPER (BMat thews) ;

Если поле ABC содержит строку «фывапрол», то в результатом следующего вызова функции UPPER будет «фывапрол». Для преобразования кириллицы следует использовать пользовательскую функцию типа RUPPER. См. пример 6.27.

А.З. Типы данных

InterBase поддерживает большинство SQL типов данных, хотя версии до 6 прямо и не поддерживает SQL DATE, TIME, TIMESTAMP. Дополнительно к стандартным типам данных InterBase поддерживает BLOB (binary large object) и массивы любых, кроме BLOB, типов.

Ниже перечислены типы данных, допустимых в командах SQL для InterBase.

Таблица А.83. Типы данных, используемые в InterBase

Наименование Размер Диапазон/

точность

Описание
BLOB перемен ный BLOB хранит большие объемы данных, такие как графика, тексты, цифровой звук и т.д. Основной структурный элемент - сегмент. Подтип описывает содержание
CHAR(n); CHARACTER (n) n символов 1-32767 байт ! Размер символа в наборе определяет максимальное число символов (общая длина не больше 32К)
DATE 64 бит от 1.01.100 I Дополнительно включает и данные о времени для версии младше 6.
TIME 64 бит от 0 до 23.59.9999 Время (только в версии от 6).
TIMESTAMP 64 бит от 1.01.100 Дополнительно включает и данные о времени (только в версии от 6).
DECIMAL (precision, scale) перемен ный 1-15/1-15 точность не превосходит длину : Число с указанным количеством десятичных цифр. Например: DECIMAL(10,3)

ppppppp.sss.

DOUBLE

PRECISION

64 бит От 1 7* 10-з°8

до 1.7*10308

15 значащих цифр. Реальный размер зависит от платформы - обычно 64 бит
FLOAT 32 бит От 3.4*10"38

до 3.4*1038

7 значащих цифр
Наименование Размер Диапазон/

точность

Описание
INTEGER 32 бит От -231 до 231-1 Длинное целое
NUMERIC (precision, scale) перемен ный 1-15/1-15

точность не превосходит

длину

Число с указанным количеством десятичных цифр. Например: NUMERIC(10, 3) ppppppp.sss.
SMALLINT 16 бит От-215 до 215-1 Короткое целое
VARCHAR(n);

VARYING CHAR (n);

VARYING

CHARACTER

(n)

п символов 1-32767байт Строки переменной длины. Размер символа в наборе определяет максимальное число символов (общая длина не больше 32К)

А.4. Коды завершения SQL

По завершении любой выполнимой команды SQL формируется ее код завершения (SQLCODE), сигнализирующей об успешности ее выполнения.

В таблице приведены формируемые коды завершения (SQLCODE).

Таблица А.84. Коды завершения SQL в InterBase

SQLCODE Сообщение Описание
<0 SQLERROR Произошла ошибка. Команда не выполнена -
0 SUCCESS Успешное выполнение
+ 1-99 SQLWARNING Системное предупреждение или информационное сообщение
+ 100 NOT FOUND Нет строк для обработки или достигнут конец текущего активного набора

В ISQL при возникновении ошибки выдается ее номер и соответствующее сообщение.

Глава 11 | Введение в InterBase | Сообщения об ошибках


Введение в InterBase



Новости за месяц

  • Апрель
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс