авторефераты диссертаций БЕСПЛАТНАЯ БИБЛИОТЕКА РОССИИ

КОНФЕРЕНЦИИ, КНИГИ, ПОСОБИЯ, НАУЧНЫЕ ИЗДАНИЯ

<< ГЛАВНАЯ
АГРОИНЖЕНЕРИЯ
АСТРОНОМИЯ
БЕЗОПАСНОСТЬ
БИОЛОГИЯ
ЗЕМЛЯ
ИНФОРМАТИКА
ИСКУССТВОВЕДЕНИЕ
ИСТОРИЯ
КУЛЬТУРОЛОГИЯ
МАШИНОСТРОЕНИЕ
МЕДИЦИНА
МЕТАЛЛУРГИЯ
МЕХАНИКА
ПЕДАГОГИКА
ПОЛИТИКА
ПРИБОРОСТРОЕНИЕ
ПРОДОВОЛЬСТВИЕ
ПСИХОЛОГИЯ
РАДИОТЕХНИКА
СЕЛЬСКОЕ ХОЗЯЙСТВО
СОЦИОЛОГИЯ
СТРОИТЕЛЬСТВО
ТЕХНИЧЕСКИЕ НАУКИ
ТРАНСПОРТ
ФАРМАЦЕВТИКА
ФИЗИКА
ФИЗИОЛОГИЯ
ФИЛОЛОГИЯ
ФИЛОСОФИЯ
ХИМИЯ
ЭКОНОМИКА
ЭЛЕКТРОТЕХНИКА
ЭНЕРГЕТИКА
ЮРИСПРУДЕНЦИЯ
ЯЗЫКОЗНАНИЕ
РАЗНОЕ
КОНТАКТЫ


Pages:     | 1 |   ...   | 8 | 9 || 11 |

«ББК 32.973 С 43 Скляр А.Я. С43 Введение в InterBase — М.: Горячая линия-Телеком, 2002. - 517 с: ил. ISBN 5-93517-062-0. ...»

-- [ Страница 10 ] --

Таблица А.56. Перечень команд для работы с курсором Назначение Мп/п Команда Объявляет курсор. Конструкция SELECT DECLARE CURSOR определяет состав столбцов курсора Получает строки, указанные в DECLARE OPEN CURSOR. Полученные строки образуют активный набор курсора FETCH Получает очередную строку активного набора, начиная с первой. Последова тельное выполнение FETCH продвигает курсор по набору 4 CLOSE Закрывает курсор и освобождает сис темные ресурсы Эта инструкция может использоваться в SQL и DSQL.

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

OPEN ^TRANSACTION t r a n s a c t i o n. 7 c u r s o r ;

DSQL form:

OPEN /"TRANSACTION t r a n s a c t i o n 7 c u r s o r /USING SQL DESCRIPTOR x s q l d a j Blob form:

OPEN /"TRANSACTION name 7 c u r s o r {INTO / USING} : b l o b _ i d ;

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

Таблица А.57. Синтаксические конструкции команды 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 значение blobid поступает из курсо ра внешней таблицы. Для конструкции INSERT BLOB это значение воз вращается системой.

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

СИНТАКСИС OPEN [TRANSACTION namej c u r s o r {"INTO / USING} : b l o b _ i d ;

450 Приложение А Таблица А.58. Синтаксические конструкции команды OPEN (BLOB) Аргумент Описание Специфицирует транзакцию, в рамках которой откры TRANSACTION вается курсор. Если не указан, то применяется тран name закция по умолчанию Cursor Имя BLOB-курсора В зависимости от типа BLOB-курсора применяется INTO | USING одна из конструкций:

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 transactionj statement 452 Приложение А /"INTO SQL DESCRIPTOR x s q l d a j F O R M {:variable / "string"};

Таблица А.60. Синтаксические конструкции команды PREPARE Аргумент Описание transaction Имя транзакции, в рамках которой выполняется команда statement Устанавливает псевдоним (алиас) для подготовленного предложения, которое может быть использовано в последо вательности команд DESCRIBE и EXCUTE INTO xsqlda Задает XSQLDA, которая будет заполняться описаниями выбираемых столбцов в подготовленной команде Текст подготавливаемой командой PREPARE команды :variable DSQL. Может быть переменной базового языка или сим "string" вольной строкой ПРИМЕР Следующая команда внедренного 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 7 { {"ALL /"PRIVILEGES ] I SELECT / DELETE / INSERT / UPDATE /"(col [, COl...])]} ON fTABLE7 ftablename / viewnameT' FROM fobject / userlistj / EXECUTE ON PROCEDURE procname FROM fobject / userlist ;

•, object = PROCEDURE procname / TRIGGER trigname / VIEW viewname / /^JSER7 username / PUBLIC [, object_/ userlist = username /4JSERJ username [USER] [,...] 454 Приложение А Таблица А.62. Синтаксические конструкции команды REVOKE Описание Аргумент GRANT OPTION Отменяет у пользователей, перечисленных в userlist, FOR права на делегирование прав на объекты базы данных.

Неприменим по отношению к объектам (object) базы данных col Имя столбца, на который выдаются права tablename Имя существующей таблицы, на которую распространя ются права viewname Имя существующего обзора, на который распространя ются права object Имя существующего объекта базы, на который распро страняются права userlist Список пользователей, которым передаются права ПРИМЕР Следующая команда ликвидирует у пользователя права на чтение таблицы:

REVOKE SELECT ON TBOOK FROM MISHA;

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

REVOKE EXECUTE ON PROCEDURE PBUTHOR FROM PROCEDURE PBOOKAUTHOR, MISHA;

ROLLBACK ОПИСАНИЕ ROLLBACK отменяет все команды по изменению данных (DML), произведенные после последней команды COMMIT. Команды DDL (опи сания данных) записываются автоматически, поэтому ROLLBACK к ним неприменима.

СИНТАКСИС ROLLBACK /"WORKJ;

Справочник по командам и функциям Таблица А.63. Синтаксические конструкции команды REVOKE Описание Аргумент WORK Необязательное слово;

используется для совместимости ПРИМЕР Следующие команды иллюстрируют применение ROLLBACK в ISQL. Первая команда ROLLBACK отменяет вставку данных (команду INSERT), но не создание таблицы (CREATE TABLE), вторая - не оказывает никакого действия, поскольку результаты команды INSERT уже были сохранены (выдана команда COMMIT).

CREATE TABLE T (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 приведе но в таблице.

456 Приложение А Таблица А.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... [WHERE search_condition_/ /"GROUP BY col /"COLLATE collation./ [, col /"COLLATE collation./... ] /"HAVING search_condition /4jNION select_expr_/ /^PLAN plan_expr /"ORDER BY o r d e r _ l i s t J val = { col [array_dim7 / constant / expr / function Справочник по командам и функциям / NULL / USER / RDB$DB_KEY } array_dim ;

;

= [ LIST_dim ] Квадратные скобки при описание массива являются частью син таксиса, а не признаком необязательности.

dim;

:= x[:y] constant:. = пшп / "string" j charsetname "string" • expr - любое допустимое выражение в SQL, возвращающее единственное значение (кроме массива и BLOB).

function = { COUNT (* / /"ALL 7 val / DISTINCT val) / SDM ( [ALh] val / DISTINCT val) / AVG ( /ALL] val / DISTINCT val) / MAX ( /"ALL] val / DISTINCT val) / MIN ( /"ALL7 val / DISTINCT val) / CAST (val AS datatype) / UPPER (val) / GEN_ID (generator, val) ;

tableref::= joined_table / table / view / procedure f(val [, val...])] /"alias] joined_table:;

= tableref join_type JOIN tableref ON search_condition / (joined_table) join-type::= { /"INNERJ / {"LEFT / RIGHT / FULL } /"OUTER ] } JOIN search_condition = fval operator fval / (select_one) } I val [ЪЮТ] BETWEEN val AND val / val [тот] LIKE val /"ESCAPE val 17 Введение в Inter8ase 458 Приложение А I val /"NOT 7 IN (val val se [,...] \ lect_list) / v a l IS /"NOT ] MULL / vai {[NOT7 {=//;

/=/ =;

{ALL / SOME / AMYJ (select_list) / EXISTS (select_expr) / SINGULAR (select_expr) / val [ЛЮТ] CONTAINING val / val [NOT 7 STARTING /WITHJ val / (search_condition) / NOT search_condition / search_condition OR search_condition / search_condition AND search_condition 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:;

= f c o l / i n t } [COLLATE c o l l a t i o n ] /"ASC /"ENDING7 / DESC /"ENDING J ] order_list] [, Справочник по командам и функциям Таблица А.65. Синтаксические конструкции команды SELECT и их опции Аргумент Описание Задает перечень выбираемых данных. Опция SELECT /DISTINCT DISTINCT запрещает выборку повторяющихся ALL/ значений.

Опция ALL (по умолчанию) выбирает любые значения * задает режим выборки всех столбцов указанных {* | val [, val...] таблиц.

val [, val...7 задает выборку указанных столбцов и выражений Задает список таблиц, обзоров и хранимых про FROM tableref [, ta цедур, из которых осуществляется выборка дан bleref...] ных. Список может содержать присоединения, и эти присоединения могут быть вложенными table Имя существующей в базе таблицы view Имя существующего в базе обзора procedure Имя существующей в базе хранимой процедуры, функционирующей аналогично команде SELECT alias Алиас - альтернативное имя для таблицы или обзора. После объявления в tableref алиас мо жет использоваться для указания ссьшок на таблицу или обзор joined_table Указание на таблицу, содержащую конструкцию JOIN join_type Тип используемого соединения. По умолчанию принимается INNER WHERE search_cond Задает условие выборки строк Разбивает множество выбранных строк на груп GROUP BY col [, col пы, содержащие все строки с одинаковыми зна чениями в перечисленных столбцах COLLATE collation Задает порядок сравнения данных, получаемых по запросу HAVING search_cond Используется вместе с конструкцией GROUP BY.

Задает дополнительные условия отбора результи рующих строк 460 Приложение А Аргумент Описание 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.rdnumb, 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 Справочник по командам и функциям ( s e l e c t * from TBOOK_READER where bookkey=TBOOK.unikey) Следующая команда использует контекстный поиск:

SELECT BOOKNM,unikey from TBOOK 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, ТВООК.booknm FROM TREADER, TBOOK, TBOOK_READER where tbook_reader.reader=treader.unikey and tbook_reader.bookkey=tbook.unikey PLAN 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;

462 Приложение А Функция объявлена, как:

DECLARE EXTERNAL FUNCTION RUPPER CSTRING (256) RETURNS CSTRING (256) ENTRY_POINT '_srupper' MODULE_NAME 'MYDLL.dl 1 •;

.

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} d b h a n d l e = /"GLOBAL / STATIC / EXTERNJ /"COMPILETIMEJ /"FILENAME ] "dbname" fuSER "name" PASSWORD " s t r i n g " /"RUNTIME /"FILENAME 7 {""dbname" / :vari flJSER {"name" / : v a r 7 PASSWORD f"string" / Таблица А.66. Синтаксические конструкции команды SET DATABASE Аргумент Описание Задает алиас (псевдоним) для указанной базы данных.

dbhandle Алиас должен быть уникальным внутри программы. Он используется в командах SQL, поддерживающих деск рипторы баз данных GLOBAL Область действия имени по умолчанию - GLOBAL озна чает, что дескриптор базы данных доступен всем моду лям кода в приложении STATIC STATIC означает, что дескриптор базы данных доступен в том модуле кода, где он объявлен EXTERN Ссылается на глобальный дескриптор базы данных, объ явленный в другом модуле COMPILETIME Указывает базу данных, используемую для просмотра столбцов на подготовительном этапе. Если в конструк ции SET DATABASE указана только одна база, она будет использоваться и на этапе выполнения "dbname" Задает имя и путь к базе данных, заданных дескрипто ром. Задание параметра зависит от платформы, на кото рой реализуется база RUNTIME Указывает на другую базу данных для использования на этапе выполнения, отличную от используемой на подго товительном этапе :var Переменная базового языка, содержащая спецификацию базы, имя пользователя, пароль 464 Приложение А Аргумент Описание USER "name" Требуется для клиентского PC-соединения, не обязатель на для других. Обеспечивает контроль имени пользова теля на сервере, где размещается база данных. Использу ется вместе с паролем (PASSWORD) для контроля прав доступа пользователя на сервере Требуется для клиентского PC-соединения, не обязатель PASSWORD "string" на для других. Обеспечивает контроль пароля на сервере, где размещается база данных. Используется вместе с именем пользователя (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 задает новое значение для генератора. Когда G E N I D () используется для вставки или модификации значений в столбцах, то ее Справочник по командам и функциям возвращаемое значение равно int плюс приращение - параметр шага, ука занный в G E N I D ().

Чтобы указать, что первое выдаваемое значение было равно 1, следу ет указать в SET GENERATOR стартовое значение равным 0 и устано вить значение шага в функции GEN_ID() в 1.

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

СИНТАКСИС SET GENERATOR name TO int;

Таблица А.67. Синтаксические конструкции команды SET GENERA TOR Аргумент Описание Name Имя существующего генератора Int Значение, которое задается генератору в качестве стартово го, должно лежать в диапазоне от -231 до 231- ПРИМЕР SET GENERATOR SYSNUMBER TO 1 0 0 0 ;

Если функция GEN_ID() вызовет генератор с шагом 1, то первый возвращенный номер будет 1001.

SET NAMES ОПИСАНИЕ SET NAMES задает набор символов для использования при после дующих соединениях с базой данных. Это дает возможность ISQL пере определить заданный по умолчанию набор символов для базы данных.

Команда SET NAMES должна появляться перед командой CONNECT, на которую она должна воздействовать.

СИНТАКСИС SET N M S AE /"charsetj;

466 Приложение А Таблица А.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;

Таблица А.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 ( 468 Приложение А AUTHOR INTEGER, AUNAME VARCHAR (60)) AS begin for select author, auname from tauthor into :author, :auname do i f(aunamepl) then if(aunamep2) 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 /"READ WRITE / READ ONLYJ /"WAIT / NO WAITJ [ FISOLATION LEVEL J {SNAPSHOT /"TABLE STABILITY J / READ COMMITTED [ [HO] RECORDJVERSION./ } ] /"RESERVING r e s e r v i n g _ c l a u s e ;

r e s e r v i n g _ c l a u s e ;

: = t a b l e [, t a b l e...] /"FOR /"SHARED / PROTECTED J {READ / WRITE}] [,reserving_clauseJ Таблица А.71. Синтаксические конструкции команды SET TRANSACTION Аргумент Описание READ WRITE Специфицирует, что транзакция может читать и пи сать таблицы (по умолчанию) READ ONLY Специфицирует, что транзакция может только читать таблицы Специфицирует, что транзакция ждет доступа, если WAIT возникает конфликт блокировок с другой транзакци ей (по умолчанию) NO WAIT Специфицирует, что транзакция немедленно завер шается, если возникает конфликт блокировок с дру гой транзакцией 470 Приложение А Аргумент Описание Специфицирует уровень изоляции для данной транзак 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_conditionJ ;

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

= { col [array_dim] j constant / expr / function / KOLL / USER array_dim:: = [ LIST_dim ] Здесь квадратные скобки являются частью синтаксиса описания массивов, а не элементом метаязыка.

dim::= х[:у] constant::= num / "string" / charsetname "string" expr - любое допустимое в SQL выражение, возвращающее единственное значение (кроме массивов и BLOB).

function::= { CAST (val AS datatype) / UPPER (val) / QEN_ID (generator, val) ;

search_condition:.• = fval operator fval / (select_one)} I val /"NOT 7 BETWEEN val AHD val / val /'NOT] LIKE val /"ESCAPE valJ / val [SOT] IN (val [, val...] / se lect_list) / val IS /"N0T7 NOLb / val {[ЯОТ] {= I I } I = I =;

{"ALL / SOME / ANY} (select_list) / EXISTS (select_expr) / SINGULAR (select_expr) / val /"NOT] CONTAINING val / val /"NOTj STARTING /"WITHJ val / (search_condition) / NOT search_condition / search_condition OR search_condition / search_condition AND search_condition} Приложение А Таблица А.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=' Гребенкина Н.' where UNIKEY=39;

WHENEVER ОПИСАНИЕ WHENEVER перехватывает SQLCODE ошибки и предупреждения^ Каждая выполнимая команда SQL возвращает значение SQLCODE, чтобы!

указать ее успех или неудачу. Если SQLCODE равен 0, команда заверши лась успешно. Ненулевое значение указывает на ошибку, предупрежде ние или регистрирует состояние «не найдено». Если соответствующе* состояние возникло, WHENEVER позволяет, используя метку GOTOi перейти к подпрограмме обработки ошибок в приложении или, используя CONTINUE, игнорировать ошибку.

WHENEVER может ограничить размер приложения, потому что приложение может использовать один набор подпрограмм для обработки!

всех ошибок и предупреждений.

WHENEVER-команды должны предшествовать любой команде SQL,( которая может приводить к ошибке. Каждое перехватываемое состояние требует отдельной команды WHENEVER. Если WHENEVER опущена для какого-либо состояния, то оно не перехватывается.

Справочник по командам и функциям Команды WHENEVER... CONTINUE должны быть в начале про граммы обработки ошибок, чтобы предупредить возникновение беско нечных циклов в программах.

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

СИНТАКСИС WHENEVER {NOT FOUND / SQLERROR / SQLWARNINGJ ^GOTO label / CONTINUE};

Таблица А.73. Синтаксические конструкции команды WHENEVER Аргумент Описание Перехватывает SQLCODE = 100: не найдено указанных NOT FOUND строк в выполненной команде SQLERROR Перехватывает SQLCODE 0: аварийное завершения команды Перехватывает SQLCODE 0 AND 100: системное SQLWARNING предупреждение или информационное сообщение Переход к указанной точке программы при обнаружении 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;

474 Приложение А А.2. Функции Таблица А.74. Перечень стандартных функций InterBase, Функция Тип Назначение Агрегатная Вычисляет среднее значение AVG() Преобразование Преобразует данные одного типа в другой CAST() COUNT0 Агрегатная Подсчитывает количество строк, удовлетворяющих условию GEN_ID() Числовая Возвращает сгенерированное системой значение Агрегатная МАХ() Находит минимальное значение MIN() Агрегатная Находит минимальное значение SUM() Агрегатная Вычисляет сумму UPPER() Преобразование Преобразует строку в верхний регистр Агрегатные функции производят вычисления на множестве значе ний, таких как множество значений столбца, полученного командой SELECT.

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

Числовая функция GEN_ID() выдает сгенерированный системой но мер, который может быть вставлен в столбец, требующий числовой тип данных.

AVG() ОПИСАНИЕ AVG() - агрегатная функция, которая возвращает среднее число из множества значений в указанном столбце или выражении. AVG() приме нима только к числовым типам данных.

Если значение одного из полей, по которым вычисляется среднее, NULL, то оно автоматически исключается из вычислений. Автоматиче ское исключение предотвращает искажение средних от включения бес смысленных данных. AVG() вычисляется по диапазону выбранных строк.

Если число строк, возвращенных командой SELECT, равно О, AVG() воз вращает значение NULL.

СИНТАКСИС AVG ( /"ALL7 val / DISTINCT val) ;

Справочник по командам и функциям \ Таблица А.75. Синтаксические конструкции функции A VGQ Описание Аргумент Возвращает среднее по всем величинам ALL Исключает повторяющиеся величины перед расчетом | DISTINCT val Столбец или выражение, по которому вычисляется среднее ПРИМЕР Следующая команда иллюстрирует использование функции AVG() для выбранного множества строк таблицы с приведением исходных дан ных с помощью функции CAST к типу double precision для корректного подсчета:

SELECT AVG(CAST(BNUMBER as double precision)) FROM TBOOK_PLACE WHERE PLACEKEY=43;

CASTQ ОПИСАНИЕ CAST() позволяет смешивать числовые и символьные данные в од ном выражении, преобразуя val к указанному типу данных. Обычно только однотипные данные могут сравниваться в условиях поиска.

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

Таблица А.76. Типы данных, преобразуемых функцией CASTQ Исходный тип данных Результирующий тип данных NUMERIC CHARACTER, VARYING CHARACTER, DATE CHARACTER, VARYING NUMERIC, DATE CHARACTER DATE CHARACTER, VARYING CHARACTER, DATE Если преобразование невозможно, генерируется сообщение об ошибке.

476 Приложение А СИНТАКСИС CAST (val AS datatype);

Таблица А.77. Синтаксические конструкции функции CAST() Описание Аргумент val Столбец, константа или выражение, которое преобразуется к символьному типу datatype Тип данных, к которому производится преобразование ПРИМЕР Следующая команда иллюстрирует использование функции CAST для приведения исходных данных к типу double precision, обеспечивая корректный подсчет средних значений с помощью функции AVG() по выбранному множеству строк таблицы:

SELECT AVG(CAST(BNUMBER as double precision)) FROM TBOOK_PLACE WHERE PLACEKEY=43;

GENJDQ ОПИСАНИЕ Функция GEN_ID():

• увеличивает текущее значение указанного генератора на заданную величину (шаг), • возвращает текущее значение указанного генератора.

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

Генератор создается командой CREATE GENERATOR. По умолча нию, начальное значение генератора 0. Другое значение можно устано вить командой SET GENERATOR.

СИНТАКСИС OEN_ID (generator, step);

Справочник по командам и функциям Таблица А.78. Синтаксические конструкции функции GEN_ID () Описание Аргумент Имя существующего генератора generator Целое или выражение, задающее приращение для увеличе step ния или уменьшения значения генератора. Значение лежит 31 в диапазоне от -2 до 2 - ПРИМЕР Следующее определение триггера включает запрос к G E N I D ():

SET TERM !! ;

CREATE TRIGGER I_TREADER_1 FOR TREADER ACTIVE BEFORE INSERT POSITION 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).

СИНТАКСИС MX A val / DISTINCT v a l ) ;

{[ALb] 478 Приложение А Таблица А.79. Синтаксические конструкции функции MAXQ Аргумент Описание Поиск ведется среди всех значений в столбце 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 J v a l / DISTINCT v a l ) ;

Таблица А.80. Синтаксические конструкции функции МАХ() Аргумент Описание ALL Поиск ведется среди всех значений в столбце DISTINCT Повторяющиеся значения исключаются перед поиском наи меньшего val Столбец или выражение, которое преобразуется к числовому типу Справочник по командам и функциям ПРИМЕР Следующая команда иллюстрирует использование функций SUM(), MIN() и МАХ() для множества строк таблицы:

SELECT SUM(BNUMBER), MAX(BNUMBER), MIN(BNUMBER) FROM TBOOK_PLACE;

SUMQ ОПИСАНИЕ SUM() - агрегатная функция, которая возвращает сумму из множест ва значений в указанном столбце или выражении. Если значение одного из полей, по которым вычисляется среднее, NULL, то оно автоматически исключается из вычислений. SUM() вычисляется по диапазону выбран ных строк. Если число строк, возвращенных командой SELECT, равно О, SUM() возвращает значение NULL.

СИНТАКСИС / DISTINCT val) ;

val SUM Таблица А.81. Синтаксические конструкции функции SUMQ Аргумент Описание Сумма значений в столбце ALL DISTINCT Повторяющиеся значения исключаются перед расчетом суммы val Столбец или выражение, которое преобразуется к числовому типу ПРИМЕР Следующая команда иллюстрирует использование функций SUM(), MIN() и МАХ() для множества строк таблицы:

SELECT SUM(BNUMBER), MAX(BNUMBER), MIN(BNUMBER) FROM TBOOK_PLACE;

UPPERQ ОПИСАНИЕ UPPER() преобразует заданную строку к верхнему регистру.

480 Приложение А Если в указанном символьном наборе нет чувствительности к реги стру, то функция UPPER() не изменяет данные.

СИНТАКСИС UPPER (val);

Замечание. Функция UPPER не работает с кириллицей. Для соответ ствующих преобразований следует использовать функцию пользователя (UDF), выполняющую аналогичные действия.

Таблица А.82. Синтаксические конструкции функции UPPERQ Аргумент Описание val Столбец, константа или выражение, преобразуемое к сим вольному типу ПРИМЕР Если поле ABC содержит строку «asdfghjk», то результатом вызова функции UPPER будет «ASDFGHJK».

UPPER (BMa t 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 хранит большие объе перемен мы данных, такие как графи ный ка, тексты, цифровой звук и т.д. Основной структурный элемент - сегмент. Подтип описывает содержание 1-32767 ба йт CHAR(n);

n симво- Размер символа в наборе оп лов ределяет максимальное число CHARACTER (n) символов (общая длина не больше 32К) от 1.01. DATE 64 бит Дополнительно включает и данные о времени для версии младше 6.

TIME 64 бит от 0 до Время (только в версии от 6).

23.59. TIMESTAMP 64 бит от 1.01.100 Дополнительно включает и данные о времени (только в версии от 6).

DECIMAL (pre- перемен- Число с указанным количест 1-15/1- cision, scale) ный вом десятичных цифр.

точность не Например: DECIMAL(10,3) превосходит ppppppp.sss.

длину DOUBLE 64 бит От 15 значащих цифр.

Реальный размер зависит от PRECISION 1.7*10' платформы - обычно 64 бит до 1.7* FLOAT 32 бит От 7 значащих цифр 3.4*10" ДО 3.4*10 3 482 Приложение А Описание Диапазон/ Наименование Размер точность Длинное целое 32 бит От- INTEGER до2 3 1 - Число с указанным количест перемен- 1-15/1- NUMERIC (pre вом десятичных цифр.

cision, scale) ный точность не Например: NUMERIC(10, 3) превосходит ppppppp.sss.

длину От-2 1 5 Короткое целое 16 бит SMALLINT о2 - Д п симво- Строки переменной длины.

VARCHAR(n);

1-32767 байт лов Размер символа в наборе оп VARYING ределяет максимальное число CHAR (n);

символов (общая длина не больше 32К) VARYING CHARACTER (n) А.4. Коды завершения SQL По завершении любой выполнимой команды SQL формируется ее код завершения (SQLCODE), сигнализирующей об успешности ее выпол нения.

В таблице приведены формируемые коды завершения (SQLCODE).

Таблица А.84. Коды завершения SQL в InterBase SQLCODE Описание Сообщение 0 SQLERROR Произошла ошибка. Команда не выпол нена 0 SUCCESS Успешное выполнение +1-99 SQLWARNING Системное предупреждение или инфор мационное сообщение +100 NOT FOUND Нет строк для обработки или достигнут конец текущего активного набора В ISQL при возникновении ошибки выдается ее номер и соответст вующее сообщение.

ПРИЛОЖЕНИЕ Б Сообщения об ошибках Каждое сообщение об ошибке сопровождается соответствующим ко дом SQLCODE, перечень кодов приведен в таблице.

Таблица Б.1. Сообщения об ошибках SQLCODE (сводные) SQLCODE Описание 0 Успешное завершение 1-99 Предупреждение или информационное сообщение 100 Конец файла (списка) 0 Ошибка. Команда не выполнена С одним кодом SQLCODE связано одно или несколько сообщений, сам текст сообщения однозначно идентифицируется внутренним кодом InterBase. В текст сообщения могут также включаться дополнительные данные, указывающие на объекты базы, к которым относится само сооб щение:

string - строка, например имя объекта базы или типа объекта;

long - длинное целое, например идентификационный номер объ екта базы или типа объекта;

digit - целое, например идентификационный номер объекта базы или типа объекта.

Например:

• ошибка с кодом «-84» сопровождается сообщением «Procedure string does not return any values» (код InterBase - 335544668) • ошибка с кодом «-104» сопровождается сообщением «Token un known—line long, char long (код InterBase - 335544634) • ошибка с кодом «-692» сопровождается сообщением «Maximum indexes per table (digit) exceeded» (код InterBase - 335544477).

484 Приложение Б Вставляемые тексты или числовые значения позволяют конкретизи ровать объект, при работе с которым возникла ошибка.

Полный перечень кодов ошибок (SQLCODE), кодов ошибок Inter Base и связанных с ними сообщений приведен в системной документации (Language Reference).

Краткое описание кодов ошибок (SQLCODE) и комментарии к ним приведены в таблице Б.2.

В первом столбце приведен код ошибки (SQLCODE), в последнем перечень связанных с ним внутренних кодов InterBase.


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

Внутренние коды доступны через массив состояния в приложениях с внедренным SQL.

SQLCODE коды доступны и в приложениях с внедренным SQL, и в процедурах и триггерах (см. конструкцию WHEN... DO).

Таблица Б.2 Сообщения об ошибках SQLCODE SQLCODE Комментарий Коды InterBase 335544366L 101 Попытка прочесть в буфер больше данных, чем их есть, может использо ваться для индикации конца данных, например при чтении BLOB.

100 Попытка прочесть данные после их 335544338, 335544354, исчерпания (конец данных) 335544367, -84 Нарушение прав доступа 335544554, 335544555, -103 Неверный тип данных для константы -104 Синтаксическая ошибка в команде 335544343, 335544390, SQL 335544425, 335544426, 335544429, 335544440, 335544456, 335544570, 335544579, 335544590, 335544591, 335544592, 335544634, 335544608, Сообщения об ошибках Комментарий SQLCODE Коды InterBase -150 Ошибка обновления данных 335544360, 335544362, 335544446, -151 Попытка обновить столбец с доступом только на чтение -155 Строка не является именем базовой таблицы для обзора -157 Необходимо указать имя столбца в выражении select для обзора -158 Количество столбцов не соответствует списку в команде select -162 Ключ не доступен для обзора, осно- ванного на нескольких таблицах -170 Ошибка в параметрах процедуры или 335544512, пользовательской функции -171 Синтаксическая ошибка, несогласо- 335544439, 335544458, ванные данные -172 Функция Строка не определена -204 Данные, специфицированные в команде, 335544463, 335544502, не определены в базе (сообщение 335544509, 335544511, может уточняться именем данных) или 335544515, 335544516, неверно указаны 335544532, 335544551, 335544568, 335544573, 335544580, 335544581, 335544588, 335544589, 335544589, 335544595, 335544620, 335544621, 335544622, 335544635, 335544636, 335544640, 335544662, -205 Не определен указанный в команде 335544396, столбец -206 Неверен или не определен столбец 335544578, 335544587, -208 Ошибка в конструкции ORDER BY -219 Таблица строка-имя не определена или неверна 486 Приложение Б Коды InterBase SQLCODE Комментарий Слишком маленький кэш - Кэш переопределен - Таблица строка-имя не указана в - плане Таблица строка-имя встречается 335544638, 335544643, - неоднократно, необходимо задавать 335544659, алиасы Таблица строка-имя встречается в - плане, но нигде не упомянута в запросе -284 Индекс строка-имя не может ис пользоваться в плане Столбец, используемый в первичном - или уникальном ключе (PRIMARY или UNIQUE), должен быть объявлен, как NOT NULL -292 Нельзя обновить ограничение (RDB$REF_CONSTRAINTS) Нельзя обновить ограничение - (RDB$CHECK_CONSTRAINTS) -294 Нельзя удалить CHECK ограничение (RDB$CHECK_CONSTRAINTS) -295 Нельзя обновить ограничение (RDB$RELATION_CONSTRAINTS) -296 Внутренняя проверка - ошибка в RDB$CONSTRAINT_TYPE -297 Команда нарушает ограничение цело- стности (CHECK) для таблицы или обзора строка-имя -313 Несоответствие между количествами элементов в списках столбцов и пере менных -314 Не удается выполнить транслитерацию между символьными наборами (кодо выми таблицами) -401 Неверный оператор сравнения Сообщения об ошибках Комментарий Коды InterBase SQLCODE Недопустимая операция при работе с -402 335544368, 335544414, BLOB Нижний индекс за пределами допус - тимых границ Сегмент уникального ключа (UNIQUE - KEY) - Null 335544334, Ошибка при преобразовании данных - 335544327, -501 Ошибка при работе с дескриптором 335544574, -502 Повторное объявление или открытие курсора -504 Курсор не определен Нет записи для выполнения операции - fetch Курсор не является обновляемым - Неопределенный запрос - Команда PREPARE выполняется над - открытым курсором 335544466, Защита FOREIGN KEY строка или - невозможность выполнить подготовку CREATE DATABASE или SCHEMA Ошибка ввода-вывода при выполнении -532 транзакции -551 Не разрешен доступ строка к стро- ка -552 Недостаточно прав для выполнения 335544550, операции Нельзя изменить права пользователя -553 -595 Текущая позиция разрушена В начале потока обнаружена неверная - операция -597 Длина предшествующего файла не определена, строка должна вклю чать стартовую позицию 488 Приложение Б Коды InterBase SQLCODE Комментарий Номер файла тени (shadow) должен - быть положительным Узел не поддерживается - 335544625, -600 Ошибка при работе с узлом -601 База данных или файл не существуют -604 Ошибка размерности массива 335544593, Некорректная ссылка столбца на себя - -607 335544351, 335544549, Некорректная модификация метадан ных -615 Конфликт блокировки данных 335544475, 335544476, -616 Запрет модификации (удаления) мета- 335544530, 335544539, данных из-за их использования други- 335544540, 335544541, ми объектами базы 335544543, 335544630, -617 Нельзя изменить триггер, переимено- 335544542, вать столбец из-за их использования в других ограничениях логической цело стности -618 Нельзя удалить (изменить) сегмент 335544537, индекса из-за их использования в дру гих ограничениях логической целост ности -625 Ошибка при проверке правильности данных столбца строка, значение "строка" -637 Повторная спецификация строка не поддерживается -660 Ошибка (недопустимая спецификация) 335544533, при создании индекса или внешнего ключа -663 Неверная спецификация индекса 335544624, 335544631, -664 Размер ключа для индекса строка больше допустимого Сообщения об ошибках Комментарий Коды InterBase SQLCODE -677 Ошибка расширения строка -685 Ошибка при работе со строкой или 335544465, 335544670, массивом 335544403, -689 Неверный тип для страницы (возможно с указанием номера) -690 Сегмент недопустим в индексном вы ражении строка -691 Новый размер записи число слиш ком велик -692 Превышено максимальное число ин дексов для таблицы Слишком много параллельных заданий - на выполнение одного и того же запроса -694 Нет доступа к столбцу строка-имя в обзоре строка-имя -802 Исключительная ситуация при ариф- метической операции, переполнения или усечение строкового данного -803 Попытка ввода дублей в уникальный 335544349, ключ, защита уникального или пер вичного ключа строка-имя -804 Несоответствие в количестве аргумен- 335544380, 335544583, тов или несоответствии числа пере- 335544584, менных и числа столбцов -806 В конструкции VIEW WITH CHECK OPTION разрешены только простые имена столбцов -807 Не указана конструкция WHERE для VIEW WITH CHECK OPTION -808 Для VIEW WITH CHECK OPTION можно использовать только одну таб лицу -809 Для VIEW WITH CHECK OPTION нельзя использовать конструкции:

DISTINCT, GROUP или HAVING 18 Введение в InterBase Приложение Б Комментарий Коды InterBase SQLCODE Для VIEW WITH CHECK OPTION - нельзя использовать подзапросы Несколько строк в однострочном - запросе (singleton select) -816 Внешний файл нельзя открыть для вывода данных Попытка выполнить неподдерживае -817 335544361, 335544371, мую операцию (запись в объект только для чтения) -820 Работа с устаревшими версиями 335544356, 335544379, 335544437, -823 Неверный дескриптор закладки -824 Неверный уровень блокировки цифра Неверный дескриптор блокировки -825 -826 Неверный дескриптор оператора -827 Неверный направление в операции поиска -828 Неверная позиция ключа -829 Неверная ссылка на столбец -830 Столбец используется в агрегате -831 Попытка создать второй первичный ключ (PRIMARY KEY) к одной и той же таблице -832 Количества столбцов в FOREIGN KEY и PRIMARY KEY не совпадают -833 Вычисление подобных выражений не поддерживается -834 Диапазон номеров для обновления число не найден -835 Неверная контрольная сумма -836 Исключение цифра -837 Рестарт разделенного менеджера кэша Сообщения об ошибках Коды InterBase SQLCODE Комментарий База данных строка-имя закрывается - через цифра секунд Неверный формат файла журнала - Переполнение файла журнала - Слишком много версий - 335544697, 335544698, Неверно указаны размер или точность - числовых данных 335544699, 335544700, 335544322, 335544326, Ошибка при -901 попытке выполнения 335544326, 335544328, команды 335544329, 335544330, 335544331, 335544332, 335544337, 335544339, 335544340, 335544341, 335544342, 335544345, 335544350, 335544353, 335544355, 335544357, 335544358, 335544363, 335544364, 335544365, 335544369, 335544370, 335544372, 335544376, 335544377, 335544378, 335544382, 335544383, 335544392, 335544407, 335544408, 335544418, 335544419, 335544420, 335544428, 335544431, 335544442, 335544443, 335544450, 335544468, 335544485, 335544510, 335544559, 335544561, 335544562, 335544563, 335544609, 335544610, 335544611,335544613, 335544614, 335544623, 335544626, 335544627, 335544641, 335544656, 335544666, 335544673, 492 Приложение Б Комментарий Коды InterBase SQLCODE 335544333, 335544335, Ошибка при выполнении команды - 335544344, 335544346, (возможно внутренняя ошибка Inter 335544373, 335544384, Base) 335544385, 335544387, 335544388, 335544394, 335544397, 335544398, 335544399, 335544400, 335544401, 335544402, 335544404, 335544405, 335544406, 335544409, 335544410,335544411, 335544412, 335544413, 335544415, 335544416, 335544417, 335544422, 335544423, 335544432, 335544436, 335544448, 335544449, 335544470, 335544471, 335544472, 335544478, 335544479, 335544480, 335544481, 335544483, 335544506, 335544520, 335544528, 335544557, 335544653, 335544654, 335544564, 335544324, 335544375, -904 Ошибка при выполнении запроса 335544381, 335544386, 335544389, 335544391, 335544393, 335544424, 335544430, 335544451, 335544453, 335544455, 335544460, 335544661, 335544676, -906 Продукт строка-имя не лицензирован -909 Команда Drop database выполнена с ошибками -911 Запись в транзакции номер "in limbo" "Deadlock" -913 Сообщения об ошибках Комментарий Коды InterBase SQLCODE Файл строка-имя не является име- - нем базы данных 335544421, 335544461, Ошибка соединения - 335544325, 335544441, Ошибка при подключении - Откат не выполнен - Внутренняя ошибка InterBase - Приложение В Описаниеструктурыбазы данных TESTBASE База TESTBASE.GDB используется для примеров.


Домены Таблица В.1. Перечень доменов Тип данных Ограничения Наименование NOT NULL Integer РгшКеу:

CHAR(2) CHECK (value in ('H', 'Li', 'Na', 'K')) D_ELEM Таблицы Таблица В.2. Структура ТВООК. (Описание книги) Тип (домен) Имя поля Ограниче- Описание ния UniKey PrmKey Первичный автоинкрементный ключ Matherkey Integer Ключ рубрики верхнего уровня BookNm VarChar (250) Наименование книги Referat BLOB Реферат Num_All Smallint Default 0 Количество экземпляров Not Null Описание структуры базы данных TESTBASE Тип (домен) Имя поля Ограниче- Описание ния Default Num_Pres Smallint Кол-во экземпляров в наличии ence Not Null Таблица 8.3. Содержание ТВООК. (Описание книги, Num_ Booknm Num_ Matherkey Unikey all pres ence 1 Программирование 2 Учебники 1 Математика 1 Беллетристика 1 Макрокоманды MS Word 6 1 Word 6 for Windows Язык C++ 8 Введение в C++ Builder 1 Borland - Технологии. SQL-Link InterBase, Paradox for Windows, Delphi 1 11 С и C++ Справочник 1 12 2 Введение в технологию ATM 1 13 3 The history of England. Absolute Monarchy 1 14 Справочник по правописанию и литературной правке 1 3 Тесты. Сборник 11 класс. Вари анты и ответы государственно го тестирования. Пособие для подготовки к тестированию 4 Математические вопросы ди 16 намики вязкой несжимаемой жидкости 496 Приложение В Num_ Num_ Booknm Matherkey Unikey all pres ence Кровь нерожденных 1 17 Тайна 18 Примечание: В ряде примеров, чтобы не загромождать результаты вывода используется версия таблицы без двух последних столбцов.

Таблица В.4. Структура TAUTHOR. (Авторы) Тип (домен) Ограничения Описание Имя Ноля Первичный автоинкремент PrmKey Author ный ключ NOT NULL Имя автора AuName VarChar(60) Примечание Comment VarChar(80) Таблица В.5 Содержание TAUTHOR. (Авторы) AUNAME COMMENT AUTHOR 19 Дашкова Полина 20 Хмелевская Иоанна 21 Ладыжинская Ольга Александровна 22 Бурова И.И.

23 Розенталь Д.Э.

24 без авторов 25 Культин Н.Б.

26 Хаселир Райнер Г.

27 Фаненштих Клаус 28 Подбельский Вадим Валериевич 29 Елманова Н.З.

30 Кошель СП.

Описание структуры базы данных TESTBASE AUNAME AUTHOR COMMENT Дунаев Сергей 32 Луис Дерк Буассо Марк Деманж Мишель Мюнье Жан-Мари Таблица В.6. Структура TPLACE. (Описание места хранения) Ограничения Описание Имя поля Тип (домен) UniKey PrmKey Первичный автоинкремент ный ключ CdPlace VarChar (25) Библиотечный код места TxPlace VarChar (60) Наименование места Таблица В.7. Содержание TPLACE. (Описание места хранения) UNIKEY CDPLACE TXPLACE 41 А-113 Комната 3, стеллаж 5, полка 42 Б-16 Комната 3, стеллаж 2, полка В- 43 Комната 2, стеллаж 8, полка 44 Г-88 Комната 4, стеллаж 1, полка Таблица В.8. Структура TREADER. (Описание читателей) Имя поля Тип (домен) Описание Ограничения UniKey PrmKey Первичный автоинкремент ный ключ RdNumb VarChar (10) № читательского билета RdName VarChar (60) Имя читателя 498 Приложение В Таблица В.9. Содержание TREADER. (Описание читателей) RDNUMB RDNAME UNIKEY 1267-89 Арцибашев С.

37 1369-99 Светлова В.

38 1456-00 Стародуб Е.

Гребенкина Н.

39 1273- 40 1400-00 Пащенко О.

83 Грамотный Н.Е.

1401- Таблица В.10. Структура TBOOK_AUTHOR.. (Описание связи Автор-Книга) Имя поля Тип (домен) Ограничения Описание UniKey PrmKey Первичный автоинкрементный ключ Author PrmKey Ключ для таблицы Автор BookKey PrmKey Ключ для таблицы Книга Bl COMPUTED select Вычисляемое поле. Добавляет BY a.auname имя автора from tauthor a where a.author=tboo k_author.auth or B2 COMPUTED select Вычисляемое поле. Добавляет BY a.booknm название книги from tbook a where a.unikey=tboo k_author.book key Описание структуры базы данных TESTBASE Таблица В.11. Содержание TBOOK_AUTHOR.. (Описание связи Автор Книга) BOOKKEY AUTHOR UNIKEY 59 60 61 62 63 64 65 30 66 67 68 27 69 21 70 24 71 72 22 73 19 74 20 Примечание: В таблице не приведены значения вычисляемых полей.

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

Таблица В.12. Структура TBOOKJPLACE. (Описание связи Книга-Место) Имя поля Тип (домен) Ограничения Описание UniKey PrmKey Первичный автоинкремент ный ключ PlaceKey РгтКеу Ключ для таблицы Мест 500 Приложение В Описание Ограничения Тип (домен) Имя поля Ключ для таблицы Книга РгшКеу ВоокКеу Количество экземпляров Smalllnt Bnumber Таблица В.13. Содержание Описания связи Книга - Место BNUMBER PLACEKEY BOOKKEY UNIKEY 17 45 41 47 42 16 6 48 7 49 50 43 51 43 52 43 11 53 10 54 43 55 44 13 56 44 14 57 44 15 Таблица В.14. Структура TBOOKJtEADER. (Описание связи Книга Читатель) Имя поля Тип (домен) Ограничения Описание UniKey PrmKey Первичный автоинкрементный ключ Reader PrmKey Ключ для таблицы Читателей BookKey PrmKey Ключ для таблицы Книга FirstDate Date Дата выдачи книги Описание структуры базы данных TESTBASE Ограничения Описание Тип (домен) Имя поля Дата продления срока пользо Date NextDate вания Таблица В.15. Содержание TBOOKJtEADER. (Описание связи Книга • Читатель) FIRSTDATE BOOKKEY NEXTDATE UNIKEY READER 05.05.2000 06.07. 75 19.07. 16 19.07. 76 22.07.2000 22.07. 77 36 06.07.2000 06.07. 78 37 15.07.2000 15.07. 79 38 80 12.06.2000 12.07. 05.07.2000 05.07. 81 40 82 28.07.2000 28.07. 40 SQL скрипт создания базы данных Приведенный ниже SQL скрипт создания базы данных включает по мимо описания таблиц, также и описание процедур и триггеров.

В описании внешних функций (DECLARE EXTERNAL FUNCTION) описаны функции из библиотеки MyDll.dll. Текст реализации некоторых из этих функций на C++ приведен в примерах. Если Вы не хотите строить свою библиотеку DLL, исключите описание этих функций из скрипта.

CREATE DATABASE 'D:\Database\Testbase.gdb USER 'SYSDBA1 PASSWORD 'masterkey' PAGE_SIZE 1024;

CREATE DOMAIN D_ELEM AS CHAR(2) CHARACTER SET WIN CHECK (value in ( H, 'Li 1, 'Na', 'K'));

'' CREATE DOMAIN PRMKEY AS INTEGER NOT NULL CONSTRAINT CHECK(value=0);

502 Приложение В CREATE GENERATOR SYSNUMBER;

SET GENERATOR SYSNUMBER TO 0;

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

CREATE EXCEPTION NO_AUTHOR 'He указано имя автора';

CREATE EXCEPTION NO_AUTHORKEY 'He указан или неверно указан автор';

CREATE EXCEPTION NO_BOOKKEY 'He указана или неверно указана книга';

CREATE EXCEPTION NO_BOOKNM 'Не указано наименование книги';

CREATE EXCEPTION NO_PLACE 'He указан шифр места хра нения ' ;

CREATE EXCEPTION NO_PLACEKEY 'He указана или неверно указано место хранения';

CREATE EXCEPTION NO_PLACENM 'He указано наименование места хранения';

CREATE EXCEPTION NO_PRESENCE 'Книги нет в наличии';

CREATE EXCEPTION NO_RDNAME 'Не указано имя читателя';

CREATE EXCEPTION NO_RDNUMB 'He указан № читательского билета';

CREATE EXCEPTION NO_READERKEY 'He указан или неверно указан читатель';

CREATE EXCEPTION NO_RUBRIC 'He указана рубрика для книги';

DECLARE EXTERNAL FUNCTION ASCII_CHAR INTEGER RETURNS CHAR(l) Описание структуры базы данных TESTBASE ENTRY_POINT ' I B _ U D F _ a s c i i _ c h a r ' MODULE_NAME ib_udf';

DECLARE EXTERNAL FUNCTION BLOB_STR BLOB RETURNS CSTRING(255) FREE_IT ENTRY_POINT ' _ b l o b _ s t r ' MODULE_NAME 'MYDLL ;

DECLARE EXTERNAL FUNCTION B_AND SMALLINT, SMALLINT RETURNS SMALLINT ENTRY_POINT '_Sand' MODULE_NAME 'MyDLL.dll ;

DECLARE EXTERNAL FUNCTION B_NOT SMALLINT RETURNS SMALLINT ENTRY_POINT '„Snot1 MODULE_NAME 'MyDLL.dll1;

DECLARE EXTERNAL FUNCTION B_OR SMALLINT, SMALLINT RETURNS SMALLINT ENTRY_POINT '_Sor' MODULE_NAME 'MyDLL.dl1';

DECLARE EXTERNAL FUNCTION CLRBIT SMALLINT, SMALLINT RETURNS SMALLINT ENTRY_POINT '_Sclr' MODULE_NAME 'MyDLL.dll1;

DECLARE EXTERNAL FUNCTION CNVL CSTRING(80), CSTRING(80) RETURNS CSTRING(80) ENTRY_POINT '_f_nvlc' MODULE_NAME 'MyDLL.dll1;

DECLARE EXTERNAL FUNCTION DNVL DOUBLE PRECISION, 504 Приложение В DOUBLE PRECISION RETURNS DOUBLE PRECISION ENTRY_POINT '_f_nvld' MODULE_NAME 'MyDLL.dll ;

DECLARE EXTERNAL FUNCTION FABS DOUBLE PRECISION RETURNS DOUBLE PRECISION ENTRY_POINT '_d_abs' MODULE_NAME 'MyDLL.dl1';

DECLARE EXTERNAL FUNCTION FDAY DATE RETURNS INTEGER BY VALUE ENTRY_POINT '_f_day' MODULE_NAME 'MyDLL.dll';

DECLARE EXTERNAL FUNCTION FMONTH DATE RETURNS INTEGER BY VALUE ENTRY_POINT '_f_month' MODULE_NAME 'MyDLL.dll';

DECLARE EXTERNAL FUNCTION FROUND DOUBLE PRECISION, INTEGER RETURNS DOUBLE PRECISION ENTRY_POINT '_pround' MODULE_NAME 'MyDLL.dll';

DECLARE EXTERNAL FUNCTION FYEAR DATE RETURNS INTEGER BY VALUE ENTRY_POINT '_f_year' MODULE_NAME 'MyDLL.dl1';

DECLARE EXTERNAL FUNCTION IFC DOUBLE PRECISION, VARCHAR(256), VARCHAR(256) RETURNS VARCHAR(256) ENTRY_POINT '_if_C MODULE_NAME 'MyDLL.dll';

DECLARE EXTERNAL FUNCTION IFCD CSTRING(80), CSTRING(80), INTEGER, DOUBLE PRECISION, DOUBLE PRECISION RETURNS DOUBLE PRECISION Описание структуры базы данных TESTBASE ENTRY_POINT '_i fcd' MODULE_NAME 'MyDLL.dl1' ;

DECLARE EXTERNAL FUNCTION IFD DOUBLE PRECISION, DOUBLE PRECISION, DOUBLE PRECISION RETURNS DOUBLE PRECISION ENTRY_POINT '_if_C MODULE_NAME 'MyDLL.dll ;

DECLARE EXTERNAL FUNCTION IFI DOUBLE PRECISION, INTEGER, INTEGER RETURNS INTEGER ENTRY_POINT '_if_C MODULE_NAME 'MyDLL.dll ;

DECLARE EXTERNAL FUNCTION INVL INTEGER, INTEGER RETURNS INTEGER ENTRY_POINT '_f_nvli' MODULE_NAME 'MyDLL.dl1';

DECLARE EXTERNAL FUNCTION RTRIM CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';

DECLARE EXTERNAL FUNCTION RUPPER CSTRING(256) RETURNS CSTRING(256) ENTRY_POINT '_srupper' MODULE_NAME 'MYDLL.dll';

DECLARE EXTERNAL FUNCTION SQRT DOUBLE PRECISION RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT 'IB_UDF_sqrt' MODULE_NAME 'ib_udf';

DECLARE EXTERNAL FUNCTION SUBSTR CSTRING(80), SMALLINT, SMALLINT RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_SUbstr' MODULE_NAME 'ib_udf';

506 Приложение В CREATE TABLE TAUTHOR ( AUTHOR PRMKEY, AUNAME VARCHAR(60) character set WIN1251 collate PXW_CYRL, COMMENT VARCHAR(80) character set WIN1251 collate WIN1251, AUNAMECR VARCHAR{60) character set WIN1251 col late WIN1251);

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);

CREATE TABLE TBOOK_AUTHOR ( UNIKEY PRMKEY, AUTHOR PRMKEY, BOOKKEY PRMKEY, Bl 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)));

CREATE TABLE TBOOK_PLACE ( UNIKEY PRMKEY, PLACEKEY PRMKEY, BOOKKEY PRMKEY, BNUMBER SMALLINT);

CREATE TABLE TBOOK_READER ( UNIKEY PRMKEY, READER PRMKEY, BOOKKEY PRMKEY, FIRSTDATE DATE, NEXTDATE DATE);

CREATE TABLE TPLACE ( UNIKEY PRMKEY, CDPLACE VARCHAR(25) character set WIN1251 collate WIN1251, Описание структуры базы данных TESTBASE TXPLACE VARCHAR(60) character set WIN1251 collate WIN12 51);

CREATE TABLE TREADER ( UNIKEY PRMKEY, RDNUMB VARCHAR(25) character set WIN1251 collate WIN1251, RDNAME VARCHAR(60) character set WIN1251 collate WIN1251);

CREATE VIEW N0RUBRIC1( UNIKEY, BOOKNM) AS select a.UNIKEY, a.BOOKNM from tbook a where a.matherkey0;

CREATE VIEW NORUBRICS( UNIKEY, BOOKNM, Bl) AS select a.UNIKEY, a.BOOKNM, b.Bl from tbook a, tbook_author b where a.matherkey0 and a.unikey=b.bookkey CREATE VIEW RUBRICS( UNIKEY, BOOKNM) AS select UNIKEY, BOOKNM from tbook where (matherkey=O) ALTER TABLE TBOOK ADD CHECK(BOOKNM NOT IN ('Слон1, Моська'));

ALTER TABLE TAUTHOR ADD PRIMARY KEY (AUTHOR);

ALTER TABLE TBOOK ADD PRIMARY KEY (UNIKEY);

ALTER TABLE TBOOK_AUTHOR ADD PRIMARY KEY (UNIKEY);

ALTER TABLE TBOOK_PLACE ADD PRIMARY KEY (UNIKEY);

ALTER TABLE TBOOK_READER ADD PRIMARY KEY (UNIKEY);

ALTER TABLE TPLACE ADD PRIMARY KEY (UNIKEY);

ALTER TABLE TREADER ADD PRIMARY KEY (UNIKEY);

CREATE INDEX TREADER_RDNAME ON TREADER (RDNAME);

CREATE UNIQUE INDEX TREADER_RDNUMB ON TREADER (RDNUMB);

508 Приложение В л SET TERM ;

CREATE PROCEDURE PAUTHOR ( PI CHAR(l), P2 CHAR(l)) RETURNS ( AUTHOR INTEGER, AUNAME VARCHAR(60)) AS begin for select author, auname from tauthor into :author, :auname do if(aunamepl) then if(aunamep2) then suspend;

end л CREATE PROCEDURE PBOOKAUTHOR RETURNS ( UNIKEY INTEGER, MATHERKEY INTEGER, BOOKNM VARCHAR(250), AUTHORS VARCHAR(250), REFERAT BLOB sub_type 0 segment size 80) AS declare variable auname varchar(60);

declare variable ws integer;

begin ws=-l;

for select a.UNIKEY, a.matherkey, a.booknm, a.referat, b.auname from tbook a, tauthor b, tbook_author с where (a.unikey=c.bookkey and c.author=b.author) order by into :UNIKEY, rmatherkey, :booknm, :referat, :auname do begin i f(ws!=UNIKEY) then begin i f(ws!=-1) then suspend;

ws=UNIKEY;

Описание структуры базы данных TESTBASE authors=auname ;

end else authors=authors||', '||auname;

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

end 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=-l;

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 if(ws=-l) then authors=auname;

else authors=authors|j ', '||auname;

ws=UNIKEY;

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

end л л SET TERM ;

л SET TERM ;

CREATE TRIGGER D_TBOOK_READER FOR TBOOK_READER ACTIVE BEFORE DELETE POSITION AS BEGIN update tbook set num_presence=num_presence+l where unikey=old.bookkey;

510 Приложение В END CREATE TRIGGER I_TAUTHOR_1 FOR TAUTHOR ACTIVE BEFORE INSERT POSITION as begin if (new.AUTHOR is NULL) then new.AUTHOR=GEN_ID(sysnumber,1);

if (new.AUNAME is NULL) then exception NO_AUTHOR;

if (new.COMMENT is NULL) then new.COMMENT=" end л CREATE TRIGGER I_TBOOK_1 FOR TBOOK ACTIVE BEFORE INSERT POSITION as begin if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.MATHERKEY is NULL or new.MATHERKEY0) then BEGIN update RDB$EXCEPTIONS SET Rdb$message='He указана рубрика для ' || new.BOOKNM || '' where Rdb$exception_name='NO_RUBRIC';

exception NO_RUBRIC;

END i f (new.MATHERKEY 0) then if (NOT EXISTS (select * from TBOOK where (uni key=new.MATHERKEY))) then exception ERR_RUBRIC;

if (new.BOOKNM is NULL) then exception NO_BOOKNM;

end CREATE TRIGGER I_TBOOK_AUTHOR_1 FOR TBOOK_AUTHOR ACTIVE BEFORE INSERT POSITION as begin if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.AUTHOR is NULL) then exception NO_AUTHORKEY;

Описание структуры базы данных TESTBASE if (new.BOOKKEY is NULL) then exception NOJBOOKKEY;

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 A CREATE TRIGGER I_TBOOK_PLACE_1 FOR TBOOK_PLACE ACTIVE BEFORE INSERT POSITION as begin if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.PLACEKEY is NULL) then exception NO_PLACEKEY;

if (new.BOOKKEY is NULL) then exception NO_BOOKKEY;

if (NOT EXISTS(select * from TPLACE where (UNIKEY=new.PLACEKEY))) then exception NO_PLACEKEY;

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

end л CREATE TRIGGER I_TBOOK_READER_1 FOR TBOOK_READER ACTIVE BEFORE INSERT POSITION as declare variable num smallint;

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

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 where (UNIKEY=new.BOOKKEY))) then exception NO_BOOKKEY;

512 Приложение В select num_presence from TBOOK where (UNIKEY=new.BOOKKEY) into :num;

if(num 1) then exception NO_PRESENCE;

update TBOOK set num_presence=: minu end CREATE TRIGGER I_TPLACE_1 FOR TPLACE ACTIVE BEFORE INSERT POSITION as begin if (new.UNIKEY is NULL) then new.UNIKEY=GEN_ID(sysnumber,1);

if (new.CDPLACE is NULL) then exception NO_PLACE;

if (new.TXPLACE is NULL) then exception NO_PLACENM;

end CREATE TRIGGER I_TREADER_1 FOR TREADER ACTIVE BEFORE INSERT POSITION 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 CREATE TRIGGER NORUBRICS_BU FOR NORUBRICS ACTIVE BEFORE UPDATE POSITION 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 л SET TERM ;

л CREATE ROLE ROLE1;

Дополнительная литература 1. Архангельский А.Я. Язык SQL в Delphi 5.0. - М.: Бином, 2000. - 208 с.

2. Архангельский А.Я. Язык SQL в C++Builder 5. (Серия: Все о C++Builder) - М.: Бином, 2000. - 208 с.

3. Баженова И.Ю. Oracle 8.8i. Уроки программирования. - М.:Диалог МИФИ, 2000. - 304 стр.

4. Бобровский С. Delphi 5 учебный курс. СПб: Питер, 2000. - 640 с.

5. Боуман Д, Эмерсон С, Дарновски М. Практическое руководство по SQL.

- Киев: Диалектика, 1997.

6. Вильям Дж. Пэйдж (мл.). Использование Oracle 8/8i. Специальное изда ние. - Изд. Вильяме, 1999.

7. Грабер М. Введение в SQL. - М : Лори, 1996. - 379 с.

8. Грабер М. Справочное руководство по SQL. - М.: Лори, 1997. - 291 с.

9. Грачев А.Ю. Введение в СУБД. - М: Диалог-МИФИ, 2000. - 272 с.

10. Грин Д. "Oracle8 Server. Энциклопедия пользователя". - Изд. ДиаСофт, 2000.

11. Дейт К. Введение в системы баз данных - 6-е издание. - Изд.Вильямс, 1999. - 848 с.

12. Джексон Г. Проектирование реляционных баз данных для использования с микроЭВМ. - М.: Мир, 1991. - 252 с.

13. Епанешников А. М., Епанешников В. A. Delphi 5. Базы данных. М: Диалог-МИФИ, 2000.

14. Ершов Л.Е., Палютин Е.А. Математическая логика. - М. Наука, 1979. 320 с.

15. Коннолли Т., Бегг К., Страчан А. Базы данных: проектирование, реализа ция и сопровождение. Теория и практика - М: Диалектика, 2000. - 1120 с.

16. Кузнецов С.Д. SQL Язык реляционных баз данных. - Изд. Майор, 2001. 192 с.

17. Ладани Ханс. SQL. Энциклопедия пользователя. - Изд. ДиаСофт, 1998.

18. Маклаков С В. Bpwin и Erwin CASE-средства разработки, информацион ных систем. - М.: Диалог-МИФИ, 1999. - 256 с.

19. Мамаев Е., Вишневский A. Microsoft SQL Server 7 для профессионалов. СПб: Питер, 2000.

514 Дополнительная литература 20. Мартин Д. Организация баз данных в вычислительных системах. - М.:

Мир, 1980. - 662 с.

21. Пушников А.Ю. Введение в системы управления базами данных. Часть 1. Реляционная модель данных: Учебное пособие/Изд-е Башкирского ун та. - Уфа, 1999. - 108 с.

22. Рейнсдорф К., Хендерсон К. Borland C++ Builder. Освой самостоятельно.

- М. : Бином, 1998. -704 с.

23. Тихомиров Ю.В. Microsoft SQL Server 7.0. Разработка приложений. СПб: BHV-1999.-352с.



Pages:     | 1 |   ...   | 8 | 9 || 11 |
 





 
© 2013 www.libed.ru - «Бесплатная библиотека научно-практических конференций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.