Текст
                    ДЖ. ХЕРШ, К. ХЕРШ
ORACLE


НОВЫЕ РЕШЕНИЯ СТАРЫХ ПРОБЛЕМ Возможно, Вы устали от ежедневной рутины, огромных объёмов информации и устаревших технологий. Комплексная автоматизация - это то, что Вам нужно1 LVS поможет Вам: ♦ переоборудовать Ваше предприятие, банк, офис в соответствии с лучшими мировыми стандартами; ♦ максимально повысить прибыль при оптимальных затратах; ♦ внедрить новейшие технологии и получать удовольствие от работы. О качестве работы Корпорации LVS Вы узнаете у наших клиентов: Азовстоль, Внешэкономбанк, АвтоВАЗ, Продинторг, Автоэкспорт, гостиница Космос"^ другие (всего более 60), а имена наших партнеров известны всему миру. Наш адрес: 117806 Москва, Профсоюзная ул. 65 Телефоны: (095)330-16-06, 330-37-33; Фокс: (095)330-36-93 ИНТЕГРИРОВАННЫЕ \ СИСТЕМНЫЕ РЕШЕНИЯ •комплексная автоматизация; •поставка компьютеров и сетевого оборудования; •создание вычислительных сетей; •разработка прикладных информационных систем; •техническая поддержка; •обучение и консуль¬ тирование |
Работа с Oracle версии 6.0 CORPORATION 117800, Рсссийскал Федерация Москза, Профсоюзная ул., 65 Тел.: (035) 320-U-0S; 330-37-33; 330*33-33 Факс: (095) 330*33*03
Working with ORACLE® version 6.0 Jack L.Hursch, P.H.D Carolyn J.Hursch, P.H.D. WINDCREST
ДЖ.ХЕРШ. Н. ХЕРШ РАБОТА ORACLE ВЕРСИИ 60 Перевод с английского В. В. МАРТЫНЮКА МОСКВА 1993
ББК 32.973-91 Х39 УДК 681.325.4 Херш Дж., Херш К. Х39 Работа с Oracle версии 6.0: Пер. с англ. — М.: Мир, 1993. - 464 с., ил. Книга американских специалистов является руководством по програм¬ мированию и построению баз данных реляционного типа, а также управлению их работой средством СУБД Oracle версии 6.0. Рассмотрены потенциальные возможности СУБД Oracle при работе в системе с многими пол ьзовател ям и. Для пользователей системы Oracle. 2404090000-106 041(01)-93 137-93 Федеральная целевая программа книгоиздания России Редакция литературы по информатике ISBN 0-8306-3246-8(Р) (англ.) ISBN 5-03-002516-2 (русск.) © 1989 by Windcrest Books. © перевод на русский язык, Мартынюк В.В., 1993
Об этой книге Эта книга может служить в качестве дополнения к руковод¬ ствам пользователя, поставляемым вместе с версией 6.0 системы управления реляционными базами данных (СУРБД) Oracle. Корпорация Oracle продолжает исследования и разработки, в результате которых появляются дополнительные возможности и новые версии этой системы управления базами данных. Предлагаемый текст основывается на версии 6.0. По возмож¬ ности указываются различия между версией 6.0 и прежними версиями. Во всех главах, кроме гл. 14, предполагается, что читатель не обязательно является программистом, но знаком с общими терминами и понятиями программирования. Некоторые части книги, например гл. 5, 12 и 13, ориентированы преимущест¬ венно на администраторов баз данных, отвечающих за всю работу с базой данных. Пользователь, который ежедневно работает с базой данных, может (после ознакомления с определениями в гл. 1) сразу же перейти к гл. 7 — 10, где он получит практические указания относительно построения таблиц, представлений и индексов и их применения. Ниже приводится краткое содержание всех глав. В главе 1 кратко обсуждаются характеристики реляционной базы данных, а затем определяются термины и соглашения, используемые по всей книге.
6 В главе 2 перечисляются доступные в системе Oracle (версия 6) утилиты, объединяющие СУРБД Oracle с подсистемой обра¬ ботки транзакций TPS. В эту же главу включена таблица, в которой перечислены недавно добавленные особенности, соот¬ ветствующие номерам версий в соответствии с предыдущими версиями. Глава 3 предназначена для пользователя, который переходит от версии 5.0 системы Oracle к версии 6.0. Указываются различия между версией 6 и прежними версиями. В главе 4 обсуждаются структуры, формирующие версию 6 СУРБД Oracle, в том числе файловая структура, логическая структура базы данных, структуры таких объектов базы данных, как таблицы, представления, индексы и структура памяти. Глава 5 предназначена главным образом для администратора бззы данных (АБД). В любой системе с более чем одним пользователем АБД необходим из соображений защиты, а также контроля возникающих операционных проблем. Некоторые из этих проблем могут встречаться сравнительно редко, другие — ежедневно. Реальное управление работой базы распределяется между двумя АБД (SYS и SYSTEM), а на более крупных установках может оказаться достаточно трудно вовлечь двух или более человек, назначенных на пост АБД. В гл. 5 описываются эти обязанности. В главе 6 описывается интерфейс пользователя с Oracle, который осуществляется с помощью структурированного языка запросов SQL (произносится "секуэль"), первоначально разра¬ ботанного фирмой IBM и в настоящее время ставшего составной частью СУРБД Oracle. Это подъязык данных, па котором пользователь осуществляет управление и поддержку СУРБД Oracle. "Дружественный к пользователю" интерфейс на языках SQL и SQL*Plus корпорации Oracle подробно рассматривается в гл. 6. В первой части главы 7 объясняется и иллюстрируется использование операторов описания данных SQL для создания и ликвидации таблиц, представлений и индексов, а также для изменения таблиц с добавлением столбцов или заменой соответствующих типов данных. Примеры в этой и последую¬ щих главах могут служить готовым ссылочным руководством для пользователя без дополнительных знаний о системе. Во второй части гл. 7 объясняются и иллюстрируются операторы манипулирования данными SQL, которые служат для выбора,
7 обновления, удаления и включения записей в таблицах, представлениях и индексах, В главе 8 иллюстрируется применение фраз, функций, выражений и операций языка SQL. В главе 9 показывается, как полные языки SQL, а также SQL*Plus используются для установки и поддержки базы данных. Приводятся подробные примеры. В главе 10 представлены более совершенные методы конст¬ руирования операторов SQL и использования условных фраз для оптимизации общей эффективности системы. Эта глава представляет собой углубленное исследование основных поня¬ тий и адресуется пользователю, который имеет некоторый опыт работы с Oracle и хотел бы улучшить характеристики системы за счет учета преимуществ тонких свойств и менее очевидных особенностей реляционной конструкции СУРБД Oracle. В главе 11 изучаются методы распределения памяти, а также необходимые предварительные меры для обеспечения хранения данных. Преимущественно для администраторов баз данных приводятся подробности относительно возможного расширения основных пространственных спецификаций при увеличении объема базы данных со временем. В главе 12 обсуждается защита информации от несанкцио¬ нированного доступа. Объясняются доступные в СУРБД Oracle средства обеспечения ограниченного доступа к объектам базы данных, когда в этом возникает необходимость, а также средства проверки, пригодные для управления специфическим исполь¬ зованием объектов базы данных. В главе 13 представлены различные виды систем блокировки, реализуемых средствами Oracle, и варианты блокировки в рамках каждой системы. Системы коллективного пользования с интенсивными обращениями к базе данных постоянно сталкиваются с возможностью изменения данных одним процессом в то время, когда их использует другой процесс. Устранение этой проблемы является одной из основных целей систем блокировки. Кроме того, существует проблема длитель¬ ности ожидания пользователем возможности доступа к данным с целью их модификации или обновления. Конечная цель состоит в предотвращении блокировки. В гл. 13 рассматрива¬ ются методы достижения этой цели. В главе 14 иллюстрируется применение процедурного языка программирования PL/SQL, который может использоваться
в вместе с СУРБД Oracle. Приводятся примеры употребления PL/SQL с командами SQL. В главе 15 показано использование другого прикладного пакета SQL*Forms, поставляемого корпорацией Oracle. С по¬ мощью этого пакета можно проектировать формы, рассчитан¬ ные на операторов терминала, которые плохо или совсем не знают базу данных. Этот пакет предназначается для того, чтобы заполнять формы на экране по возможности аналогично тому, как заполняются бумажные формы. Для оператора, пользую¬ щегося функциональными ключами, задача сводится к тому, чтобы только вводить требуемую информацию для каждого поля, как только оно появляется на экране. Пакет SQL*Forms обеспечивает также проверку различных ограничений целостности с помощью триггеров, которые срабатывают в зависимости от точного ввода информации. Триггеры можно спроектировать так, чтобы они автоматически перемещали экран на другие поля в зависимости от введенной информации. Эта возможность позволяет предоставить разра¬ ботчику форм широкие возможности управления формами для удовлетворения конкретных требований любой установки.. Эти формы избавляют от необходимости, чтобы всякий конечный пользователь стал весьма информированным о возможностях системы. Дело в том, что неопытный пользователь может при заполнении форм успешно следовать инструкциям с экрана. В главе 16 описывается пакет SQL*Report, обеспечивающий написание отчетов в системе Oracle. Этот пакет состоит из средств задания формата отчетов RPF и генератора отчетов RPT. В совокупности эти две программы обеспечивают способ получения заказных отчетов, включающих информацию из базы данных. В большой установке, как только реализована возможность получения отчетов, применение пакета SQL*Report позволяет почти полностью автоматизировать заполнение пе¬ риодических отчетов, ориентированных на данные. Глава 17 касается различных типов систем баз данных коллективного пользования. В ней показано, как программное обеспечение Oracle может работать с такими системами, как разделяемый диск, распределенные базы данных и распреде¬ ленные системы обработки. Демонстрируется также применение пакета SQL*NET в подобных системах. Глава 18 посвящена проектированию баз данных — про¬ цедуре, которую следует выполнять до ввода в эксплуатацию
9 системы баз данных. Поскольку реляционная форма в СУРБД Oracle позволяет восстанавливать информацию независимо от способа ввода данных и поэтому новые применения достижимы без перепрограммирования, то следует заранее планировать заказные применения. Для системы, установленной без обшир¬ ного предварительного планирования, или для системы, в которой исходные цели расширены или радикально изменены, перепроектирование может оказаться не только рекомендуемым, но и необходимым для извлечения всех преимуществ из возможностей системы Oracle. В гл. 18 рассматриваются основные понятия, лежащие в основе процедур нормализации, ограничений целостности и функциональных зависимостей. В глоссарии представлены оперативные ссылки на все используемые в книге термины, относящиеся к базам данных вообще и к системе Oracle в частности. При построении этого глоссария авторы старались включить описания любых воз¬ можных терминов, которые могли бы оказаться новыми и/или затруднительными для пользователя. Этот раздел будет особенно полезен для людей, не слишком искушенных в терминологии баз данных. Частые и незамедлительные обращения к глосса¬ рию, по-видимому, быстрее всего обеспечат читателю дости¬ жение комфорта и уверенности в первоначально неизвестном мире баз данных.
1 Реляционная база данных Реляционную базу данных можно определить как базу данных, которая представляется пользователю набором связанных между собой таблиц (и ничем кроме таблиц). Вы можете найти более изощренное определение в книгах [1.1—1.3]. Версия 6 системы Oracle, подобно предыдущим версиям, представляет собой систему управления реляционными базами данных (СУРБД). Она оказалась одной из первых систем баз данных, в которой интерфейс с пользователем осуществляется на структурном языке запросов SQL, и, быть может, по этой причине в настоящее время она является одной из самых распространенных систем баз данных. (SQL в применении к СУРБД Oracle обсуждается в главах 6—8. Дальнейшую инфор¬ мацию о SQL см. в работе [1.4].) Система Oracle рассчитана на прием больших объемов различного типа данных. Поэтому она удобна для крупной фирмы, института или другого учреждения, где необходимо отслеживать и обрабатывать большие объемы информации, относящейся к запасам, поставщикам, персоналу, или другие обширные множества данных. Oracle также работает с меньшими объемами данных. Поэтому, если ваша система пока относительно мала, но, наверное, будет расти, то Oracle очень годится в качестве системы управления базами данных. В отличие от структури¬ рованных систем, где в случае внесения изменений необходимы
11 обширные преобразования, не поддающиеся контролю со стороны пользователя, СУРБД Oracle благодаря своей высокой гибкости позволяет вам выполнять добавления, удаления и модификации, когда для изменений требуется ваше операци¬ онное управление. В последующих главах демонстрируются приемы выполнения таких изменений. Терминология Чтобы максимально расширить круг читателей, использу¬ ющих материал данной книги, и облегчить их работу, мы пользуемся общепринятой терминологией программирования. Когда термин имеет несколько значений, мы заимствуем здесь одно конкретное его значение, а затем постоянно используем его. В тех немногих случаях, когда часто употребляемый термин все еще остается не совсем точно определенным, вместо него выбирается новый термин, определяется, а затем постоянно используется. Определения Мы уже определили реляционную базу данных как базу данных, воспринимаемую пользователем в виде набора связан¬ ных между собой таблиц и ничего кроме них. Термин реляционная относится к способу хранения информации, кото¬ рый не будет здесь поясняться, но обеспечивает большие возможности приспосабливаться к конкретным проблемным ситуациям. Ниже приводятся другие определения. База данных. Она представляет собой набор справочных таблиц и таблиц пользовательских данных, которые восприни¬ маются как одно целое. Система баз данных может состоять из большого количества отдельных баз данных, каждая из которых имеет свое имя. Таблицы. Таблица в реляционной базе данных — это именованная строка заголовков столбцов с одной или более строками значений данных под этими заголовками. Не требу¬ ется, чтобы все ее применения были установлены до ввода данных. Таблицы являются основными компонентами системы реляционных баз данных. Базовые таблицы. Их обычно относят просто к "таблицам". Полное название "базовые таблицы" используется здесь, чтобы
12 отличать их от ’’виртуальных таблиц", которые рассматриваются ниже. Базовая таблица должна иметь имя. Вы должны присвоить ей это имя, когда устанавливаете ее с помощью команды CREATE TABLE (объясняемой в гл. 7). Базовая таблица существует в базе данных сама по себе, независимо от того, будет ли она когда-нибудь использоваться в такой форме для поиска. Базовую таблицу можно изменить или отбросить, в результате чего изменяются или отбрасываются все описанные в ней индексы или представления. Столбцы. Имя столбца присваивается вами (пользовате¬ лем), чтобы обеспечить представление данных, которые будут вводиться под этим именем. Столбцы таблицы в системе реляционных баз данных обладают следующими свойствами: • всякий столбец таблицы обладает в этой таблице уни¬ кальным именем; • столбцы таблицы упорядочиваются слева направо, т. е. столбец 1, столбец 2, ..., столбец n. (С обычной математической точки зрения это утверждение не совсем верно, потому что в реляционной системе столбцы не упорядочены. Однако с точки зрения пользователя, порядок, в котором вводятся имена столбцов, становится тем порядком, в котором вам нужно записывать в эти столбцы значения, если вы не присваиваете столбцам имена всякий раз, когда вводите какую-либо запись.) Строки, Их можно рассматривать как представление запи¬ сей в файле, и мы используем термины "строки" и "записи" в качестве взаимозаменяемых. Строки таблицы в реляционной базе данных обладают следующими свойствами: • строки не упорядочены (если по соглашению пользова¬ телей не производится наложение некоторого порядка на множество строк во время их восстановления, но такой порядок не присущ самой таблице); • всякая строка таблицы содержит только одно значение для каждого столбца этой таблицы; • всем строкам таблицы соответствует одно и то же множество столбцов, хотя в определенных столбцах любая строка может г.одержать нус ьте значения, т. е. может не иметь значении для этих столбцов; • каждая строка эблицы должна быть уникальной, не может быть идентичных стрех.
13 Значения данных. Отдельное значение данных, например, находящееся на пересечении столбца и строки, здесь будет называться элементом данных. Некоторые авторы относят отдельное значение на пересечении строки и столбца к ’’данным'*, как и все множество записей в таблице. Применительно к отдельной записи мы будем употреб¬ лять термин ’’элемент данных" как одиночную форму ’данных". Некоторые авторы текстов о базах данных называют отдель- ное значение "полем", а другие называют полем целый столбец. Мы будем называть каждое отдельное значение элементом данных, а то место в столбце, куда вводится элемент данных, — "полем". Указание "поля" как места нахождения отдельного значения данных особенно важно при работе с программой SQL*Forms, которая рассматривается в гл. 15. Пустые значения. Пустое значение (NULL) -- это отсутст¬ вующий элемент данных. Одно пустое значение не обязательно равно любому другому пустому значению. Для некоторых столбцов в таблице не следует допускать появления пустых значений. Другими словами, во всякой базе данных имеется некая информация, слишком существенная для того, чтобы вставлять пропуск, когда вся строка заполнена. Вы можете предотвратить появление таких пропусков в ваших таблицах, оговаривая "NOT NLJLL", когда создаете существенный столбец. Эта спецификация гарантирует, что при вводе записи в базу данных необходимый элемент данных не будет опущен. Столбцы, содержащие важную информацию, например номера социальной страховки, пропуск которой создал бы значительные помехи для всей операции, следует оговаривать как NOT NULL. С другой стороны, столбец, специфицированный как NOT NULL, не будет допускать запись с пропущенным значением в этом столбце, даже если есть уверенность, что впоследствии пропуск будет заполнен. Поэтому необходимо тщательно взвешенное употребление этой спецификации. (К счастью, существуют способы обойти последнюю проблему; на помощь придет функция пустых значений (NVL), объясняемая в гл. 8.) На протяжении этой книги в различных контекстах имеются многочисленные ссылки на пустые значения, поскольку они могут существенно повлиять на функционирование базы данных как в положительном, так и в отрицательном смыслах. Виртуальные таблицы. Таблица, которая на самогл деле не существует самостоятельно в базе данных, хотя пользователю
14 представляется, что такая таблица существует, называется виртуальной. Например, при ответе на запрос можно получить таблицу, являющуюся только частью базовой таблицы, напри¬ мер список имен и окладов всех сотрудников, которые зарабатывают до 50 000 долл, в год. В явном виде такая таблица в базе данных может не существовать, однако в ней может существовать базовая таблица, в которой представлены все сотрудники, их оклады и много другой информации. Поэтому подходящая команда SQL породит виртуальную таблицу, в которой видны только комбинации имя — оклад до 50 000 долл. Представления. Представление — это виртуальная таблица. Она выглядит как часть данных, которые были восстановлены из одной или нескольких базовых таблиц. Представление является именованной, производной таблицей, "окном" в одну или несколько базовых таблиц. Представления обеспечивают независимость данных. В си¬ стемах коллективного пользования представления позволяют разным пользователям в различных контекстах одновременно видеть одни и те же данные. Побудив пользователей работать только с представлениями, можно обеспечить в базовых таблицах автоматическую сохранность скрытых данных. Для конечных пользователей было бы также быстрее и эффективнее воспользоваться возможностью выявить лишь ту информацию, которая им нужна, а не иметь дело с огромной базовой таблицей, заполненной информацией, которая им не нужна (и которую, быть может, они не видят) всякий раз, когда им нужно работать с базой данных. В большой системе коллективного пользования большинство пользователей будут работать преимущественно с представле¬ ниями, а не с базовыми таблицами. Экземпляр. В системе Oracle экземпляр — это именованный объект, предоставляемый средствами программного обеспече¬ ния для доступа и контроля базы данных в СУРБД Oracle. Он состоит из: • единой разделяемой области памяти, которая называется системной глобальной областью (SGA) и обеспечивает связь между процессами; • не более чем пяти фоновых процессов, разделяемых всеми пользователями. (Эти процессы идентифицируются в гл. 5.)
15 Объекты баз данных. Подобными объектами в рамках вашей системы управления базами данных называются отдель¬ ные базы данных, а также создаваемые вами таблицы, представления, индексы, синонимы, псевдонимы, столбцы и строки. Когда появляется подобный термин, он относится к одному или нескольким таким объектам, причем точный смысл этих объектов выясняется по контексту. Зарезервированные слова. Ими являются ключевые слова, применяемые в Oracle, которые пользователь не может упот¬ реблять в качестве имен таблиц, столбцов или представлений. Если вам придется употребить зарезервированное слово в качестве имени таблицы, столбца или представления, тс вы получите сообщение об ошибке, свидетельствующее о том, что использованное вами слово ’не является правильным именем”. Однако в качестве имени вы можете воспользоваться зарезер¬ вированным словом, если заключите его в двойные кавычки, например "ASSERT*. Текущий список зарезервированных слов содержится в приложении А. Иногда к этому списку новые версии Oracle добавляют новые слова. Поэтому вам следует проверить документацию, полученную вместе с закупленной вами версией, чтобы удостовериться, что не было добавлено никаких новых слов. Список из приложения А верен для версии 6.0. Обозначения По всей книге будут использоваться следующие обозначения: • звездочка (*) для обозначения "все”, она употребляется в обычном для программирования смысле, т. е. ”все случаи, удовлетворяющие определению”; • угловые скобки (< >) для указания, что вы должны заполнить их. Угловые скобки < > заключают общий термин, описывающий конкретный термин, которым вы должны заполнить то место в тексте программы, которое занимают эти скобки. Например, когда вы видите <имя файла>, то это означает, что вы должны подставить имя некоторого файла из вашей базы данных. (Подставляя имя, вы уже не заключаете его в угловые скобки.); • квадратные скобки ([ ]) обозначают, что термин внутри их является необязательным; вы можете решить, вклю¬ чить его или нет. Например:
16 SELECT <объектный список> FROM < предложение> [WHERE <предложение)]; означает, что вы располагаете необязательной возможно¬ стью добавления предложения WHERE к перечисленным командам. (Не заключайте в квадратные скобки включа¬ емый термин, если собираетесь использовать его в операторе языка SQL.); • многоточие (...) обозначает продолжение и означает, что продолжается тот же элемент. Например, столбец 1, столбец 2, ..., столбец N означает, что продолжаются нумерованные столбцы, независимо от того, сколько их, до тех пор, пока не появится последний столбец (N); • всякие буквы используются для команд и функций. Все команды и функции Oracle будут записываться этими буквами. Вам нет необходимости вводить их точно так же, как вы будете их употреблять. Вы можете ввести их в виде прописных букв, строчных букв или в сочетании прописных и строчных букв. Так, вы можете ввести команду SELECT как select, SELECT или Select; • начальные прописные буквы для имен файлов и таблиц, строчные буквы — для имен столбцов и полей. В этой книге имена файлов и таблиц вводятся начальными прописными буквами, а имена столбцов и полей — только строчными буквами, например: таблица Служащие со¬ держит столбцы: имя, адрес, оклад. Иногда в особых случаях это соглашение будет нарушаться. В подобных случаях изменение будет объясняться в тексте. Вы можете пользоваться своими собственными соглашениями отно¬ сительно применения прописных и строчных букв в именах таблиц и столбцов; • наклонная черта (/) обозначает наличие у вас выбора. Наклонная черта (или наклонные черты) в рамках выражения служит для указания, что вам предоставляется выбор из двух или более возможностей. Например, обозначение (ALL/ANY) указывает, что вы можете вы¬ брать один из терминов ALL (все) или ANY (любой); • точка с запятой (;) как завершающий элемент для операторов языка SQL. Опа служит для завершения всех операторов SQL.
17 Заключение В этой главе вводится и кратко обсуждается реляционная база данных. Формулируются определения терминов, исполь¬ зуемых на протяжении книги, устанавливаются терминология и соглашения. Литература 1. Date C.J. An Introduction to Database Systems, Menlo Park, CA, Addison Wesley, 1985. 2. Korth H. F., Silberschatz A. Database System Concepts, New York, McGraw-Hill Book Co., 1986. 3. Maier D. The Theory of Relational Databases, Computer Science Press, 1983. 4. Hursch C. J., Hursch J. L. SQL, The Structured Query Language, Blue Ridge Summit, Pa., TAB BOOKS Inc., 1988.
2 Что такое Oracle? Oracle — это система управления реляционными базами данных (СУРБД), разработанная корпорацией Oracle из Бель¬ монта (шт. Калифорния). Корпорация Oracle выпустила также ряд продуктов, предназначаемых для использования совместно с СУРБД Oracle. Этими продуктами покрывается широкий спектр операционных систем и аппаратного обеспечения. Кроме того, сама СУРБД время от времени пересматривается и представляется в новой версии. Данная книга основывается преимущественно на версии 6.0 СУРБД Oracle, но при всякой возможности в ней указываются различия между версиями 5 и 6. В табл. 2.1 приводится соответствие между наименованиями продуктов в версиях 5 и 6. (Детально версия 5 описывается в книге Hursch J.L., Hursch CJ. Working with Oracle, Tab Books Inc, 1987.) В этой главе рассматриваются продукты корпорации Oracle, которые составляют версию 6. В последующих главах, упоми¬ наемых в этой главе, содержатся указания по использованию таких продуктов. Корпорация Oracle предоставляет обширную документацию для своих продуктов, в том числе руководства для пользователей, оперативный справочный материал и ма¬ териал по установке для различных операционных систем. Начиная с версии 5, имена продуктов Oracle указывают как тип, так и уровень продукта. Множество префиксов описывает уровень (так "Pro" означает, что продукт предназначается для
19 программистов)^ а множество суффиксов специфицирует тип продукта (например, "Forms" для полноэкранных прикладных программ). Описывающие префиксы показаны ниже. В табл. 2-1 приводятся суффиксы имен продуктов, появившиеся в версиях 5 и 6. Таблица 2-1. Соответствие между структурами Oracle версий 5 и 6 Версия 6 Версия 5 Соответствие Файл (файлы) Файл (файлы) По существу идентичны базы данных базы данных Файл (файлы) управления Впервые в версии 6 Файл INIT.ORA Файлы INIT.ORA В основном идентичны, но в версии 6 изменены наименования параметров Файлы регистрации Впервые в версии 6, действий аналогичны AIJ Файлы AIJ Необязательны в версии 5, Избыточны в версии 6 Сегменты спуска Впервые в версии 6, аналогичны файлу прежнего образа из версии 5 Файл прежнего По существу в версии 5, образа избыточен в версии 6 Табличные Аналогичны расчленениям пространства в версии 5 Временные Временные По существу идентичны сегменты таблицы Easy. Означает продукты, которые являются полноэкран¬ ными и управляемыми с помощью меню и направляют работу пользователей, предоставляя им выбор через меню, а также подробные подсказки и информацию в аналоговом режиме. Предназначаются для новых и эпизодических пользователей СУРБД Oracle и для людей, не являющихся специалистами по обработке данных. Более ограниченные средства, чем в SQL.
20 SQL. Означает продукты, которые являются интерактивны¬ ми или управляются командами и поэтому подразумевают больше комфорта и опыта для продуктов на языке SQL и в системе Oracle. Предназначается для пользователей, имеющих некоторый опыт работы с SQL Oracle и с данными. Pro. Означает интерфейсы программирования с СУРБД Oracle. Эти продукты требуют программистских знаний, а также глубокого знания Oracle и поэтому предназначаются для программистов. В табл. 2-2 перечислены ограничения баз данных Oracle версии 6, некоторые из которых зависят от емкости вашего дискового пространства. Таблица 2-2. Ограничения СУРБД Oracle Элемент Ограничения Блоки (Огас1е)/начальный предел 3 блока Символы/столбец CHAR 255 символов Символы/индекс 255 символов Символы/столбец LONG 65535 символов Столбцы / индекс (или индекс кластера) 16 столбцов Столбцы/таблица 254 столбца Столбцы или выражения/список 254 столбца Столбцы/представление 254 столбца Столбцы (ЬОНС)/таблица 1 столбец LONG Размер области контекста 1024 байт Файлы уяравления/база данных Один минимум: два или более весьма рекомендуемых на отдельных устройствах Размер файла управления Различный, но небольшой Минимальный размер файла базы данных Без ограничений, за исключением первого файла, минимальный размер которого составляет 500К байт
21 Таблица 2-2. Продолжение Элемент Ограничения Максимальный размер файла базы данных Файлы базы данных/система Индексы/таблица Экземпляры/система разделения диска Замки/транзакция MAXEXTENTS (максимум экземпляров) Вложенные запросы NUMBER (максимальное значение) Точность Файлы регистрации действий/ /база данных Размер файла регистрации действий Табличное пространство/ /база данных Табл и цы / кл астер Таблицы/база данных Зависит от ОС, обычно 16 млн. блоков Oracle 255 или значение MAXDATAFILES (максимум файлов данных) в CREATE DATABASE (создать базу данных). Ограничение ОС Без ограничений Зависит от ОС. Подчиняется пределу Oracle, составляющему 255 Без ограничений Зависит от ОС 255 запросов 99 9.99...х 10 (или единица со 100 нулями До 39 значащих цифр на числовое значение 255 или значение для LOGJFILES в INIT.ORA или MAXLOGFILES в CREATE DATABASE. Ограничение ОС Минимум 50К байт Без ограничений 32 Без ограничений
22 Для использования версии 6 Oracle вам нужно дисковое пространство для самой программы, ее временных таблиц, ваших собственных таблиц, представлений, запросов и отчетов. Гл. 11 поможет вам определить свои пространственные требования. Материал этой книги ориентирован преимущественно на конечных пользователей и поэтому не охватывает всего диа¬ пазона продуктов Oracle. В данной главе описываются следу¬ ющие программы Oracle и средства, составляющие основу системы Oracle: • СУРБД Oracle; • SQL*DBA (для администратора баз данных) (ODS, IOR, CCF, ODL); • утилита CRT; • экспорт/импорт; • SQL*Loader; • подсистема обработки транзакций (TPS); • замочная программа управления на уровне строк; • PL/SQL; • SQL*Plus; • SQL*Report; • SQL*Forms (IAG, IAP, FSF, CRT, IAD, IAC); • SQL*NET; • SQL*STAR; • SQL*MENU; Кроме того, будут описаны следующие специальные средства Oracle: • ядро Oracle; • контрольный журнал; • словарь данных; • генератор последовательностей; • SGA. СУРБД ORACLE Данная СУРБД состоит из следующих элементов: • SQL*DBA; • CRT; • Export/lmport (EXP/IMP); • SQL*Loader; • ODL.
23 SQL*DBA Утилита SQL*DBA впервые появилась в версии 6.0. Она объединяет многие утилиты АБД из предыдущих версий, в том числе IOR, ODS, AIJ и CCF. Ее можно использовать также для выполнения любого оператора языка SQL, хотя она и не обеспечивает возможностей форматирования из SQL*Plus. SQL*DBA содержит команды для выполнения следующих функций: • создание базы данных; • начало одного или нескольких экземпляров; • установка базы данных (открытие базы данных и ассо¬ циирование с ней экземпляра); • открытие базы данных (обеспечение доступа к базе данных для общего пользования); • включение и отмена архивации; • резервирование и восстановление базы данных; • ввод любой команды языка SQL. SQL*DBA обеспечивает также возможность получения таб¬ личного пространства в автономном режиме и резервирования базы данных на время просчета. SQL*DBA описывается в гл. 5. ODS. В настоящее время система воспроизведения Oracle (ODS) является частью SQL*DBA. ODS управляет способом использования СУРБД. Эта система обеспечивает много раз¬ личных экранных воспроизведений информации о том, какие пользователи активны, какие замки закрыты, много ли работы выполнено в базе данных после последнего резервирования, и другой информации такого рода. AIJ. Последующая регистрация образа (AIJ) в явном виде устарела для версии 6, но ее функции стали теперь частью SQL*DBA. Это программа, служащая для регистрации всех изменений данных с целью обеспечения восстановления в случае отказа диска. IOR. Программа IOR, теперь часть SQL*DBA, используется администратором баз данных для запуска или останова системы Oracle, включая самый первый запуск системы. Первый запуск назывался в прежних версиях Oracle "инициализацией”, но теперь называется "созданием базы данных". Он включает файл INIT.ORA, содержащий системные параметры, которые исполь¬ зуются в начале работы системы баз данных. Список этих параметров приводится в приложении Б.
24 CCF. Создание непрерывного файла (CCF), теперь включено в SQL*DBA. Это утилита, используемая до запуска базы данных для построения файлов базы данных. Утилита CRT CRT — это утилита терминальных описаний. Она служит для описания характеристик изображений на. терминалах применительно к продуктам Oracle, работающим с полноэк¬ ранными изображениями. Поскольку корпорация Oracle обес¬ печивает много различных терминальных описаний, вам потребуется только терминальное описание по умолчанию для вашей операционной системы. (Стандартные файлы терминаль¬ ных описаний включают IBM3270.CRT для терминала 3270, VT220.CRT для терминала VT220 и D410.CRT для терминала D410.) Утилита CRT понадобится вам, если вы захотите создать новые терминальные описания или изменить существующие. С помощью CRT вы можете согласовать программные функции с терминальными ключами для этих функций, описать такие характеристики дисплея на электронно-лучевой трубке, как подчеркивание и негативное видеоизображение, и приспособить экранные изображения для различных полноэкранных програм¬ мных продуктов Oracle, например для SQL*Forms. Утилита CRT объясняется в руководстве пользователя по утилитам системы Oracle. Export/Import Export/Import — это пользовательская утилита для резерви¬ рования и восстановления архивной информации. Она описы¬ вается в гл. 5. SQL*Loader Загрузчик данных Oracle (ODL) более не будет поддержи¬ ваться после версии 6. Он будет заменен на SQL*Loader. В настоящее время ODL включается как часть СУРБД только для совместимости с прежними версиями Oracle. ODL вводит "сырые” данные из операционных файлов в таблицы, сущест¬ вующие в базе данных Oracle. SQL*Loader является новой пользовательской утилитой в версии 6 и будет загружать данные в таблицы Oracle из стандартных файлов операционной системы.
25 Подсистема обработки транзакций (TPS) Данная подсистема является опцией, впервые появившейся в версии 6. Это высокопроизводительная устойчивая относи¬ тельно сбоев система, предназначенная для оперативной обра¬ ботки транзакций и применения больших баз данных. Она предоставляет две возможности высокого уровня: 1) управление замком на уровне строк, рассматриваемое в гл. 13 наряду с другими замочными средствами, и 2) PL/SQL (см. гл. 14). PL/SQL — это новый язык программирования, позволяющий сочетать способность манипулирования данными, как в языке SQL, со способностью их обработки, как в процедурном языке. Язык SQL расширяется добавлением таких процедурных средств, как циклы и ветвления. Процедуры PL/SQL можно выполнять в различных средах, в том числе SQL*Plus, Proxprecompilers и SQL*Fors. SQL*Plus SQL*Plus — это улучшенная версия дружественного к пользователю интерфейса (UFI), который он заменяет в версии 5. Речь идет о процедурном интерактивном интерфейсе с Oracle, включая улучшенное формирование отчетов. Данный компонент программного обеспечения возбуждается при поступлении команды SQLPLUS. SQL*Plus описывается в гл. 6 и часто упоминается по всей книге. SQL*Report SQL*Report состоит из двух программ: форматера текстов отчетов (RPF) и генератора отчетов (RPT). Это весьма мощный текстовый процессор. Он будет выдавать форматированные отчеты, которые содержат данные, восстановленные из базы данных. Подробнее о нем см. в гл. 16. SQL*Forms SQL*Forms — это интерактивное средство, используемое для создания, изображения и редактирования форм. Оно предназ¬ начено для облегчения процесса приспособления форм к нуждам заказчика и упрощения их использования. Это средство
26 описывается в гл. 15. SQL*Forms состоит из следующих описывающихся ниже компонентов: IAG, IAP, FSF, CRT, IAD и IAC Генератор интерактивных приложений (IAG) Данный генератор читает входной (INP) файл и формирует файл форм (FRM). IAG выполняется после преобразователя интерактивных приложений (IAC), когда управление возвращается к основному меню посредством функции "создание формы" или "модификация формы". Процессор интерактивных приложений (IAP) Данный процессор, являющийся компонентом из SQL*Forms, читает форму из файла FRM и запускает ее. Он выполняется по варианту "Run" (счет) из основного меню SQL*Forms. Компонент FSF Он создает файл INP для формы по умолчанию в SQL*Forms. Операция выполняется частью "форма по умолчанию" варианта "создание формы". Утилита CRT Она была кратко описана выше как часть утилиты SQL*DBA. Ниже объясняется ее роль в SQL*Forms. SQL*Forms и некоторые другие программы Oracle могут работать со многими различными типами устройств изобра¬ жения. Эта независимость от устройств достигается за счет использования файла CRT, который доводит до программы информацию о том, какие команды будут побуждать дисплейные устройства определенного типа выполнять различные функции. Для создания файла CRT служит утилита CRT системы Oracle, которая читает информацию об указанном типе устройства из группы таблиц базы данных Oracle. Эти таблицы хранятся в базе данных под пользовательским именем, которое расходится с главной системой. О том, где они хранятся в вашей системе, вы узнаете из руководства по установке и использованию Oracle. Проектировщик интерактивных приложений (IAD) Этот проектировщик создает или изменяет форму в базе данных. Он выполняется по варианту "модификация формы" из основного меню SQL*Forms и по входу "заказная форма" из варианта "создание формы".
27 Преобразователь интерактивных приложений (IAC) Данный преобразователь загружает существующие формы в словарь описаний форм, так чтобы проектировщик IAD смог изменить формы, и создает файл INP для форм с целью ввода в IAG. IAC выполняется из SQL*Forms, когда управление возвращается основному меню по функции ’’создание формы" или "модификация формы". SQL*NET SQL*NET — это программа, которая позволяет админист¬ ратору базы данных связывать экземпляры между собой или связывать их с другими базами данных в узлах сети. SQL*Menu SQL*Menu — это программа, предоставляющая вам возмож¬ ность создавать и эксплуатировать меню для прикладных программ. Вы можете использовать SQL* Menu вместе с программными продуктами корпорации Oracle и с большин¬ ством других программ, которые будут выполняться на вашей операционной системе. Она позволяет создавать древовидное меню, с помощью которого можно выполнять большинство задач обработки данных. Подробно эта программа объясняется в руководстве пользователя пакета SQL*Menu. Ядро Oracle Код программы для СУРБД Oracle называется ядром. Ядро оперирует размещением и описанием данных, доступом к управляющим данным и их совместным использованием, обеспечивает резервирование и восстановление данных, интер¬ претирует SQL и PL/SQL. Кроме того, ядро содержит оптими¬ затор, который рассматривает запрос и принимает решение об оптимальном пути доступа к данным, необходимым для ответа на этот запрос. AUDIT_TRAIL Это средство ревизии впервые появилось в Oracle версии 5 и было развито в версии 6. Оно предназначается в первую очередь для целей защиты. При возможности это средство
28 позволяет контролировать деятельность пользователя в базе данных. (По умолчанию такой контроль запрещен.) Оно дает администратору базы данных возможность усиливать и конт¬ ролировать защиту системы. Кроме того, оно позволяет остальным пользователям проверять успешные или неудачные попытки доступа к их собственным таблицам или представлениям. Некоторые варианты доступны как администратору базы данных, так и другим пользователям и относятся к тому, какие именно действия подвергаются ревизии. Обычно результаты ревизии записываются в таблицу AUDIT_TRAIL, находящуюся в словаре базы данных. Подробности о средстве ревизии содержатся в гл. 12. Словарь базы данных Словарь базы данных — это таблица, которая подобно любой другой таблице в базе данных состоит из строк и столбцов. Она содержит таблицы, автоматически создаваемые системой Oracle во время установки, а также все таблицы и представления, созданные пользователями во время работы системы. Когда бы вы ни создавали таблицу, при ее описании словарь данных автоматически обновляется системой Oracle. Таблицы, созданные Oracle в словаре данных, могут изме¬ няться от одной версии Oracle к другой. Поэтому, чтобы найти описания таблиц для используемой вами версии, вам следует обратиться за справками в реальный словарь' базы данных вашей установки. Команда просмотра ваших собственных таблиц (т. е. всех тех, которые созданы вами или к которым вам был предоставлен доступ) имеет вид SELECT * FROM TAB; Фактически она приведет к изображению словарного пред¬ ставления имен, типов таблиц и представлений, созданных вами. Команда просмотра таблиц, доступных всем пользовате¬ лям на вашей установке, имеет вид SELECT * FROM DTAB; Изображенные ’’таблицы" на самом деле будут представле¬ ниями из таблицы DTAB. Сама полная таблица находится в файле CATALOG.ORA, который был создан при реализации системы Oracle на вашей вычислительной установке с помощью
29 программы SQL*Plus. Чтобы просмотреть любое из словарных представлений, перечисленных в табл. 2-3, используйте имя желаемого представления в команде SELECT. Базовые таблицы в словаре данных создаются системой СУРБД автоматически и принадлежат администратору базы данных (АБД), называемому SYS. (Пользователь АБД SYS описывается в гл. 5.) К этим таблицам имеют доступ лишь администраторы баз данных. Те представления в словаре базы данных, которые принад¬ лежат пользователю АБД, называемому SYSTEM, обычно создаются на каждой вычислительной установке с помощью SQL*Plus для работы с файлом CATALOG.ORA. (См. описание пользователя АБД SYSTEM в гл. 5.) Таблицы словаря данных автоматически обновляются сис темой Oracle. Нет необходимости, чтобы Oracle обновляла представления, потому что они всегда будут показывать самые "свежие" данные в таблице, на которой базируются. Пользователь, не являющийся АБД, почти никогда не должен изменять таблиц, созданных системой Oracle. Это означает, что вам не следует применять команды DROP, ALTER, DELETE, INSERT или UPDATE к каким-либо данным в этих таблицах. Имеются следующие исключения: 1. Добавление новых словарных таблиц или представлений. Для сохранения целостности системы администратор базы данных SYSTEM должен быть владельцем этих новых эле¬ ментов или должен появиться третий АБД, который владел бы ими. 2. Удаление из SYS.AUDITJTRAIL. Если была допущена ревизия и прослеживается ряд вариантов ревизии, эта таблица может очень быстро вырасти. Поэтому могло бы оказаться удобным периодически удалять из этой таблицы данные о прежних ревизиях. Однако никогда не следует изменять или сбрасывать файл SYSAUDIT__TRAIL. Генератор последовательностей Если вы администратор базы данных или обладаете приви¬ легированным доступом к ресурсам, то можете воспользоваться генератором последовательностей для создания последователь¬ ности чисел для строк в таблицах, чтобы автоматически генерировать уникальные первичные ключи для ваших данных
30 или координировать ключи по многим строкам или таблицам. Вы можете генерировать последовательные целые числа длиной до 28 цифр. Вам предоставляется также возможность исполь¬ зовать многие другие варианты. Например, для установки минимального и максимального значений в последовательности определите интервал между значениями и укажите, будут ли числа возрастать, убывать или повторяться. Система Oracle оперирует последовательностями аналогично тому, как она оперирует таблицами. В качестве владельца последовательности вы можете гарантировать другим пользо¬ вателям привилегии употребления команд ALTER или SELECT для последовательностей и при желании специфицировать вариант WITH GRANT (описания этих привилегий см. в гл. 12). Синтаксис создания последовательности имеет вид: CREATE SEQENCE <имя последовательности> [INCREMENT BY целое] [START WITH целое] [MAXVALUE целое/NOMAXVALUE] [MINVALUE целое/NOMINVALUE] [CYCLE/NOCYCLE] [CACHE целое/NOCACHE] [ORDER/NOORDER] Заметим, что все синтаксические предложения для создания последовательности являются необязательными. Дальнейшую информацию о генераторе последовательностей вы найдете в руководстве администратора базы данных по СУРБД Oracle. Системная общая область (SGA) Каждому экземпляру соответствует одна и только одна системная общая область (SGA), которая отводится при образовании экземпляра и отменяется при его ликвидации. SGA содержит информацию, которая должна распространяться между процессами (например, замковую информацию), буферы баз данных и словарную информацию, которая хранится в словарных кешах. Размер SGA определяется набором переменных параметров в файле INIT.ORA. SGA заполняется только кодом СУРБД, но не кодом пользователя. Более подробно о SGA см. в гл. 4.
31 Заключение В этой главе перечислены и описаны компоненты СУРБД Oracle. Это SQL*DBA, утилита CRT, Export/Import, SQL*Loader и ODL. Описаны и другие продукты корпорации Oracle, которые употребляются с СУРБД. Это система обработки транзакций (TPS), SQL*Plus, SQL*Report, SQL*Forms, SQL*Net и SQL*Menu. Объясняются следующие специальные средства СУРБД Oracle: ядро Oracle, средство ревизии, словарь данных, генератор последовательностей и SGA.
3 Изменения в версии 6 по сравнению с версией 5 Перевод вашей базы данных с версии 5 Oracle на версию 6 обеспечит вам улучшение функциональных возможностей и производительности. Однако, поскольку архитектуры этих двух систем значительно разнятся между собой, то, по-видимому, наилучший подход состоит в постепенном переводе на более высокую ступень только после того, как вы полностью осознаете многие различия. В этой главе перечисляются принципиальные различия между двумя версиями Oracle и указывается, где в книге появляется объяснение каждого различия. Здесь не включена специфическая информация об отдельных операционных сис¬ темах. Относительно изменений, влияющих на вашу операци¬ онную систему, см. руководство Installation and User's Guide. поставляемое корпорацией Oracle вместе с программным обеспечением. Новая документация Корпорация Oracle выпустила новую документацию об установке и обслуживании версии 6. Вам следует иметь хотя бы следующие публикации:
33 • ORACLE Database Administrator9 s Guide, ORACLE Part № 3601-V6.0; • SQL Language Reference Manual, ORACLE Part № 778-V6.0; • PL/SQL User's Guide and Reference, ORACLE Part № 800-V6.0; • ORACLE Utilities User's Guide, ORACLE Part № 3606-V6.0; • ORACLE Error Messages and Codes Guide, ORACLE Part № 3605-V6.0; • SQL*Loader User's Guide, ORACLE Part № 3606-V1.0; • The Installation and User's Guide для вашей операционной системы. Утилита SQL*DBA В соответствии с тем фактом, что в Oracle версии 6 значительно возросла роль администратора базы данных (АБД), теперь СУРБД включает утилиту, называемую SQL*DBA. Эта новая утилита сочетает многие средства для АБД из версии 5, в частности IOR, ODS, AIJ и CCF. Подробно SQL*DBA рассматривается в гл. 5. Основные возможности SQL*DBA позволяют вам выполнить следующие операции: • создать базу данных; • запустить один или несколько экземпляров; • смонтировать базу данных (открыть базу данных и связать с ней некоторый экземпляр); • открыть базу данных (сделать ее доступной для общего пользования); • вводить и отменять архивизацию; • резервировать и восстанавливать базу данных; • устанавливать характерное использование базы данных; • вводить любую команду языка SQL; • автономно выбирать места для таблиц; • резервировать базу данных на время ее работы. Изменения в языке SQL В список зарезервированных слов SQL были добавлены новдяе слова, и поэтому их нельзя использовать в качестве имен таких объектов базы данных, как таблицы, представления, синонимы или столбцы. Полный список зарезервированных слов Oracle приводится в приложении А. В версии 6 добавлены следующие новые слова:
34 ARCHIVELOG CHECK CLOSE DISMOUNT INITRANS LINK MAXTRANS MINEXTENTS MOUNT NEXT NOARCHIVELOG PCTINCREASE ROLLBACK SAVEPOINT SEGMENT Oracle версии 6 содержит некоторые новые команды SQL. Полный список всех команд SQL представлен в гл. 6. Некоторые из этих команд: ALTER CLUSTER ALTER DATABASE ALTER INDEX ALTER ROLLBACK SEGMENT ALTER SEQUENCE ALTER TABLESPACE ALTER USER COMMIT CREATE DATABASE CREATE ROLLBACK SEGMENT CREATE SEQUENCE CREATE TABLESPACE DROP ROLLBACK SEGMENT DROP SEQUENCE DROP TABLESPACE ROLLBACK SAVEPOINT SET TRANSACTION READ ONLY В гл. 6 вы найдете также синтаксис и информацию о способах использования этих новых команд. В версии 6 были модифици¬ рованы следующие существовавшие ранее команды языка SQL: ALTER TABLE (новые параметры памяти) AUDIT (может ревизовать последовательности) CREATE CLUSTER (не создает автоматически индекс кластера) CREATE INDEX (служит также для создания индекса кластера) CREATE TABLE (новые параметры памяти) GRANT (новая привилегия: REFERENCE, новая форма: SEQENCES) LOCK TABLE (новые варианты замка) REVOKE (аналогична GRANT) VALIDATE INDEX (удалено предложение ON имя таблицы) Полное объяснение этих модифицированных команд при¬ водится в гл. 6. Некоторые команды языка SQL, ранее используемые в версии 5, более не поддерживаются в версии 6. Дело в том, что PARTITIONS теперь заменяется на TABLESPACE, a SPACES —
35 на команду STORAGE. В версии 6 более не поддерживаются следующие команды языка SQL: ALTER PARTITION CREATE SPACE ALTER SPACE DROP SPACE CREATE PARTITION К SQL в версии 6 Oracle были добавлены две функции NLSORT REPLACE Полностью эти новые функции объясняются в гл. 14. Новые или модифицированные структуры баз данных Все структуры из СУРБД Oracle рассматриваются в гл. 4. Ниже отмечены те структуры, которые модифицированы, добавлены или устарели, а также те, для которых варианты или хранение изменились в версии 6. Таблицы Были внесены изменения в формат блоков данных и строк. Подробности этих изменений приводятся в гл. 11. Там же указаны добавленные новые параметры хранения и транзакций (PCTUSED, INITRANS и MAXTRANS). Появилась синтаксическая поддержка ссылочной целостно¬ сти. Введены новые предложения, в частности: DEFAULT PRIMARY KEY NULL FOREIGN KEY...REFERENCES UNIQUE CHECK Индексы В версии 5 все индексы для одной таблицы хранятся в одном и том же индексном сегменте, а в версии 6 индексы хранятся по одному на сегмент. Кроме того, теперь вы можете с помощью команды CREATE INDEX направлять индекс на другое табличное пространство относительно табличного про¬ странства, содержащего таблицу, на которой создан этот индекс. Кластеры Более не существует требования, чтобы ключи кластеров обязательно содержали один непустой столбец. Вы должны создавать индексы кластеров вручную, используя команду CREATE INDEX.
36 Табличные пространства Табличное пространство содержит такие объекты базы данных, как таблицы и представления. Это наименьшая единица восстановления целостности базы данных. Табличное простран- ство в версии 6 аналогично ’’подразделению” в версии 5. В некотором смысле сопутствующие табличным пространствам параметры хранения заменяют описания пространства из версии 5. Дальнейшие подробности о табличных пространствах приводятся в гл. 11. Параметры обратной прокрутки Сегменты обратной прокрутки служат для считывания согласованности, обратной прокрутки транзакций и восстанов¬ ления целостности базы данных. Они объясняются в гл. 4. Временные сегменты Временные сегменты в версии 6 эквивалентны временным таблицам в Еерсии 5. Хранение Необязательные параметры, относящиеся к ограничениям и характеристикам хранения, называются теперь параметрами хранения. Они ассоциируются с табличными пространствами, с таблицами, кластерами и индексами. Полное описание предложения STORAGE приводится в гл. 11. Помимо пара¬ метров хранения из версии 5, версия 6 содержит следующие новые параметры: INITIAL PCTUSED MINEXTENTS PCTINCREASE NEXT Теперь разрешается PCTFREE с 0. Пустые столбцы требуют хранения, если они встраиваются между двумя непустыми столбцами. Пустые столбцы, которые попадают в конец строки, не требуют памяти. В версии 6 не отводится какого-либо места для представ¬ лений. (В версии 5 каждое представление требует три блока.) ROWID В версии 6 ROWID требует такой же формат, как и в версии 5, но имеет другое значение. Объяснение ROWID вы найдете в гл. 4.
37 Новые или модифицированные файлы баз. данных Версия 6 содержит некоторые новые файлы баз данных, а также некоторые файлы баз данных, которые были модифи¬ цированы и/или заменены файлами с другими именами. Файлы баз данных Файлы баз данных в версии 6 аналогичны таким файлам в версии 5.1 в том отношении, что база данных должна содержать хотя бы один файл базы данных. Однако в версии 5.1 файл базы данных был добавлен к подразделению SYSTEM, а в версии 6 — к табличному пространству SYSTEM. Файл базы данных должен быть назван в операторе CREATE DATABASE. Вы можете специфицировать множественные фай¬ лы баз данных. Файлы регистрации действий Файлы регистрации действий вместе с сегментами обратной прокрутки заменяют файл предварительного образа из версии 5.1. Регистрация действий заменяет файл последующего образа из версии 5.1. Два файла регистрации действий являются обязательными, и им соответствует функция, аналогичная функции файлов журнала последующего образа (AiJ) из версии 5.1. У вас может возникнуть желание иметь более чем два файла регистрации действий. Вам следует специфицировать файлы регистрации действий в операторе CREATE DATABASE. Файлы INIT.ORA Несмотря на добавление или модификацию нескольких параметров, файл INIT.ORA в версии 6 выполняет почти такую же функцию, как и в версии 5.1. Однако файл INIT.ORA в версии 6 не идентифицирует какие-либо файлы, требующиеся базе данных для работы. Вместо этого он содержит информацию, используемую для запуска экземпляра. Файлы управления Не существует файлов управления, аналогичных файлам Управления из версии 5.1. В версии 6 файлы управления — это небольшие обязательные файлы, которые автоматически создаются и поддерживаются системой СУРБД Oracle. Они идентифицируют и проверяют базу данных, записывая во время ее использования определенную информацию. Чтобы база
38 данных начала работать, необходимо, чтобы был успешно прочитан один файл управления. Контроль над транзакциями Для усиления вашего контроля над своими транзакциями к SQL Oracle были добавлены следующие команды: SAVEPOINT COMMIT ROLLBACK SET TRANSACTION READ ONLY Теперь неявные обратные прокрутки проявляются в обратной прокрутке на уровне операторов, а не на уровне транзакций. Команда SET TRANSACTION READ ONLY была добавлена, чтобы обеспечить согласованный ввод для нескольких опера¬ торов. Использование этой команды иллюстрируется в гл. 13 и 14. Новые варианты замка Подсистема обработки транзакций из версии 6 поддерживает работу с замками на уровне строк в варианте по умолчанию. Работа с замками обсуждается в гл. 13. Новый алгоритм шифрования паролей В соответствии с новым алгоритмом шифрования паролей из версии 6 всем пользователям должен быть заново передан доступ к базе данных, когда вы переходите от прежней версии Oracle к версии 6. Генерация последовательностей Новая команда CREATE SEQUENCE обеспечивает возмож¬ ность автоматической генерации последовательности возраста¬ ющих или убывающих целых чисел. Она объясняется в гл. 2. Коды сообщений об ошибках В версии 6 имеется много новых сообщений об ошибках, а некоторые устаревшие сообщения об ошибках исключены. Необходимо проверить программы с жесткой диагностикой конкретных номеров ошибок, чтобы удостовериться, что номера ошибок не были изменены.
39 ODL исчезнет SQL*Loader придет на смену загрузчику данных Oracle zqDL). SQL*Loader включает все средства ODL и обеспечивает новые функциональные возможности. После версии 6 прекра¬ тится поддержка ODL. Загрузчик SQL*Loader кратко описывается в гл. 2, а более детально представлен в фирменной документации корпорации Oracle под названием SQL*Loader User's Guide. Словарь данных Словарь данных из версии 5.1 был заменен более представи¬ тельным множеством представлений словаря данных. Для восхо¬ дящей совместимости файл словаря данных CATALOG5.SQL может использоваться для ввода словаря данных версии 5.1 в бюджет системы для версии 6. В табл. 3-1 показаны представ¬ ления в словаре данных версии 6. Таблица 3-1. Представления словаря данных Представление Описание ACCESSIBLE-COLUMNS ACCESSIBLE-TABLES ALL.CATALOG ALL.COL-COMMENTS ALL-COL-GRANTS Столбцы всех таблиц, представлений и кластеров Таблицы, представления, синонимы, последовательности, доступные пользователю Таблицы, представления, синонимы, последовательности, доступные пользователю Комментарии к столбцам доступных таблиц и представлений Доверительные передачи для столбцов, относительно которых пользователь является доверителем, получателем или владельцем, или же разрешено общее пользование
40 Описание Таблица 3-1. Продолжение Представление ALL_COL_GRANTS_MADE ALL_COL_GRANTS_RECD ALLJDBJLINKS ALL_DEF_AUDIT_OPTS ALL_INDEXS ALL_IND_COLUMNS ALL_OBJECTS ALL-SEQUENCES ALL-SEQUENCES ALL-SYNONYMS ALL-TABLES ALL-TAB-AUDIT-OPTS ALL_TAB_AUDIT-OPTS Доверительные передачи для столбцов, для которых пользователь является владельцем или доверителем Доверительные передачи для столбцов, относительно которых пользователь является получателем или же разрешено общее пользование Доступные пользователю связи базы данных Варианты ревизии для доступных таблиц и представлений Описания индексов для таблиц, доступных пользователю Столбцы, содержащие индексы для доступных таблиц Объекты, доступные пользователю Описание последовательностей, доступных пользователю Описание собственных последовательностей пользователя Все синонимы, доступные пользователю Описание таблиц, доступных пользователю Варианты ревизии для доступных таблиц и представлений Варианты ревизии для собственных таблиц и представлений пользователя
41 Таблица 3-1. Продолжение Описание Лредставление all_tab_columns all_tab_comments all_tab_grants ALL_TAB_GRANTS_MADE ALL_TAB_GRANTS_RECD ALL_USERS ALL_VIEWS COLUMN-PRIVILEGES dba_catalog dba_clusters Столбцы всех таблиц, представлений и кластеров Комментарии к таблицам и представлениям, доступным пользователю Доверительные передачи объектов, для которых пользователь является доверителем, получателем или владельцем или разрешено общее пользование Доверительные передачи от пользователя и доверительные передачи для объектов пользователя Доверительные передачи для объектов, относительно которых пользователь является получателем или разрешено общее пользование Информация о всех пользователях базы данных Текст о представлениях, доступных пользователю Доверительные передачи для столбцов, относительно которых пользователь является доверителем, получателем или владельцем или разрешено коллективное пользование Все таблицы, представления, синонимы и последовательности для базы данных Описание всех кластеров в базе данных
42 Описание Таблица 3-1. Продолжение Представление DBA_CLU_COLUMNS DBA_COL_COMMENTS DBA_COL_GRANTS DBA_CROSS_REFS DBA_DATA_FILES DBAJDBJLINKS DBA_EXP_FILES DBA_EXP_OBJECTS DBA_EXP_VERSION DBAJEXTENTS DBA_FREE_SPACE DBA-INDEXES DBA_IND_COLUMNS DBAJDBJECTS DBA_ROLLBACK_SEGS DBA__SEGMENTS DBA_SEQUENCES Отображение столбцов таблицы на столбцы кластера Комментарии для столбцов из всех таблиц и представлений Все передачи для столбцов из базы данных Перекрестные ссылки для всех представлений, синонимов и ограничений Все связи в базе данных Описание файлов экспорта Объекты, которые экспортировались приращениями Номер версии для последнего сеанса экспорта Экстенты, включающие все сегменты из базы данных Свободные экстенты во всех табличных пространствах Описание всех индексов в базе данных Столбцы, включающие индексы для всех таблиц и кластеров Все объекты в базе данных Описание сегментов обратной прокрутки Память, отведенная для всех сегментов в базе данных Описание всех последовательностей в базе данных
43 Таблица 3-1. Продолжение Представление Описание dba.synonyms DBA_SYS_AUDIT_OPTS Все синонимы в базе данных Описание вариантов ревизии системы dba_tables Описание всех таблиц в базе данных dba_tablespaces Описание всех табличных пространств DBA_TAB_AUDIT_OPTS Варианты ревизии для всех таблиц и представлений DBA_TAB_COLUMNS Столбцы из всех таблиц, представлений и кластеров DBA_TAB_COMMENTS Комментарии для всех таблиц и представлений в базе данных DBA_TAB_GRANTS Все доверительные передачи для объектов в базе данных DBA_TS_QUOTAS Квоты табличного пространства для всех пользователей DBA_USERS Информация о всех пользователях базы данных dba_views Текст всех представлений в базе данных dictionary Описание таблиц и представлений словаря данных dict_columns Описание столбцов в таблицах и представлениях словаря данных TABLE_PRIVILEGES Доверительные передачи для объектов, применительно к которым пользователь является доверителем, получателем или владельцем или же разрешено общее пользование
44 Описание Таблица 3-1. Продолжение Представление USER_CATALOG USER-CLUSTER USER-CLU-COLUMNS USER-COL-COMMENTS USER-COL-GRANTS USER-COL-GRANTS-MADE USER-COL-GRANTS-RECD USER-CROSS-REFS USER-DB-LINKS USER-FREE-SPACE Таблицы, представления, синонимы, последовательности, доступные пользователю Описание собственных кластеров пользователя Отображение столбцов таблиц на столбцы кластеров Комментарии к столбцам из таблиц и представлений пользователя Доверительные передачи для столбцов, применительно к которым пользователь является доверителем, получателем или владельцем Все доверительные передачи для столбцов из объектов, принадлежащих пользователю Доверительные передачи для столбцов, применительно к которым пользователь является получателем Перекрестные ссылки для представлений, синонимов и ограничений пользователя Связи базы данных, принадлежащие пользователю USER-EXTENTS. Экстенты, включающие сегменты, которые принадлежат пользователю Свободные экстенты в табличных пространствах, доступных пользователю
45 Таблица 3-1. Продолжение Представление Описание user.indexes Описание собственных индексов пользователя USER_IND_COLUMNS Столбцы, включающие индексы пользователя или входящие в таблицы пользователя USER-OBJECTS Собственные объекты пользователя USER-SEGMENTS Память, отведенная для всех сегментов базы данных USER-SEQUENCES Описание собственных последовательностей пользователя USER_SYNONYMS Частные синонимы пользователя USERTABLES Описание собственных таблиц пользователя USER_TABLESPACES Описание доступных табличных пространств USER_TAB_AUDIT_OPTS Варианты ревизии для собственных таблиц и представлений пользователя USER_TAB_COLUMNS Столбцы таблиц, представлений и кластеров пользователя USER_TAB_COMMENTS Комментарии к таблицам и представлениям, принадлежащим пользователю USER_TAB_GRANTS Доверительные передачи для объектов, применительно к которым пользователь является доверителем, получателем или владельцем USER_TAB_GRANTS_MADE Все доверительные передачи для объектов, принадлежащих пользователю lISER_TAB_GRANTS_RECD.
46 Таблица 3-1. Продолжение Представление Описание Доверительные передачи для объектов, применительно к которым пользователь является получателем USER_TS_QUOTAS Квоты табличного пространства для пользователя USERJJSERS Информация о текущем пользователе Терминология В версии 6 используется несколько иная терминология для некоторых понятий из версии 5.1 и применяется новая терминология для тех понятий, которые были добавлены. Эти изменения представлены в табл. 3-2. Таблица 3-2. Изменения в терминологии при переходе от версии 5.1 Oracle к версии 6 Понятие из версии 51 Эквивалент из версии 6.0 Подразделение Устарело, заменено на "табличное пространство" Описание места Устарело, заменено на варианты хранения табличного пространства Файл прежнего образа Устарело, заменено на сегмент (сегменты) обратной прокрутки, хранимый в рамках базы данных Утилита ODS Команда из SQL*DBA: MONITOR ARH Стало устаревшим благодаря возросшей эффективности чтения на уровне обработки CLN SMON, PMON BIW, BWR Отсутствует DBWR, LGWR (не эквивалентны) ARCH
47 Таблица 3-2. Продолжение Понятие из версии 51 файлы регистрации последующих образов Необязательный AIJ Файлы регистрации покрытия Отсутствует Утилита CCF IOR INIT IQR WARM IOR SHUT Файл INIT.ORA Индексы кластеров Эквивалент из версии 6.0 Файлы регистрации действий Обязательные файлы регистрации действий Команда из SQL*DBA: RECOVER Вариант ARCHIVELOG, вариант NOARCHIVELOG Команда CREATE DATABASE из SQL Команда CREATE DATABASE из SQL Команда из SQL*DBA: STARTUP Команда из SQL*DBA: SHUTDOWN По существу идентичен в версии 6.0 Должны быть вручную созданы в версии 6.0 Сегменты данные/индекс По существу такие же, но 1/индекс Временные таблицы По существу такие же, но "временные сегменты" Отсутствует Файл управления (соответствующий базе данных) Отсутствует Формирование/Расформирование базы данных Отсутствует Открытие/Закрытие базы данных Заключение В этой главе перечислены и кратко описаны изменения, внесенные в СУРБД Oracle при переходе от версии 5.1 к версии 6- В каждом случае приводится ссылка на соответствующую главу книги или на название той документации корпорации Oracle, которая содержит дополнительную информацию об Изменении.
4 Структуры Oracle ъ этой главе рассматриваются структуры файлов Oracle, логическая структура базы данных, а также структуры таблиц, представлений и индексов. Структуры файлов В этом разделе обсуждаются назначение и поддержка файлов операционной системы, необходимых для работы системы баз данных Oracle. Требуются четыре типа файлов. Минимальный набор из этих четырех типов показан в табл. 4-1 и обсуждается ниже. Таблица 4-1. Минимальное множество файлов, нужных для работы СУРБД Oracle Тип файла Требуемый объем памяти Файлы кодов СУРБД Oracle Один файл базы данных Один файл управления Два файла регистрации действий Зависит от ОС Минимум 500К байт Определяется СУРБД Минимум 50К байт
49 файлы кодов СУРБД Oracle Продукты программного обеспечения, получаемые вами от корпорации Oracle на магнитной ленте или дискете, обычно приобретаются администратором базы данных или менеджером системы. Корпорация Oracle предоставляет вам также руковод¬ ство по установке и использованию, в котором вы найдете инструкции о том, куда помещать эти файлы и сколько места для них требуется. Файлы базы данных Эти файлы содержат все данные базы данных. Система баз данных Oracle состоит из одного или нескольких файлов баз данных. Файл базы данных обладает следующими характери¬ стиками: • один файл может соответствовать одной и только одной базе данных; • один или несколько физических файлов образуют единицу хранения в базе данных, называемую табличным про¬ странством; • множественные файлы базы данных могут добавляться к табличному пространству; • файл базы данных не может соединять собой разные табличные пространства; • при образовании экземпляра должны быть доступны все файлы баз данных для имеющихся табличных про¬ странств в системе баз данных; • не обязательно, чтобы файлы баз данных были непре¬ рывными, однако производительность будет наилучшей, если каждый файл базы данных представляет собой логически непрерывное распределение пространства на диске; • первым файлом базы данных является первый файл, Добавляемый к табличному пространству с именем SYSTEM. Р одних операционных системах вам требуется лишь назвать Файлы и Oracle автоматически разместит и отформатирует их использования. В других операционных системах вам нужно s СОзДать файлы базы данных до настройки. Обратитесь к своему Руководству Installation and User's Guide, чтобы выяснить, какие Шаги должен предпринять ваш администратор базы данных, Чтобы подготовить или идентифицировать файлы базы данных.
50 Количество файлов базы данных. Минимальное число файлов базы данных составляет 1, а допускаемый системой Oracle максимум — 255. В малой системе может находиться именно один файл базы данных. Вы можете установить свой собственный абсолютный максимум (который по умолчанию ограничивается значением 255), используя оператор CREATE DATABASE или дополнительный аргумент MAXDATAFILES. Существует также текущее максимальное число файлов базы данных со значением по умолчанию, равным 32. Вы можете установить свой собственный текущий максимум с параметром DB_FILES из INIT.ORA, который будет воздействовать при каждом открытии базы данных экземпляром и будет оставаться действующим до закрытия базы данных. DBJFILES временно сокращает предельное число файлов посредством MAXDATAFILES, но не может увеличить его. Вы можете добавить новые файлы базы данных (табличные пространства), используя операторы CREATE TABLESPACE или ALTER TABLESPACE из SQL. Вы не в состоянии удалить или увеличить файл базы данных, но при необходимости вам следует добавить другой файл базы данных. Размер файлов базы данных. Первый файл базы данных (исходное табличное пространство SYSTEM) должен содержать не меньше 500К байт, поскольку он будет содержать исходные словарь данных и сегмент обратной прокрутки. Вы можете добавить также файлы базы данных любого размера. Имейте в виду, что если вы установите другие программные продукты корпорации Oracle (например, оперативный HELP), то для них потребуется место в табличном пространстве SYSTEM. Размер блока файла базы данных. Система Oracle управляет файлами базы данных.в единицах, называемых блоками или страницами и соответствующих размеру блока Oracle, который может отличаться от стандартного размера блока ввода/вывода вашей операционной системы. Существует размер блока Oracle по умолчанию для всякой операционной системы, обычно составляющий 2 или 4К байт. Если большинство ваших записей не являются очень длинными или очень короткими, то не следует изменять этот размер блока по умолчанию. Однако, если вы хотите изменить его, то вы должны произвести такое изменение, когда создаете базу данных с помощью параметра DB_BLOCK_SIZE из INIT.ORA. После этого вы можете лишь
51 изменить размер блока, создавая заново базу данных. Новый размер блока должен быть кратным размеру блока вашей операционной системы. Параметр DB_BLOCK_SIZE также определит размер (но не количество) буферов базы данных в общей системной области (SGA). Параметр DB_BLC)CK_BIJFFERS определит число таких буферов, и этот параметр оказывает самое непосредственное влияние на производительность базы данных. Оперативное и автономное использование файлов базы данных. Вы не можете пользоваться отдельными файлами базы данных в автономном режиме, если это не единственный файл в табличном пространстве. В любой момент вы можете воспользоваться табличным пространством автономно. Когда вы так поступаете, все файлы базы данных из этого табличного пространства берутся совместно в автономном или оперативном режиме. Можно взять автономно любое табличное пространство, за исключением: • табличного пространства SYSTEM; • любого табличного пространства, содержащего все актив¬ ные сегменты обратной прокрутки (т. е. используемые в выполняемом или приостановленном экземпляре). Используйте команду ALTER TABLESPACE, чтобы взять табличное пространство в оперативном или автономном режиме. Удаление файлов базы данных. Вы можете сделать недей¬ ствительными все файлы в табличном пространстве, взяв его в оперативном режиме. Вы можете удалить все файлы данных в табличном пространстве, если воспользуетесь командой DROP TABLASPACE из SQL. После выполнения этого оператора, можно удалить соответствующие файлы базы данных, используя файловые команды вашей операционной системы. Файлы управления Файл управления — это небольшой двоичный файл, который соответствует одиночной базе данных. Система Oracle проверяет файл управления всякий раз, когда открывается база данных. Файл управления создается одновременно с созданием базы Данных. Текущий файл управления всегда должен быть доступен, Потому что он требуется для открытия базы данных и доступа к ней всякий раз, когда запускается экземпляр. Файл управления СоДержит:
52 ® имена физических файлов базы данных и файлов регистрации действий; • указание календарного, времени создания базы данных; • идентификатор ID базы данных. Вы не можете редактировать файлы управления. Они автоматически модифицируются системой Oracle и поэтому должны быть доступны при всяком открытии базы данных. В отношении файлов управления вам предоставляется единствен¬ ная возможность выбора того, сколько таких файлов сопровож¬ дать и где их следует размещать для резидентного хранения. Число файлов управления Корпорация Oracle настоятельно рекомендует вам иметь минимум два идентичных файла управления на разных дисках, чтобы уменьшить риск отказа устройств с потерей всех файлов управления. Создание большего количества файлов управления сопряжено с некоторым неудобством, поскольку некоторые операции, например работа с контрольными точками, потребуют обновления файлов управления, что приведет к увеличению затрат машинного времени. Параметр CONTROL-FILES из INIT.ORA указывает имена файлов управления. По умолчанию в перечисление включается одно имя. При отключении базы данных вы можете добавить больше файлов управления и изменить их имена и местона¬ хождение. Размер файлов управления Обычно файлы управления очень малы. Их размер опреде¬ ляется преимущественно двумя параметрами LOG_.FILES и DB_FILES из INIT.ORA. Файлы регистрации действий Регистрация действий является критической для работы базы данных. Она защищает базу данных в случае системной катастрофы или отказа устройства. Для каждой базы данных требуется один файл регистрации действий. Потеря такого файла может привести к необходимости приведения базы данных в прежнее состояние с помощью восстановления зарезервированной копии или полного экспорта базы данных. Если существуют какие-либо изменения, которые по каким-
53 либо причинам не внесены в базу данных до отказа, то в данные регистрации действий записываются изменения, кото¬ рые следует заново применить к базе данных. Процесс нового применения изменений называется прямой прокруткой. Регистрация действий включает два или несколько опера¬ ционных файла регистрации действий, внешних по отношению к базе данных. Ваша работающая база данных всегда должна иметь доступ для записи в один оперативный файл регистрации действий для включения туда текущих изменений, вносимых пользователями. Если нет возможности включать их в файл текущей регистрации действий, то система остановится. Элементы для регистрации действий буферизируются в SGA, а затем записываются в оперативный файл регистрации действий последовательно блоками посредством фонового про¬ цесса LGWR. В зависимости от того, должны ли архивироваться данные регистрации действий, вы можете использовать такие данные в двух вариантах, ARCHIVELOG или NOARCHIVELOG. Использование файлов регистрации действий является обяза¬ тельным. Администратору базы данных предоставляется лишь выбор, архивировать или нет файлы регистрации. Оперативные файлы регистрации действий заполняются "циклическим'' способом в обоих упомянутых выше вариантах. Когда вы пользуетесь вариантом ARCHIVELOG, оперативные файлы регистрации действий представляют собой временные области памяти дл.° перемещения данных с целью автономной регистрации. Если вы пользуетесь вариантом NOARCHIVELOG, то по завершении заполнения последнего оперативного файла регистрации действий запись будет продолжаться возвратом к первому файлу. Вы выбираете вариант, когда вводите CREATE DATABASE, однако можете переключиться на другой вариант в любой момент в будущем, когда закрывается база данных. Для этого примените оператор ALTER DATABASE из SQL. Различия между Двумя вариантами состоят в следующем: NOARCHIVELOG готовит только восстановление экземпляра, НО не восстановление при отказе устройства, потому что в любой данный момент доступны только самые недавние изменения в базе данных. Не обеспечивается сохранение файлов регистрации изменений, как только они заполнены; ARCHIVELOG обеспечивает защиту от отказа устройства, как и от отказа экземпляра, поскольку сохраняются все изменения
54 в базе данных. Каждый файл регистрации действий должен архивироваться (обычно на ленте) до того, как его можно будет повторно использовать. Независимо от выбранного варианта, регистрируются все изменения в базе данных. Вы всегда можете найти информацию, необходимую для восстановления экземпляра (от любой сис~ темной катастрофы или отказа программного обеспечения) в файле регистрации действий. Если вы архивируете данные такой регистрации, то вам предоставляется дополнительная защита знания того, что вы можете переконструировать часть своей базы данных, содержащуюся в поврежденных дисковых файлах, не теряя каких-либо транзакций. Однако при этом подразумевается дополнительная ответственность за запись информации на ленту и ее хранение, регулярное резервирование и поддержание записей. Другие аспекты сопоставления вари¬ антов ARCHIVELOG и NOARCHIVELOG обсуждаются в по¬ следующих разделах. Содержание файлов регистрации действий Основным содержанием файлов регистрации действий яв¬ ляются записи действий. Они включают данные прямой прокрутки, которые могут восстановить все изменения, внесен¬ ные в базу данных. Данные прокрутки хранятся в базе данных в сегментах прокрутки, поэтому регистрация действий защи¬ щает и данные прокрутки., Кроме того, файл регистрации действий содержит такую административную информацию, как состояние файла базы данных по отношению к экземпляру записи и последняя фиксированная контрольная точка. (Объяснение контрольных точек приводится ниже.) Содержимое файлов регистрации нельзя редактировать, изменять или использовать для каких-то прикладных целей, например для ревизии. Каждый файл регистрации действий имеет свой последовательный регистрационный номер, который используется во время восстановления. Использование регистрации действий в варианте NOARCHIVELOG Минимальным средством защиты гарантированной целост¬ ности базы данных является файл регистрации действий в варианте NOARCHIVELOG. В этом варианте файлы пишутся точно так же, как и в варианте ARCHIVELOG, но файлы
55 пегистрации действий используются повторно без автономного сохранения их содержимого. Поэтому доступны только самые последние изменения. Это приводит к следующему: • Вы можете использовать регистрацию действий лишь для восстановления после отказов, которые происходят, пока регистрация еще проводится оперативно. Вы всегда можете произвести восстановление после отказа экземп¬ ляра, но не после отказа устройства, поскольку были сохранены не все данные, необходимые для прямой прокрутки. • Если вследствие отказа табличное пространство становит¬ ся недоступным для вас, то вы лишаетесь доступа к базе данных до тех пор, пока не будет восстановлено табличное пространство. Использование регистрации действий в варианте ARCHFVELOG С помощью файлов регистрации действий в варианте ARCHIVELOG вы сохраняете все изменения в базе данных, так что в случае любого отказа экземпляра или устройства они могут использоваться повторно. Однако для архивизации требуется наличие как оперативной, так и автономной регист¬ рации действий. Она состоит в следующем: оперативная регистрация действий Набор текущих файлов регистрации действий, содержащих новейшие протокольные данные и доступных СУРБД для записи. автономная регистрация действий Набор всех прежних файлов регистрации действий, которые были архивизированы, обычно автономно на ленте. Когда вы работаете в режиме ARCHIVELOG и оперативный файл регистрации действий переполняется, содержащиеся в нем регистрационные записи должны быть архивизированы до Того> как можно будет повторно использовать этот файл регистрации. Если вы пользуетесь вариантом ARCHIVELOG, вам следует также регулярно осуществлять физическое резервирование базы Данных с помощью утилиты резервирования из вашей опера¬ ционной системы. Вы можете резервировать всю базу дачных в файле за один раз, даже если база данных открыта и пользователи выполняют обновления. Регистрация действий спечит запись всех транзакций вслед за "моментальным Мком" состояния памяти вплоть до следующего моменталь¬
56 ного снимка. Вам потребуется соответствующее автономное запоминание всех изменений, которые происходят в каждый интервал между резервированиями. Конфигурирование файлов регистрации действий При конфигурировании файлов регистрации действий вам следует рассмотреть следующие вопросы: 1. Сколько общего пространства памяти для регистрации действий вам требуется? 2. Сколько оперативных файлов регистрации действий вы хотите иметь? 3. Пользуетесь ли вы вариантом ARCHIVELOG? Если да, то стали бы вы реже архивировать большие файлы и чаще меньшие файлы? 4. Сколько файлов регистрации действий можно архивиро¬ вать па одно архивное устройство (обычно ленту)? В последующих разделах обсуждаются возможные ответы на эти вопросы. Размер файлов регистрации действий Все ваши файлы регистрации действий не обязательно должны иметь одинаковый размер. Минимальный размер составляет 50 Кбайт. Размер файла регистрации действий устанавливается в блоках операционной системы, а не в блоках системы Oracle. Размер блока важен в том случае, если вы решаете изменить значение, используемое вами в параметре CHECKPOINT_INTLRVAL из INIT.ORA, поскольку оно пред¬ ставляет собой число блоков операционной системы, а не системы Oracle. Число файлов регистрации действий Для каждой базы данных требуются два файла регистрации действий. Вы можете добавить больше файлов регистрации действий с учетом двух ограничений: (1) абсолютного макси¬ мального числа и (2) текущего максимального числа. Вы можете установить абсолютное максимальное число файлов регистрации действий, воспользовавшись дополнительным параметром MAXLOGFILES из оператора CREATE DATABASE. Установка для MAXLOGFILES повлияет на размер файла управления. Этот максимум ограничен максимальным числом файлов базы данных, принятым в Oracle и составляющим 255.
57 Вы можете установить текущее максимальное число файлов регистрации действий с помощью параметра LOG_FILES из jj^lT.ORA или оставить его по умолчанию равным 16. Это ограничение будет действовать каждый раз, когда экземпляр открывает базу данных и будет сохраняться, пока не закроется база данных. Число, посылаемое вами в LOG_FILES, временно уменьшит предел, установленный с помощью MAXLOGFILES, но не может увеличить его. Использовать LOGJFILES или MAXLOGFILES не обязатель¬ но. Если вы не пользуетесь ни тем, ни другим параметром, то принимаемое по умолчанию предельное значение числа файлов регистрации действий равно принятой в Oracle границе в 255 файлов. Контрольные точки По мере заполнения вашего оперативного файла регистрации действий происходит переключение на контрольную точку как в варианте ARCHIVELOG, так и в варианте NOARCH1VELOG. После контрольной точки все модифицированные буфера базы данных будут переписаны в файлы базы данных при условии, что все изменения были записаны на диск. Контрольные точки не оказывают влияния па пользователей базы данных, однако гарантируют, что прежние регистрационные записи больше не нужны для восстановления экземпляра и все измененные блоки базы данных записываются на диск. Контрольные точки возникают, когда файлы регистрации становятся полными. Они могут также встречаться с предпи¬ санными интервалами времени во время записи файлов регистрации действий. Они служат двум целям: (1) уменьшают время, необходимое для восстановления экземпляра, и (2) отмечают готовность оперативного файла регистрации действий Для архивации или повторной записи. Логические структуры базы данных Базу данных в системе Oracle составляют следующие логические структуры: • табличные пространства; • пять типов сегментов (данных, индекса, обратной про¬ крутки, временный и начальной загрузки); • параметры хранения, которые определяют, как сегменты
58 распределяют единицы пространства памяти, называемые экстентами. Эти структуры объясняются в последующих разделах. Табличные пространства Всякая база данных идентифицируется именем базы данных, которое вы должны специфицировать в операторе CREATE DATABASE. Ваша база данных разделяется на логические подразделы, называемые табличными пространствами, которые содержат такие данные, как таблицы и индексы. Всякая база данных содержит хотя бы одно табличное пространство, но может включать и больше. Первое табличное пространство в вашей базе данных называется SYSTEM. Oracle автоматически создает табличное пространство SYSTEM, когда вы выполняете оператор CREATE DATABASE. SYSTEM содержит словарь данных для всей базы данных. Вы не можете пользоваться табличным пространством SYSTEM в автономном режиме, при подобной попытке получите сообщение об ошибке. Малые базы данных могут содержать, только табличное пространство SYSTEM, но в этом случае SYSTEM должно быть настолько велико, чтобы включать в себя: • словарь данных; • все сегменты обратной прокрутки, начальной загрузки и временные сегменты; • автономные подсказки HELP, если они загружены; • таблицы, требующиеся для других реализованных про¬ дуктов Oracle; • все объекты, созданные пользователями. Вам придется несколько пожертвовать гибкостью, пользуясь лишь табличным пространством SYSTEM, как объясняется ниже под заголовком "Использование множественных табличных пространств". Каждому табличному пространству соответствует некоторое множество параметров хранения, которые применяются к таблицам и индексам в рамках табличного пространства. Эти параметры представляют .собой либо значения по умолчанию, либо новые параметры, которые вы устанавливали для замены умолчаний. Вы можете расширить табличное пространстве SYSTEM, добавив к нему новые файлы. Администратор базы данных использует табличные пространства для того, чтобы:
59 • контролировать распределение пространства памяти для объектов базы данных; • устанавливать пространственные квоты для пользователей базы данных; • контролировать доступность данных, выбирая автономно отдельные табличные пространства; • резервировать или восстанавливать данные; • распределять данные между устройствам для повышения производительности. Использование множественных табличных пространств. Имеются некоторые преимущества по сравнению с примене¬ нием всего лишь табличного пространства SYSTEM. Например, при множественных табличных пространствах вы можете: • распределять ввод/вывод между табличными простран¬ ствами на основе использования прикладных программ; • отделять табличные данные от индексных; • воплощать схемы распределения памяти для пользовате¬ лей или приложений; • для наглядности автономно выбирать отдельные таблич¬ ные пространства; • резервировать различные табличные пространства для различных типов использования базы данных (например, для высокой активности обновления, режима только чтения или временных рабочих областей). Если используется лишь табличное пространство SYSTEM, то вся база данных должна работать в оперативном режиме, поскольку данное пространство SYSTEM всегда должно быть доступным. Связывание пользователей с табличными пространствами. Те пользователи, которые будут создавать объекты базы данных, Должны обладать правом создавать их в некотором указанном табличном пространстве. Это означает, что по отношению к каждому из таких пользователей администратор базы данных может: • передавать привилегию RESOURSE для одного или нескольких табличных пространств; • отводить табличное пространство по умолчанию; • отводить квоту для каждого табличного пространства, специфицирующую, сколько места пользователь может запять для таблиц и индексных данных; • отводить по умолчанию временное табличное простран¬
60 ство для любых временных сегментов, созданных систе^ мой Oracle для обработки запросов пользователей. Помещение таблиц в предписанные табличные пространства. При наличии привилегии RESOURSE для нескольких таблич¬ ных пространств вы можете указать, какое табличное простран¬ ство должно содержать табличные или индексные данные. Наличие выбора табличных пространств означает, что вы можете: • подбирать таблицы для совместного запоминания в файлах базы данных; • сокращать нагрузку на дисковод, запоминая табличные данные и индексные данные в разных табличных про¬ странствах; • управлять тем, какие физические запоминающие устрой¬ ства будут хранить те или иные данные, и тем самым воздействовать на скорость доступа; • использовать по умолчанию параметры хранения для сегментов данных и индексов; о группировать вместе таблицы с высокой активностью, чтобы можно было чаще резервировать их; • группировать вместе все таблицы, принадлежащие одной прикладной программе. Этим будет обеспечена коорди¬ нация доступа и гарантия их постоянной доступности и совместного резервирования; • сокращать содержимое заголовков для нескольких таблиц; Таблица или индекс не может перекрывать разные табличные пространства, но может перекрывать разные файлы, образующие одно табличное пространство. Оперативные и автономные табличные пространства.. Всег¬ да, когда открыта база данных, администратор базы данных может оформить табличное пространство оперативно или автономно, за исключением случая табличного пространства SYSTEM, которое всегда должно быть оперативным. Для автономного оформления табличного пространства могут иметься следующие мотивы: • сделать часть базы данных недоступной, сохранив до¬ ступность остальной части; ® выполнить резервирование табличного пространства (ко¬ торое, впрочем осуществимо и при оперативном таблич¬ ном простращ ве); • временно сделать недоступным набор таблиц приложений,
61 пока для них выполняется обновление или процедура сопровождения; • достичь большей гибкости при доступных в данный момент запоминающих устройствах. Эта возможность автономно брать табличные пространства позволяет администратору базы данных более гибко работать с редко используемыми данными или реагировать на сокра¬ щение запоминающих устройств. файлы в автономном табличном пространстве не открыты, и доступ к данным в таком табличном пространстве невозможен. Никакая утилита, не относящаяся к системе Oracle, не гложет ни читать, ни редактировать автономное табличное простран¬ ство. Кроме того, автономное табличное пространство можно перевести в оперативное состояние только базой данных, берущей его автономно (поскольку необходимая информация словаря данных поддерживается в табличном пространстве SYSTEM этой базы данных). Словарь данных в табличном пространстве SYSTEM будет регистрировать, является ли табличное пространство оператив¬ ным или автономным. Если в последний раз, когда устранялась база данных, табличное пространство было автономным, оно будет автономным и при новой установке базы данных. '’Доступ" к автономным данным. Иногда возможен доступ к данным, когда таблица или индекс находится в автономном состоянии. Например, если таблица оперативна, но индекс автономен, то окажется успешным оператор из SQL, которому требуется полное считывание таблицы, а не индекса. И наоборот, если таблица автономна, а индекс со ссылкой на все упомянутые в запросе столбцы оперативен, то запрос SQL окажется успешным. Восстановление автономных табличных пространств. Вы можете выполнить над табличным пространством операции восстановления, пока оно автономно, и тем самым сохранить оперативный режим для остальной части базы данных, пока восстанавливается опасный файл. Аналогично при восстанов¬ лении экземпляра отдельные части базы данных можно сделать Доступными еще до восстановления всей базы данных. Добавление файлов или табличных пространств. Вы можете Добавлять файлы базы данных к существующим табличным пРострапствам или создавать новые табличные пространства ^Ля увеличения базы данных. Если вы хотите добавить к
62 существующему табличному пространству файл базы данных, то воспользуйтесь следующим оператором SQL: ALTER TABLESPACE ADD FILE Для создания нового табличного пространства используйте другой оператор SQL CREATE TABLESPACE Сегменты и экстенты Все данные в вашем табличном пространстве (табличные, индексные или временные, требуемые для работы СУРБД) хранятся в отведенном для них пространстве памяти базы данных, называемом сегментами. Сегмент представляет собой множество блоков базы данных. Отдельный сегмент не может перекрывать разные табличные пространства. Для базы данных требуются следующие типы сегментов: • данных; • индекса; • обратной прокрутки; • временные; • начальной загрузки. Каждый из этих типов сегментов будет подробно описай после обсуждения параметров хранения для сегментов. Струк¬ тура всех сегментов в сущности одинакова, и все они состоят из экстентов. Однако сегменты создаются по-разному в зависимости от их типа. Все пользователи имеют дело с сегментами данных и индекса, причем в основном только администраторы баз данных будут иметь дело с сегментами обратной прокрутки, начальной загрузки и временными сег¬ ментами. Сегменты в пределах одного табличного пространства опи¬ сываются параметрами хранения, которые связываются с каждым табличным пространством посредством команды CRE¬ ATE TABLESPACE. Эти параметры определяют распределение памяти для всех сегментов, созданных в данном табличном пространстве. Параметры хранения будут управлять тем, как таблица (или индекс) будет получать место для своих данных. Параметры хранения выражаются через экстенты данных. Экстент пред-
63 ставляег собой распределение пространства памяти базы дан¬ ных, выраженное числом байт данных. Когда таблица создается впервые, ее сегмент данных содержит начальный экстент из определенного числа байт; это означает, что данные блоки Oracle были зарезервированы для строк этой таблицы. Когда вставляются строки, таблица может расти до заполнения начального экстента. Если для размещения данных требуется больше пространства, вы должны выделить последующий экстент. В табл. 4-2 приводятся параметры хранения для всех типов сегментов или объектов, созданных в табличном пространстве (в первую очередь таблиц и индексов). Действие параметров. Вы можете устанавливать параметры хранения следующими способами, начиная с наиболее конк¬ ретных и кончая самыми общими: • в операторе ALTER TABLE, INDEX или CLUSTER; • в операторе CREATE TABLE, INDEX или CLUSTER; • в операторе ALTER TABLESPACE; • в операторе CREATE TABLESPACE. Любой параметр хранения, специфицированный на уровне таблицы, индекса или кластера, будет подавлять соответствую¬ щее множество параметров на уровне табличного пространства. При изменении параметров это влияет только на те экстенты, которые еще не распределены в памяти. Таблица 4-2. Параметры хранения для сегментов Параметр Описание initial Размер (в байтах) первого экстента, размещенного при создании таблицы. Исходный объем памяти, доступный для размещения табличных данных. По умолчанию составляет 10 240 байт next Размер (в байтах) очередного размещаемого экстента. Представляет собой базовое значение, которое можно увеличить на определенное число процентов, задаваемое для PCTINCREASE. По умолчанию составляет 10 240 байт Maxextents Общее число экстентов, включая первый, которые когда-либо могут быть размещены.
64 Таблица 4-2. Продолжение Параметр Описание По умолчанию составляет 99. Абсолютный максимум изменяется операционной системой MINEXTENTS Общее число экстентов, которые должны быть размещены при создании сегмента. При создании допускается распределение большого количества памяти, даже если эта память не является непрерывной. По умолчанию составляет 1 PCTINCREASE Процент, на который каждый очередной экстент будет превосходить размер последнего размещенного экстента. Если PCTINCREASE равняется нулю, то размер каждого дополнительного экстента остается постоянным. Если PCTINCREASE положителен, то при каждом вычислении значения NEXT он будет возрастать на величину PCTINCREASE, которая не может быть отрицательной Размещение экстентов. Блок заголовка сегмента в каждом сегменте описывает этот сегмент и содержит каталог экстентов в сегменте. Словарь данных также содержит эту информацию в таблице EXTENTS, которая перечисляет все экстенты в базе данных независимо от того, в каком табличном пространстве они находятся. Вы можете использовать словарь данных для обнаружения свободного пространства и отыскания новых экстентов. Если СУРБД нуждается в том, чтобы разместить другой экстент для сегмента, она просматривает свободное простран¬ ство в базе данных и отводит первое непрерывное множество блоков Oracle, которое находит. В этот момент заголовок сегмента и словарные таблицы базы данных обновляются, показывая тем самым, что новый экстент размещен и это место более не является свободным. Устранение экстентов. Если вы ликвидируете таблицу, то все ее сегменты данных и индексов заменяются табличными
65 пространствами, которые они занимали, и эти экстенты становятся доступными для использования в других объектах пз табличного пространства. То же самое верно для индексного сегмента. Блоки данных, распределенные в таблице, остаются таковы¬ ми столько времени, сколько существует таблица. Даже если все строки таблицы удалены, все равно блоки данных сохра¬ няются для этой таблицы. Экстенты данных и индексов не перераспределяются, пока не будет перераспределен сегмент. Когда сегмент ликвидируется, словарь данных обновляется, чтобы показать, что теперь эти экстенты стали свободным пространством. Сегменты данных и индексов. Они содержат табличные и индексные данные. Сегмент данных содержит все данные для одной таблицы. Таблице всегда соответствует один сегмент данных. Сегмент индекса содержит все индексные данные для одного индекса, созданного для таблицы или кластера. Одной таблице может соответствовать любое количество связанных с ней сегментов индексов (от нуля до нескольких). Оно определяется числом индексов, связанных с таблицей. Каждый кластер должен иметь по крайней мере один сегмент индекса для размещения индекса кластера, который создается по ключу кластера. Вы можете создать индекс не в том табличном пространстве, где вы создавали таблицу (если у вас есть допуск RESOURCE к многочисленным таблицам). То же самое верно для индексов кластера. Начальный сегмент обратной прокрутки. Когда вы создаете базу данных, в табличном пространстве SYSTEM автоматически создается начальный сегмент обратной прокрутки с именем SYSTEM, причем по умолчанию используются параметры хранения, соответствующие этому табличному пространству. Обычно такой сегмент прокрутки достаточно велик для малых баз данных, но администраторы баз данных для больших систем могли бы захотеть увеличить его или добавить новые сегменты. Обычно производительность повышается при наличии несколь¬ ких сегментов обратной прокрутки. Они требуются, когда: • у базы данных имеются табличные пространства, отлич¬ ные от SYSTEM; • несколько экземпляров имеют доступ к базе данных, работающей в режиме разделения диска.
66 База данных с несколькими табличными пространствами должна обладать двумя или большим числом сегментов обратной прокрутки, хотя не требуется, чтобы для каждого табличного пространства существовал свой собственный сегмент обратной прокрутки. В случае базы данных, работающей в режиме разделения диска, всякий экземпляр должен иметь доступ к некоторому сегменту обратной прокрутки, чтобы начать функционировать. Чем больше существует сегментов обратной прокрутки, тем меньше конкуренции будет из-за любого отдельного сегмента. Каждый сегмент обратной прокрутки может работать с рядом транзакций из экземпляра, причем их точное число зависит от размера блока системы Oracle. Дальнейшие подробности об этом приводятся в гл. 11. Содержание сегмента обратной прокрутки. Вы лишены возможности доступа к сегментам обратной прокрутки или чтения из них (даже если имеете привилегии администратора базы данных). Эти сегменты заполняются и читаются только системой СУРБД. Сегмент обратной прокрутки содержит элемент обратной прокрутки, который включает идентификатор. (ID) транзакции, информационный блок и описание данных, существовавших до начала транзакции. Идентификаторы тран¬ закций связывают между собой элементы обратной прокрутки, так что поиск элементов осуществляется легко, если обратная прокрутка становится необходимой. Как записываются сегменты обратной прокрутки. Сегмент обратной прокрутки присваивается группам блоков, называе¬ мым экстентами. В отличие от экстентов данных и индексов, экстенты сегментов обратной прокрутки содержат временную информацию. Поэтому сегменты обратной прокрутки повторно используют блоки циклическим способом. Всякий элемент обратной прокрутки фактически записыва¬ ется дважды: сначала он пишется в сегмент обратной прокрутки, а затем записывается в оперативный файл регистрации действий. Этим гарантируется постоянная возможность обрат¬ ной прокрутки для активных транзакций даже после системной катастрофы, когда блоки сегментов обратной прокрутки еще не были переписаны на диск. Во всех типах обратной прокрутки используются следующие процедуры: • обратная прокрутка на уровне операторов (вследствие тупиковой операции или ошибки выполнения оператора);
67 • обратная прокрутка до точки сохранения; • обратная прокрутка транзакции по запросу пользователя; • обратная прокрутка всех невыполненных транзакций в случае, когда работа экземпляра завершается неестествен¬ ным образом. Общие сегменты обратной прокрутки. База данных может обладать любым количеством как частных, так и общих сегментов обратной прокрутки, причем при использовании базы данных доступ к тому или иному сегменту возможен для каждого экземпляра. Общим называется такой сегмент обратной прокрутки, который годится для использования в любом экземпляре, имеющем доступ к базе данных. Администратор базы данных создает общий сегмент обратной прокрутки, пользуясь зарезервированным словом PUBLIC в операторе CREATE ROLLBACK SEGMENT. Когда экземпляр израсходует свой частный сегмент (сег¬ менты), он ищет общий сегмент. Когда некий экземпляр "захватывает" общий сегмент обратной прокрутки, никакой другой экземпляр не может пользоваться этим сегментом, пока первый экземпляр не завершит свою работу и не закроет базу данных. Частные сегменты обратной прокрутки. Данный сегмент должен быть упомянут в файле INIT.ORA для параметра ROLLBACK__SEGMENTS_REQUIRED. Использование частных сегментов обратной прокрутки может иметь особое значение в системах разделения диска. Отсроченные сегменты обратной прокрутки. При автоном¬ ной работе с табличным пространством незамедлительная обратная прокрутка транзакций становится невозможной. По¬ этому в таком случае пишется отсроченный сегмент обратной прокрутки. Он содержит элементы обратной прокрутки с таким расчетом, что их можно будет применить, когда табличное пространство вновь станет оперативным. Эти отсроченные сегменты обратной прокрутки автоматически создаются в табличном пространстве SYSTEM. Временные сегменты. Система Oracle часто требует вре¬ менное рабочее пространство для различных этапов обработки запросов, например для сортировки. Такие рабочие пространства Называются временными сегментами. Они могут потребоваться Дня следующих операций языка SOL:
68 CREATE INDEX SELECT... ORDER BY SELECT DISTINCT... SELECT... GROUP BY SELECT... UNION SELECT... INTERSECT SELECT... MINUS неиндексированные соединения некоторые согласованные подзапросы Если в запросе появляется более чем одна из перечисленных выше операций, то одновременно могут потребоваться несколько временных сегментов. Они распределяются по местам по мерс надобности во время сеанса работы пользователя и удаляются, когда пользователь отсоединяется от базы данных. Сегмент начальной загрузки. Данный сегмент создается в табличном пространстве SYSTEM, когда вы создаете базу данных. Сегмент начальной загрузки содержит словарные описания для словарных таблиц, которые будут загружены при открытии базы данных. Такой сегмент включает менее 100 блоков базы данных. Он недоступен для пользователей. Структура объектов базы данных Объекты базы данных создаются пользователем. Они раз¬ мещаются в табличных пространствах и содержат данные пользователей. В этом разделе описываются следующие объекты базы данных: таблицы, представления, индексы, ключи и кластеры. Таблицы Таблицы — это основные единицы хранения данных в реляционной базе данных. Вы описываете каждую таблицу с помощью оператора CREATE TABLE, специфицируя ее имя и множество столбцов. У каждого столбца есть свое имя, тип данных и ширина, которые могут определяться типом данных, как в DATA, или специфицироваться, как в CHAR (где вы специфицируете максимальную ширину). Вы можете также специфицировать, должно или не должно значение заполняться для определенного столбца или может ли пользователь в таком столбце использовать значения NULL. Строки Всякой строке соответствует логический столбец, содержа¬ щий ее адрес в базе данных. Этот столбец называется ROWID.
69 ВЫ можете восстановить этот адрес с помощью зарезервиро¬ ванного слова ROWID из SQL, как в следующем запросе, где вы получите значения ROWID для должностей служащих из таблицы служащих: SELECT ROWD, должность FROM Служ; Строки хранятся в одной или нескольких частях строк, причем каждая часть идентифицирутся ее адресом ROWID. Вы можете ссылаться на ROWID для первой части строки, но не можете сослаться на другие части строки. Строка с несколькими частями может охватывать несколько блоков данных. Если вся строка укладывается в одном блоке, то она будет состоять только из одной части. Части сцепляются между собой с помощью ROWID. ROWID — это самое быстрое средство достижения конкрет¬ ной строки. Это уникальный идентификатор для строки из заданной таблицы. Однако значение ROWID для данной строки может изменяться со временем, так что вам следует проверять значение ROWID для строки, прежде чем пользоваться им. На ROWID можно ссылаться, как на столбцы (как показано выше в операторе SELECT), по они не являются данными из базы данных, и поэтому к ним не применимы операторы UPDATE, INSERT и DELETE. Представления Технически представления не являются таблицами, но во многих случаях их можно интерпретировать как таблицы. Представления — это запомненные запросы в табличном формате. Представления обеспечивают удобство и защиту. Синтаксис для создания представлений показан в гл. 7. Представления не требуют памяти в каком-либо табличном пространстве (за исключением строк в словаре данных, которые служат для хранения описаний представлений). Индексы Индексы — это структуры, хранимые в базе данных. За Исключением индексов, автоматически создаваемых в таблицах словарей данных, они необязательны; вы не обязаны иметь Какой-либо m них. Однако вы, вероятно, захотите установить
70 индексы, потому что они ускоряют выполнение запросов и могут гарантировать уникальность каждой вашей строки данных. Индекс — это быстрый способ доступа к данным. Он не влияет на словесную формулировку какого-либо оператора языка SQL. Он воздействует только на скорость выполнения и на проверку уникальности. Если вы включаете зарезервированное слово UNIQUE, когда создаете индекс, то гарантируется уникальность элемента. Например, каждое значение, вводимое в виде номера страховки, будет отличаться от любого другого такого значения. Если вы при создании таблицы специфицируете также, что столбец страховки должен быть (NOT NULL), то тем самым будет гарантировано, что всякая строка будет содержать некое значение в столбце страховки. Ры не можете создать индекс UNIQUE, если в вашей таблице уже содержатся одинаковые строки. Однако, как только вы создали индекс UNIQUE, этот индекс не позволит включить или обновить в таблице какую-нибудь повторяющуюся строку. Не являющиеся уникальными индексы тоже полезны для ускорения восстановления. Вы можете создавать индексы по одному или нес^льким столбцам. Когда вы создаете индекс более чем по одному столбцу, он называется сочлененным индексом. Вы можете сочленять до 16 столбцов или всего до 255 символов. Необязательно, чтобы эти столбцы были соседними. Если для придания некой строке уникальности требуется более одного столбца в таблице, то вам следует сочленять столбцы. Например, вы могли бы пожелать сочленить код местности и столбцы телефонных номеров. Индексы могут создаваться либо в том табличном простран¬ стве, где находится таблица, либо в другом пространстве. Обычно лучше создавать индекс после данных, включенных в таблицу. Однако если вы хотите гарантировать, что определенное значение является уникальным для каждой строки, то должны создать уникальный индекс до включения или загрузки данных. Это потребует некоторых потерь в производительности при загрузке данных, но обеспечит исключение всех дублирующих записей. Таблице может соответствовать любое количество индексов, но чем их больше, тем больше накладных расходов, потому что изменяется содержимое таблицы. В общем случае, если
71 таблица предназначается только для чтения, то полезно иметь больше индексов. Если же таблица должна часто обновляться, рьт можете предпочесть несколько индексов. Индексы системы Oracle имеют структуру В*-дерева, причем верхние блоки индекса содержат индексные данные, которые указывают индексные блоки нижнего уровня. Индексные блоки нижнего уровня содержат каждое значение индексных данных и соответствующее значение ROWID для отыскания фактиче¬ ской строки. Структура В*-дерева используется несмотря на операционные накладные расходы, поскольку она обеспечивает быстрое восстановление записей. Первичные и внешние ключи В отличие от индексов, являющихся физическими структу¬ рами, которые существуют в базе данных, ключи представляют собой логические структуры. Первичный ключ — это столбец или группа столбцов, которая однозначно идентифицирует строку в данной таблице. Внешний ключ — это столбец или группа столбцов в одной таблице, являющаяся первичным ключом в другой таблице. Подробнее ключи рассматриваются в гл. 18. Кластеры При желании вы можете использовать кластеры для хранения табличных данных. Кластеры — это группы таблиц, которые используются и, следовательно, хранятся совместно. В такой ситуации употребление кластеров улучшает время доступа и может уменьшить объем памяти. Если набор таблиц содержит общие данные и запоминается в виде кластеров, то общие данные запоминаются лишь однократно. Разумеется, это более эффективно по сравнению с запоминанием таблиц по отдельности, когда общие данные повторяются в каждой таблице. Доступ к данным, хранящимся в кластере, можно осуществлять командами SQL так, как будто каждая таблица запоминалась в отдельности. Кластеры не влияют па проектирование приложений или на конструирование запросов на языке SQL. Ключ кластера — это столбец (столбцы), который является общим для кластеризированных таблиц. Вы должны упомянуть эти столбцы в своем операторе CREATE CLUSTER и в Оредложении CLUSTER оператора CREATE TABLE для каждой
72 таблицы, добавленной к кластеру. В каждой таблице в кластере столбец кластера должен иметь один и тот же размер и тип. Ключ кластера может формироваться не более чем из 16 столбцов. После создания кластера вы должны создать индекс кластера по столбцам ключа кластера, и вам нужно сделать это до выполнения любого оператора языка манипулирования данны¬ ми (DML). (Операторы языка DML описываются в гл. 7.) При желании вы можете поместить кластер в одно табличное пространство, а его индекс — в другое. Полный синтаксис создания и ликвидации кластеров представлен в гл. 7. Структуры памяти В системе Oracle существуют четыре основные области памяти: • общая область системы (ООС); • общая область памяти (ООП); • контекстные области; • области программного обеспечения. Краткий обзор каждой такой области содержится в после¬ дующих разделах. Если это предусмотрено в вашей операционной системе, то система Oracle будет работать с реальной и виртуальной памятью. Реальная память представляет собой основную память, а виртуальная обычно образуется на диске (в дополнительной памяти) и будет выглядеть с точки зрения прикладных программ как основная. Общая область системы (ООС) Данная область отводится для экземпляра, когда он начинает функционировать, и возвращается в фонд системы, когда экземпляр перестает работать. Она содержит данные и управ¬ ляющую информацию для экземпляра. В ООС можно писать только код СУРБД, а не код пользователя. Рекомендуется содержать ООС в реальной памяти (а не в виртуальной), чтобы избежать чтения с диска, потому что информация из ООС используется часто. Вы определяете размер ООС при возникновении экземпляра путем установки подхо¬ дящих параметров INIT.ORA. (Информацию о параметрах INIT.ORA см. в гл. 5.)
73 Общая область процесса Данная область отводится для процесса, обычно когда тот подключается к системе Oracle. Она содержит информацию о том, как связываться с программой пользователя, и о том, что в текущий момент делает процесс. Если вы готовы к подключению, то вы не выйдете из пространства ООП. Иначе говоря, либо имеется достаточное количество места, либо вы получите сообщение об ошибке и окажетесь неспособным к подключению. На размер ООП для процессов пользователей влияют следующие параметры: OPEN_CURSORS DB_FILES OPENJJNKS LOG-FILES SAVEPOINTS Контекстные области В системе Oracle контекстная область представляет собой буфер, отведенный для исполняемых операторов языка SQL. Если оператор является запросом, то контекстная область будет содержать также одну строку результата и заголовок для результата. Термин курсор часто употребляется как синоним "контекстной области". Параметр OPEN_CURSORS из INIT.ORA устанавливает допустимое число открытых курсоров (и тем самым контекст¬ ных областей). Как только вы распределили память для курсора, она становится доступной для последующих операторов, при¬ менительно к которым грамматический разбор осуществляется с использованием этого курсора. Если вам необходимо больше места, то контекстная область будет динамически расти. Вы устанавливаете начальный размер пространства памяти, отведенного для контекстной области, с помощью параметра CONTEXT_AREA из INIT.ORA, значение которого по умолчанию для большинства операционных систем составляет 4К. Если вам нужно больше пространства, то вы Можете распределить его в экстентах, размеры которых уста¬ навливаются параметром CONTEXT_INCR из INIT.ORA. Вы Можете распределить до 50 экстентов. Курсор будет заново Установлен в своем исходном размере, когда вы его закроете и потом снова откроете. Контекстные области представляют собой неразделяемые области памяти, в которые можно писать.
74 Области программного обеспечения Области программного обеспечения хранят код, который может быть исполнен. Код для СУРБД Oracle хранится в защищенном месте в области программного обеспечения. Эти области предназначаются только для чтения и могут быть разделяемыми или неразделяемыми в зависимости от вашей операционной системы. В случае разделяемости все пользова¬ тели имеют доступ к СУРБД Oracle без наличия множественных копий в памяти, что экономит место в реальной основной памяти и может способствовать улучшению производительности системы. Размер областей программного обеспечения также зависит от операционной системы и не изменяется, пока не произойдет новая установка программного обеспечения. Заключение В этой главе мы объяснили назначение и принципы сопровождения файловых структур Oracle, логических структур баз данных, структур таблиц, представлений и индексов, а также структур памяти. Перечисляется минимальный набор файлов, необходимых для работы СУРБД Oracle. Обсуждаются файлы управления базой данных и регистрации действий. Рассматри¬ вается использование табличных пространств и параметров хранения, а также первичных и внешних ключей и ключей кластеров. Изучаются характеристики четырех типов структур памяти: ООС, ООП, контекстные области и области програм¬ много обеспечения.
5 Администратор базы данных (АБД) Для любой системы с более чем одним пользователем должен существовать администратор базы данных (АБД). (В системе с одним пользователем последний исполняет функции АБД, как и все остальные функции.) Обычно АБД выступает в роли основного распространителя информации между поставщиком программного обеспечения и пользователями базы данных. Успешная работа системы баз данных зависит от АБД. На него возлагаются следующие обязанности и ответственности: • установка программного обеспечения (см. руководство по установке и инструкцию пользователю для вашей опера¬ ционной системы); • проектирование базы данных (см. гл. 18); • создание базы данных (см. ниже); • запуск и отключение базы данных (см. ниже); • управление и настройка (см. ниже); • сокращение необязательной или избыточной памяти (см. гл. 11); • обеспечение разделения данных между пользователями (см. ниже); • обеспечение защиты базы данных (см. гл. 12); • выполнение регулярного резервирования базы данных (см. ниже).
76 Большая часть инструментария, в котором АБД нуждается для выполнения этих обязанностей, содержится в утилите SQL*DBA, эта утилита впервые появилась в версии 6.0 я описывается ниже в разд. Программа SQL*DBA”. Вы будете пользоваться SQL*DBA для начального создания базы данных, для ее запуска и отключения. Эти операции рассматриваются в разд. ’’Управление базой данных с помощью монитора" и "Начальное создание базы данных". Типы АБД Oracle автоматически регистрирует для каждой СУРБД двух пользователей, являющихся АБД; они называются SYS и SYSTEM. Их функции несколько различаются и объясняются ниже. В больших системах может быть много людей, выпол¬ няющих функции АБД. Однако, вместо того чтобы иметь много пользователей, связывающихся с базой данных под псевдони¬ мами SYS и SYSTEM, следует использовать дополнительные имена пользователей, чтобы уменьшить вероятность того, что кто-то непреднамеренно изменит представления или таблицы, относящиеся к компетенции SYS или SYSTEM. Администратор базы данных — это фактически любой пользователь, обладающий привилегиями АБД, но вследствие большого разнообразия этих привилегий число пользователей АБД должно быть ограниченным. Бюджет АБД в операционной системе Администратор базы данных должен обладать возможностью доступа к операционной системе, в которой работает Oracle. Для этого АБД нуждается в бюджете пользователя операционной системы или в идентификаторе ID. Кроме того, этот бюджет необходим для того, чтобы АБД мог использовать системные привилегированные команды SQL*DBA. Метод различения бюджетов АБД в операционной системе специфичен для системы, и поэтому для установки этого бюджета вам следует обратиться к руководству по установке и инструкции пользова¬ телю для вашей операционной системы. Пользователь АБД, называем..ш SYS Администратор f/зы данных SYS владеет всеми основными таблицами в словар< данных, а также всеми представлениями,
77 базирующимися на этих таблицах. Они являются критическими цдя работы Oracle, и поэтому бюджетом SYS следует пользо¬ ваться редко. При первой установке Oracle АБД SYS регистрируется с помощью пароля CHANGE__ON_INSTALL. Этот пароль следует заменить, как только система Oracle инициализируется на какой-либо пароль, которым будет пользоваться администратор базы данных SYS. Для этого выполняется следующая команда: GRANT CONNECT ТО SYS IDENTIFIED BY сновый пароль SYS>; СУРБД Oracle манипулируез информацией в таблицах SYS как результатом использования базы данных. Ни одну из таблиц SYS не следует каким-либо образом изменять. (Исключение составляет таблица AUDITJTRAIL, SYSAUD$, которая может очень сильно вырасти. Вам не нужно ликвидировать эту таблицу, однако вы можете удалить из нее строки. Строки предназна¬ чаются только для информации и на работу СУРБД не влияют.) Кроме того, никому не следует добавлять таблицы к бюджету SYS. Пренебрежение к этим правилам может привести к непредсказуемым последствиям. Пользователь АБД, называемый SYSTEM Система Oracle устанавливается АБД, называемым SYSTEM и идентифицируемым паролем MANAGER. Этот пароль должен быть немедленно заменен после установки на какой-либо пароль, которым будет пользоваться АБД SYSTEM. Для этого служит следующая команда: GRANT CONNECT ТО SYSTEM IDENTIFIED BY < новый пароль SYSTEM >; Однако имейте в виду, что установка некоторых продуктов Oracle, например SQL/ Forms, требует или предполагает, чтобы паролем для АБД SYSTEM служило слово MANAGER. Администратор базы данных, называемый SYSTEM, является также владельцем некоторых таблиц и представлений, которые создаются различными утилитами Oracle. Они не должны Изменяться, и в них не следует запоминать данные пользова¬ телей. Таблица 5-1 содержит список таких таблиц и представ¬ лений. Впрочем, этот список не тождествен для различных версий Oracle. Поэтому вам следует уточнить свой список по Руководству для АБД в системе Oracle для той версии, которая
78 реализована у вас. Список в табл. 5-1 предназначается дЛя версии 6.0 Oracle. АБД SYSTEM может создавать дополнится^ ные таблицы и представления, содержащие данные общей базы данных или данные пользователя. Таблица 5-1. Таблицы и представления, которые принадлежат АБД, называемому SYSTEM HELP Утилита CRT SQL*Forms Меню SQL HELP CRT IAPTRIGGER DMU_MESSAGE , CRTBOX IAPAPP DMU_APPLICATION CRT_TYPE IAPBLK DMU_COMMAND_TYPE ESC IAPFLD MENU_INFO FUNCTIONS IAPMAP MENU-OPTION GOTO_LRC IAPSQLTXT OPTION-HELP LORC IAPTRG WORK_CLASS FUNCTONS USER_INFO PARAMETER_INFO PARAMETER-MENU Подключение по ключевому слову INTERNAL Иногда создается положение, когда у АБД возникнет надобность подключаться к базе данных с помощью ключевого слова INTERNAL. Отличие от подключения для АБД SYS состоит в том, что никакого пароля не требуется и поэтому проверка имени пользователя не будет осуществляться. Подключение по INTERNAL является привилегированной операцией SQL*DBA. Система Oracle проверит, что бюджет операционной системы, пытающейся подключиться как INTERNAL, обладает подходящим именем и привилегиями для того, чтобы использовать команды SQL*DBA. При создании базы данных вы должны подключаться как INTERNAL, потому что должны пользоваться оператором из SQL (CREATE DATABASE), однако словаря данных для выполнения проверки имени пользователя еще не существует. Пользователи, не являющиеся АБД, должны отстраняться от какого-либо подключения как INTERNAL, а
79 дБД пользоваться этим средством подключения в какое-то другое время не следует. Программа SQL*DBA Новая утилита SQL*DBA объединяет многие из утилит Oracle версии 5, в частности IOR, ODS, AIJ и CCF. Ею можно пользоваться также для выполнения любых команд SQL, хотя она и не представляет возможностей форматирования, имею¬ щихся в SQL*Plus. Она содержит команды для выполнения следующих действий: • создание базы данных; • запуск и остановка одного или нескольких экземпляров; • подключение в качестве пользователя INTERNAL; • замена текущего главного центрального процессора для выполнения функций АБД; • формирование базы данных (открытие базы данных и сопоставление с ней экземпляра); • открытие базы данных (для общего пользования); • включение или отмена архивизации; • резервирование и восстановление базы данных; • наблюдение использования базы данных; • автономная работа с табличными пространствами; • резервирование базы данных во время ее работы; • восстановление после отказа экземпляра или аппаратного средства; • вход в любую команду SQL. Некоторые из перечисленных функций являются жизненно важными для защиты базы данных и поэтому требуют исключительного уровня привилегии, который будет рассмат¬ риваться в соответствующих разделах. Чтобы активизировать SQL*DBA, вам в ответ на подсказку операционной системы необходимо ввести следующую команду: sqldba При желании вы можете также ввести в систему тип используемого терминала, например VT100, когда вы вводите аббревиатуру для распознавания типа терминала. Эти имена Распознаваемых типов используются утилитой CRT. Вы можете пользоваться SQL*DBA либо интерактивно, либо ьводя командную строку SQLDBA на уровне операционной
80 системы. При интерактивной работе вы можете ввести любой из следующих ответов на приглашение SQLDBA: « команду SQL*DBA с необязательными аргументами; • оператор SQL; , • команду для запуска командного файла. За исключением команды CONNECT, большинство команд SQL* DBA потребуют, чтобы при первой попытке подключиться к базе данных вы указывали имя пользователя и пароль. Ваши команды SQL*DBA могут занимать более чем по одной строке, если между словами вы используете обратную косую черту, для обозначения непрерывности, и если они не требуют какой-либо пунктуации или ограничителей. Системные привилегированные команды из SQL*DBA Некоторые команды из SQL*DBA являются ’’системными привилегированными". В их число входят: STARTUP SHUTDOWN CONNECT INTERNAL Для их использования вы должны располагать: (1) доступом к SQL*DBA и (2) правом употреблять привилегированные команды SQL*DBA. Всякий раз, когда вы вызываете одну из этих команд, SQL*DBA проверит наличие у вас соответствующих этому привилегий. Немногие пользователи должны обладать доступом к SQL*DBA, и еще меньшему числу пользователей следует предоставить привилегию употреблять команды STARTUP, SHUTDOWN и CONNECT INTERNAL. Если эти команды используются неверно, они могут серьезно повредить базе данных. Контроль доступа к SQL*DBA специфичен для каждой операционной системы и рассматривается в руководстве по установке и инструкции пользователю для вашей операционной системы. Ввод команд SQL Чтобы выполнить оператор языка SQL, вы должны подклю¬ читься к базе данных с подходящим именем пользователя, поскольку защита SQL применяется к любому оператору SQL. Другими словами, вы должны обладать надлежащей привиле¬ гией для выполнения этого оператора. Вы должны закончить свой оператор SQL точкой с запятой как последним символом в строке ввода.
81 Запуск командных файлов Чтобы запустить командный файл, после знака @ вы должны ввести имя файла, например: @beginday Не сопровождайте имя файла косой чертой или точкой с запятой. Если вы не специфицируете расширение файла или имя файла, то предполагается, что это SQL. Вы можете использовать командные файлы для вызова других командных файлов. Возможная глубина вложенности командных файлов специфична для операционной системы. Ввод команд с уровня операционной системы Чтобы запустить команды SQL*DBA без ввода SQL*DBA, выполняйте команду SQLDBA по командной строке. Командная строка может быть командой SQL*DBA или именем файла для запуска. Например: SQLDBA [команда="текст команды"] [TERMINAL-Tvin терминала] Замечание: Некоторые операционные системы, в частности VMS, потребуют дополнительных кавычек, если вы захотите включить кавычки в строку. SQL*DBA в распределенной среде Если у вас установлена программа SQL*Net, вы можете использовать SQL*DBA для подключения к другим базам данных или узлам сети связи. Таким образом, вы можете использовать SQL*DBA для запуска экземпляра с удаленного узла. Для этого введите SET INSTANCE, чтобы установить спецификацию базы данных того экземпляра, с которым вы собираетесь работать. Затем этот экземпляр будет служить для последующих команд STARTUP, SHUTDOWN, MONITOR, CONNECT, а также для всех операторов SQL, в которых нет явных спецификаций базы данных. Дальнейшие подробности о распределенных средах приводятся в гл. 17. Наблюдение использования базы данных с помощью Монитора Вы можете систематизировать способы работы с базой Данных, используя команду MONITOR. Она покажет вам:
82 • имена пользователей, работающих с базой данных в текущий момент; • какие программы выполняются; • какие пользователи ожидают из-за других пользователей; • накопленные статистические данные об использовании базы данных. Вы можете пользоваться меню MONITOR, введя MONITOR или можете вызвать монитор в интерактивном режиме, введя MONITOR LOCKS Меню монитора (которое появится, когда вы введете MONITOR) представлено в табл. 5-2. Таблица 5-2. Меню монитора Экран Описание Access [pid] [pid] Скрытая таблица информации Cycle <n> Цикл по множеству с интервалом в п секторов Exit Монитор выхода File IO Ввод/вывод на пофайловой основе IO [pid] [pid] Гистрограмма ввода/вывода для процесса LAtch Поддерживаемые в текущий момент защелки LOck [all] [pid] [pid] Поддерживаемые или ожидаемые замки Process [pid] [pid] Информация о процессе Rollback Статистика о сегменте обратной прокрутки SPool [имя файла/OFF] Файл регистрации стартстопных действий STatistics [class] [pid] [pid] Итоги системных действий User [pid] [pid] Информация о пользователе Введите выбранный вариант (A,C„E,F,I,LA,LO,P,R,SP,ST,U) и параметры
83 Вы можете управлять деятельностью во времени, чтобы распознавать нормальное и ненормальное использование базы данных, поскольку MONITOR обеспечивает непрерывно обнов¬ ляемое отображение работы с базой данных. Обновление происходит с интервалами, причем t по умолчанию интервал составляет 5 с. Вы можете изменить интервал, используя команду из SQL*DBA: SET CYCLE Если вы хотите послать в файл выходные данные, то можете сделать это, воспользовавшись командой из SQL*DBA: SPOOL Разнообразные статистические данные, накапливаемые про¬ граммой MONITOR, представлены в табл. 5-3 с описанием каждого вида статистических данных. Таблица 5-3. Статистические данные, накапливаемые программой MONITOR Название статистических данных Описание (когда оно не очевидно) Начала сеансов Текущие начала сеансов Накопленные открытые текущие записи Текущие открытые курсоры Пользовательские передачи Пользовательские обратные прокругки Пользовательские вызовы Рекурсивные вызовы Отосланные сообщения Полученные сообщения Фоновые ожидания событий Число обработанных операторов SQL Число отосланных сообщений ядра Число полученных сообщений ядра Число фоновых ожиданий событий
84 Таблица 5-3. Продолжение Название Описание статистических (когда оно не очевидно) данных Ожидания постановки в очередь Тупиковые ситуации в очередях Запросы на постановку в очередь Перемещения в очередях Выбытия из очередей Получения блоков базы данных Согласованные получения Физические чтения Физические записи Изменения блоков базы данных Изменение времени записи Согласованные изменения Полные ожидания записи Время ожидания записи Число событий, когда постановка в очередь тотчас не гарантировалась Число процессов, попавших в тупиковые ситуации из-за очередей Число запросов на постановку в очередь Логические чтения в варианте сиг, включая блоки непосредственного чтения Число логических чтений в согласованном варианте Число фактических чтений с диска Число фактических записей на диск Число логических изменений в блоках базы данных Астрономическое время для записи повторных действий; изменения в десятках миллисекунд Число модификаций для получения согласованных блоков чтения Число раз, когда процесс ждал сигнала от базы данных Астрономическое полное время ожидания записи в десятках миллисекунд
85 Таблица 5-3. Продолжение Название статистических данных Ожидания занятого буфера Время ожидания занятости Записи синхронных повторных действий Время синхронизации повторных действий Ожидания обменов в базе данных Тупиковые ситуации обмена Запросы свободного буфера Проверки свободного буфера Ожидания свободного буфера Время ожидания освобождения Ожидания событий в базе данных Описание (когда оно не очевидно) Число раз, когда процесс нуждался в блоке, в варианте, не совместимом с текущим использованием такого блока Общее время ожидания занятого буфера в десятках миллисекунд Число повторных действий, направленных на диск Время для выполнения вызовов синхронизации повторных действий в десятках миллисекунд Только при наличии нескольких экземпляров. Число запросов от базы данных на обмен текущими блоками, которые хэшированы применительно к одному и тому же коду Число раз, когда процесс обнаруживал потенциальные тупиковые ситуации Число раз, когда процесс нуждался в недоступном свободном блоке Число десятков миллисекунд, потраченных в ожидании свободного буфера
86 Таблица 5-3. Продолжение Название статистических данных Описание (когда оно не очевидно) Достаточная свобода базы данных Низкая свобода базы данных Контрольные точки базы данных Согласованные прогнозы Малые записи повторных действий Большие записи повторных действий Число записей повторных действий, при которых количество блоков для записи не меньше, чем пороговый объем ввода/вывода Записи повторных действий в конец Число раз, когда повторные действия были записаны вплоть до текущего буфера Распределение фрагментов Число раз, когда для записи повторных действий отводился дополнительный файл повторных действий Малые ожидания повторных действий Число ожиданий повторных действий вследствие недостаточности буферного пространства Большие ожидания повторных действий Малые отправления повторных действий Число раз, когда отправлялся процесс, ожидающий записи повторного действия, для малых записей
87 Таблица 5-3. Продолжение Название статистических данных Описание (когда оно не очевидно) Большие отправления повторных действий Число раз, когда отправлялся процесс, ожидающий записи повторного действия, для больших записей Отправления распределения фрагментов Число раз, когда процессы отправлялись как извещение о том, что распределение фрагментов было завершено Возбуждения записи повторных действий Число раз, когда запись повторных действий возбуждалась сразу, а не вследствие ожидания события Начальное создание базы данных В этом разделе описывается подготовка базы данных для использования. Необходимо "создать" базу данных, прежде чем пользователь получит доступ к ней. Эта информация применима ко всем операционным системам, за исключением специально оговоренных случаев. Базу данных необходимо создавать только один раз, неза¬ висимо от ее размера. Если вы примените оператор CREATE DATABASE к существующей базе данных, то потеряете всякие Данные, существующие в исходной базе данных. При создании базы данных возникают новые файлы базы (со стиранием любых данных в прежних файлах базы данных), пишутся начальные данные базы, которые требуются для нормаьной работы системы Oracle, а также появляются и инициализируются файлы управления и файлы регистрации Действий. Эти процедуры выполняются оператором CREATE DATABASE из SQL, но ему должны предшествовать упомянутые выше предварительные шаги. Эти шаги выполняются немного По-разному в различных операционных системах. В некоторых системах файлы создаются автоматически, тогда как в других
88 администратор базы данных должен вручную создавать или размещать файлы. Детальные подробности вы можете узнать из руководства по установке и инструкции пользователю для вашей операционной системы. 1. Регистрация в операционной системе бюджета, использу¬ емого для установки системы Oracle. Бюджет операционной системы, которым вы пользуетесь для установки Oracle, должен представлять собой бюджет администратора базы данных и включать достаточные привилегии операционной системы и правила доступа для использования всех команд из SQL*DBA, включая привилегированные команды. 2. Проверка файла INIT.ORA. Вы можете либо пользоваться по умолчанию файлом INIT.ORA, который вы получили вместе с другим программным обеспечением Oracle, либо скопировать этот файл и изменить правила умолчания, чтобы удовлетворить требованиям вашей организации. Вам следует убедиться в том, что параметры являются подходящими, поскольку некоторые из них нельзя изменить без нового построения базы данных. В частности, вам нужно проверить следующее: • Значения MAXDATAFILES, MAXLOGFILES, MAXINSTANCES должны адекватно отражать будущие потребности вашей базы данных. • Значение DB_BLOCK_SIZE должно быть точным. Значе¬ ние по умолчанию должно быть либо 2048, либо 4096 в зависимости от вашей системы. • Информация в CONTROL_FILES должна предоставлять имена файлов управления. В ней должны содержаться имена либо новых файлов управления, либо существую¬ щих файлов управления, которые будут затерты. Если содержатся файлы управления, которые должны быть затерты, то вам следует воспользоваться для оператора CREATE DATABASE вариантом CONTROLFILE REUSE. Вам нужно иметь по крайней мере два файла управления на различных устройствах. • Информация в INIT_SQL_FILES должна включать имена файлов SQL, которые служат для организации словаря данных, а также имена любых начальных объектов базы данных. Обычно вам не следует изменять значение по умолчанию за исключением случая добавления файлов. Дополнительные сведения о параметрах INIT.ORA содержатся ниже в разделе ’’Файл параметров INIT.ORA” и в приложении Б.
89 3. Убедитесь, что экземпляр по умолчанию является точным. Если это начальная реализация вашей базы данных, то данный щаг не столь важен, как в случае, когда у вас уже имеются базы данных, работающие в системе Oracle. Вам не следует использовать оператор CREATE DATABASE для уже сущест¬ вующей базы данных, потому что это приведет к потере ваших данных. 4. Введите SQL*DBA, набрав на клавиатуре SQLDBA. 5. Запустите экземпляр. Для этого вы должны воспользо¬ ваться командой STARTUP из SQL*DBA. При создании базы данных не пользуйтесь командами MOUNT или OPEN. Если вы не пользуетесь по умолчанию файлом INIT.ORA, то примените PFILE = <имя файла> 6. "Подключение" с помощью ключевого слова INTERNAL. Употребите ключевое слово INTERNAL для подключения к базе данных. Это позволит вам избежать проверки имени пользо¬ вателя. Поскольку к этому моменту база данных еще не была создана и поэтому не имела словаря данных, то вы можете осуществить подключение только с помощью слова INTERNAL. SQL*DBA обеспечит проверку того, что бюджет или id в вашей операционной системе обладают необходимыми привилегиями для подключения через INTERNAL. См. выше раздел "Подклю¬ чение через INTERNAL", где содержатся подробности о при¬ менении ключевого слова INTERNAL. 7. Создание новой базы данных. Теперь вы можете ввести оператор CREATE DATABASE из SQL. Его синтаксис приведен ниже: CREATE DATABASE <имя_базы_данных> [CONTROLFILE REUSE] [LOGFILE <специф.файла> [,<специф.файла>]...] [MAXLOGFILES <целое>] [DATAFILE <специф.файла> [,<специф.файла>]...] [MAXDATAFILES <целое>] [MAXINSTANCES <целое>] [ARCHIVELOG/NOARCHIVELOG] [SHARED/EXCLUSIVE] Как указывается квадратными скобками, все аргументы выше являются необязательными за исключением имени базы
90 данных. Система Oracle будет использовать варианты ц0 умолчанию для любого аргумента, когда вы не специфицируете некоторое значение. При желании вы можете включить команду CREATE DATABASE в какой-то файл (например, CRDB.SQL) и запустить этот файл из SQL*DBA, как в ©CRDB Приготовьтесь ожидать завершения этого этапа, потому что необходимо выполнить много промежуточных этапов. После окончания этого этапа вы можете покинуть SQL*DBA. Теперь ваша база данных создана, установлена, открыта и готова для доступа со стороны пользователя. Ваш оператор CREATE DATABASE создал следующие файлы операционной системы: • Столько идентичных файлов управления, сколько их названо в INIT.ORA. Они не могут стираться или редактироваться. Использование нескольких файлов пре¬ дохраняет от опасности любой отдельный файл управле¬ ния. • Столько файлов базы данных, сколько их специфициро¬ вано. Все они являются частью табличного пространства SYSTEM. Принцип умолчания используется, если вы не специфицируете их размер. • Столько файлов регистрации действий, сколько их спе цифицировано (по меньшей мере два). Если их размер не специфицирован, то используется значение по умол¬ чанию, принятое в вашей системе. Тем самым появляется оперативная регистрация действий. При создании вашей базы данных выполняются также следующие операции: • Создается сегмент обратной прокрутки SYSTEM в таб личном пространстве SYSTEM. • Создаются и загружаются таблицы словаря данных, принадлежащие SYS в табличном пространстве SYSTEM. Для этого выполняются команды языка SQL в файлах, названных с помощью параметра INIT__SQL__FILES из INIT.ORA. • Формируется и открывается база данных аналогично тому, как вводились операторы ALTER DATABASE MOUNT и ALTER DATABASE OPEN из языка SQL.
91 У вновь созданной базы данных имеются только два пользователя: SYS и SYSTEM. Теперь в любое время вы можете привлекать новых пользователей с любыми желаемыми при¬ вилегиями. Запуск и выключение базы данных Вы будете пользоваться программой SQL*DBA для запуска и останова вашей системы баз данных. В этом разделе рассказывается о самом простом способе запуска и останова, о запуске и выключении экземпляров, о формировании и открытии баз данных, о закрывании и расформировании баз данных и о возможных вариантах запуска систем. Запуск и выключение Обычно администратор базы данных запускает и выключает базу данных. Запуск базы данных в системе Oracle состоит из двух этапов: 1) . запуск экземпляра; 2) . формирование и открытие базы данных. Так же обстоит дело и тогда, когда вы выключаете базу данных. Выполняются следующие этапы: 1) . закрытие и расформирование базы данных; 2) . выключение экземпляра. Чтобы сформировать систему баз данных, вы всегда должны объединять две потенциально независимые единицы: экземпляр и базу данных. Всякий раз, когда программа SQL*DBA запускает некоторый экземпляр, она должна читать файл INIT.ORA. Затем в соответствии с значениями параметров создается общая область системы (ООС), которая будет соответствовать этому экземп¬ ляру в течение всего времени его работы. Затем работающий экземпляр может формировать и открывать базу данных. При желании вы можете также запустить экземпляр в варианте АБД. В таком случае к этой базе данных имеют доступ лишь администраторы базы данных. Сравнение сформированных баз данных с открытыми Для обеспечения доступа к базе данных вы должны вывести ее в оперативный режим с помощью экземпляра. Это выпол¬ няется в два этапа:
92 1) . формирование; 2) . открытие. Чтобы открыть базу данных, ее необходимо сформировать но она может быть сформирована и не будучи открыта. Следовательно, база данных может находиться в одном из трех состояний: 1. Несформирована. В этом состоянии база данных не ассоциируется с каким-либо экземпляром. Кроме того, она недоступна для любых пользователей, даже для администраторов базы данных. 2. Сформирована, но неоткрыта. В этом состоянии база данных ассоциируется с некоторым экземпляром, но к ней имеет доступ лишь администратор базы данных. Она может быть сформирована в любом варианте разделяемости или исключительности. (Вариант разделяемое™ нужен, если она будет использоваться в нескольких экземплярах, как в системах разделяемых дисков.) При таком состоянии администратор базы данных: • добавляет, ликвидирует или переименовывает файлы регистрации действий; • разрешает или запрещает архивизацию регистрационных данных для восстановления среды передачи данных (ARCHIVELOG или NOARCHIVELOG); • выполняет полное восстановление среды базы данных (перестраивает всю базу данных на основе резервирования). 3. Открыта и сформирована. Если ваша база данных открыта, то она была и сформирована. В этом состоянии она доступна для обычных операций с базой данных. Если пользователь имеет доступ к базе данных, то она всегда открыта (и сформирована). Администратор базы данных осуществляет контроль над тем, какие базы данных несформированы, сформированы и открыты. Для этого он пользуется командами STARTUP и SHUTDOWN из SQL*DBA и командой ALTER DATABASE из SQL в подходящем варианте: OPEN, CLOSE, MOUNT, DISMOUNT. Запуск экземпляра и базы данных Запуск базы данных включает следующие этапы: 1) . запуск экземпляра по команде STARTUP из SQL*DBA: 2) . формирование базы данных по оператору ALTER DATABASE из SQL
93 3). открытие базы данных по оператору ALTER DATABASE из SQL. Используя команду STARTUP из SQL*DBA, вы можете объединить эти три этапа в один. Вы можете запустить текущий экземпляр, а также сформировать и открыть базу данных всего за один этап, введя следующую команду из SQL*DBA: STARTUP OPEN < имябд > где имябд — это имя базы данных, которую вы хотите открыть (к этому времени она уже должна быть создана). Такая команда: 1) . Запускает экземпляр. Создает и инициализирует общую область системы (ООС) с помощью текущих значений пара¬ метров INIT.ORA и запускает фоновые процессы. 2) . Формирует названную вами базу данных. Находит и открывает файлы управления. 3) . Открывает сформированную базу данных. Находит и открывает файлы регистрации действий и оперативные файлы базы данных. Выполняет восстановление прямой прокруткой (повторные действия). Обеспечивает возможность протоколи¬ рования в оперативных файлах регистрации действий. Выпол¬ няет обратную прокрутку (восстановление транзакции). После завершения восстановления ваша база данных стано¬ вится открытой и доступной для обычного использования. Раздельное формирование и открытие Во время обслуживания у вас может возникнуть желание запустить экземпляр за счет раздельного выполнения этапов. Если оно возникло, выполните следующие этапы: 1) . запустите экземпляр по команде STARTUP; 2) . подключите ее как INTERNAL по команде CONNECT INTERNAL, чтобы сформировать базу данных; 3) . сформируйте базу данных (специфицировав имябд) по команде ALTER DATABASE < имябд > MOUNT; 4) . откройте базу данных. (Вам не нужно специфицировать здесь имябд, поскольку будет подразумеваться только что сформированная база данных.) ALTER DATABASE OPEN. Запуск только для администраторов базы данных Вы можете ограничить доступ к базе данных только администраторами базы данных. (Например, если вам нужно
94 удалить файл регистрации действий или изменить параметру для INIT.ORA, вы можете для выполнения этого остановить систему во время ее низкой нагрузки.) Чтобы запустить базу данных и ограничить доступ к ней администраторами базы данных, введите STARTUP DBA OPEN <имябд> Как только вы захотите вернуться к обычному режиму использования базы данных, выключите систему и запустите ее заново. Запуск с автономными табличными пространствами Когда вы открываете базу данных, все табличные простран¬ ства находятся точно в таком состоянии, в каком они были, когда база данных в последний раз закрывалась в оперативном или автономном режиме. Если хотите перевести некоторые табличные пространства в автономный режим после открытия базы данных, введите команду языка SQL: ALTER TABLESPACE стабличное пространство OFFLINE [NORMAL/IMMEDIATE] Чтобы вернуть табличное пространство в оперативный режим, введите ALTER TABLESPACE <табличное пространство> ONLINE Автоматический запуск Процедуры автоматического запуска экземпляров и баз данных сразу после начала работы системы являются специ¬ фичными для каждой операционной системы. Они описываются в вашем руководстве по установке и инструкции пользователю. Выключение экземпляра и базы данных Чтобы выключить систему базы данных, выполните следу ющие этапы: 1) . закройте базу данных оператором ALTER DATABASE языка SQL; 2) . расформируйте базу данных оператором ALTER DATABASE языка SQL; 3) . выключите экземпляр командой SHUTDOWN программы SQL*DBA. При желании вы можете объединить эти этапы в один, как
95 Л в случае запуска. Ниже объясняется, как это делается, а также вводятся некоторые другие методы выключения. Обычное выключение. Метод обычного выключения (без вариантов) состоит в том, чтобы ввести команду SHUTDOWN. Она эквивалентна команде SHUTDOWN NORMAL. Обе эти команды SHUTDOWN выполняют следующие операции: 1) . ожидают отключения подключенных в данное время пользователей; 2) . препятствуют новым подключениям; 3) . закрывают и расформировывают базу данных; 4) . выключают экземпляр. При повторном запуске (после обычного выключения) восстановление экземпляра прямой или обратной прокруткой не требуется. Немедленное выключение. Если вы не хотите ждать выхода текущих пользователей из системы, то можете воспользоваться командой: SHUTDOWN IMMEDIATE Эта команда: 1) . ожидает завершения текущих вызовов; 2) . предотвращает дальнейшие вызовы и подключения; 3) . не ожидает отключения подключенных в настоящее время пользователей; 4) . выключает экземпляр. Когда вы выполните команду SHUTDOWN IMMEDIATE, прикладные программы получат сообщение об ошибке. Текущие транзакции не могут завершиться, и для всей работы автома¬ тически осуществляется обратная прокрутка. Если вы выполня¬ ете новый запуск после команды SHUTDOWN IMMEDIATE, то при необходимости происходит восстановление экземпляра в виде прямой или обратной прокрутки. Аварийное выключение (ABORT). Это самый драматичный И быстрый вид выключения. Оно происходит без ожидания завершения текущих вызовов или подключений. Вместо этого экземпляр выключается как можно быстрее. Аварийным вы¬ ключением следует пользоваться при отказе одного из других париантов команды SHUTDOWN. Если не работает вариант SHUTDOWN NORMAL, вам не нужно пробовать применять
96 SHUTDOWN IMMEDIATE, вы можете перейти непосредственно к SHUTDOWN ABORT. При новом запуске после SHUTDOWN ABORT будет выполнено восстановление экземпляра, включающее в случае необходимости прямую и обратную прокрутку. Файл параметров INTEGRA При каждом запуске системы Oracle она читает файл параметров, которые специфицируют характеристики ее работы. Он называется файлом INIT.ORA по умолчанию. При желании вы можете переименовать его. От операционной системы зависит, где именно система Oracle будет искать этот файл. Файл INIT.ORA идентифицирует файлы, используемые системой Oracle, и контролирует ресурсы, непосредственно влияющие на производительность Oracle. В частности, он содержит параметры, которым должны быть заданы значения или имена для запуска системы, а также параметры, которые указывают число определенных элементов, запоминаемых в общей области системы (ООС). Подбирая подходящие пара¬ метры, вы можете изменять размер ООС и улучшать произ¬ водительность системы Oracle. Корпорация Oracle поставляет вам образец файла INIT.ORA на ленте версии, содержащей предлагаемые значения параметров, которые пригодны для большинства реализаций. Однако после того, как ваша система некоторое время поработает и вы ознакомитесь с Oracle, у вас может возникнут желание изменить некоторые из этих значений параметров. Распределенные значения параметров INIT.ORA могут от¬ личаться от значений по умолчанию. Эти распределенные значения перечисляются в руководстве по установке и инст¬ рукции пользователю для вашей операционной системы. Зна¬ чения по умолчанию встраиваются в код и будут использоваться в вашей системе, если в файл INIT.ORA вы не включите новые параметры. Полный список параметров INIT.ORA вместе с описаниями каждого из них и список значений по умолчанию приводятся в приложении Б. В этом списке указывается воздействие каждого из параметров на общую область системы. Чтобы при запуске экземпляра перечислить текущие зна¬
97 чения для параметров INIT.ORA, включите в файл INIT.ORA ключевое слово LIST. Переменные параметры INIT.ORA Некоторые параметры INIT.ORA просто именуют элементы, другие же устанавливают ограничения, которые воздействуют на производительность. Например, для TABLES устанавливается размер сверхоперативных таблиц (в памяти) и тем самым определяется, сколько описаний таблиц может одновременно находиться в кэш-памяти. Если описание находится в такой памяти, то производительность улучшается. Ниже представлены так называемые переменные параметры} размер ООС зависит от их значений. При настройке системы важнее всего уточнить значения именно этих параметров. Например, более высокое значение для BUFFERS обычно улучшает производительность, более низкое значение только замедляет работу, но не исключает ее. Следующие переменные параметры воздействуют на производительность, но не налагают ограничений: BUFFERS COLUMNS TABLES TABLENAMES С другой стороны, некоторые переменные параметры нала¬ гают ограничения на емкость. Например, если значение PROCESSES равно 10, то попытка зарегистрировать одиннад¬ цатый процесс окажется несостоятельной. Следующие перемен¬ ные параметры называются параметрами емкости: TABLE_ACCESSES TABLE_HANDLES ENQUEUES PROCESSES TRANSACTIONS USERS OPEN_CURSORS Увеличение переменных параметров может повысить про¬ изводительность вашей системы, но в то же время увеличивает и объем общей области системы (ООС). В операционных системах с виртуальной памятью перерасход ООС может снизить производительную эффективность, потому что ООС многократно перекачивается в память и из памяти. При Установке параметров операционной системы, управляющих рабочими областями виртуальной памяти, следует иметь в виду размер ООС.
98 Вы можете получать сообщения об ошибках, состоящих в том, что параметр слишком мал или вы достигли его максимума. Если так происходит неоднократно, вы можете остановить систему Oracle, увеличить соответствующий пара¬ метр из INIT.ORA и заново запустить Oracle. В противном случае вы можете подождать до тех пор, когда система станет посвободнее, а потом попытаться повторить операцию. То, какие параметры наиболее благоприятно воздействуют на вашу систему, зависит от нескольких характеристик базы данных, в частности от расположения ваших данных и от количества пользователей или программ, являющихся актив¬ ными в любой заданный момент времени. Поэтому для улучшения производительности вашей базы данных требуется знать вашу систему, а также понимать, что именно контроли¬ руется переменными параметрами. Параметры кэш-словаря (КС) В файле INIT.ORA все параметры кэш-словаря начинаются с букв DC. Эти кэш-элементы находятся в общей области системы. В течение короткого времени они содержат элементы из таблиц словаря данных, сами же таблицы словаря исполь¬ зуются для модификации или грамматического разбора. Затем элементы остаются в кэш-памяти, до тех пор пока не потребуется место для более новых элементов. Подходящий размер кэш-памяти будет способствовать улуч¬ шению производительности грамматического разбора операто¬ ров SQL. Поэтому размеры кэш-блоков должны быть достаточно велики для помещения в них рабочего множества наиболее часто упоминаемых объектов, чтобы не потребовалась посто¬ янная регенерация кэш-памяти. Параметры общей кэш-памяти (GC) Данные параметры (все с префиксом GC) предназначены в первую очередь для разделяемых дисковых систем. Установки для этих параметров определяют размер общего набора замков, которые защищают буферы базы данных во всех экземплярах. Эти установки воздействуют на использование определенных ресурсов операционной системы.
99 Параметры, зависящие от операционной системы Корректные диапазоны или значения для некоторых пара¬ метров зависят от главной операционной системы. Например, параметр DB_BLOCK_BUFFERS указывает число буферов дан¬ ных в основной памяти. Однако размер этих буферов зависит от системы. Зависимые параметры Значение такого параметра выводится из значений, приня¬ тых для других параметров. Единственное значение по умол¬ чанию для зависимого параметра выводится из значений по умолчанию других параметров. Если вы изменяете значение зависимого параметра, то новое значение, используемое вами, будет замещать вычисленное значение. Включение и исключение пользователей После создания базы данных включение и исключение пользователей является, возможно, наиболее частыми действи¬ ями администратора базы данных (АБД). АБД может предо¬ ставить другим пользователям привилегии относительно базы данных Oracle, а также отменять или изменять эти привилегии. Предоставление доступа к базе данных является одной из функций АБД по защите, и поэтому эта тема рассматривается в гл. 12 вместе с другими вопросами защиты. Восстановление базы данных Администратор базы данных несет ответственность за подготовку к возможному отказу системы. В случае такого отказа необходимо быстро восстановить базу данных, чтобы предотвратить потери или хотя бы ограничить их размер. Существует несколько различных типов отказов, причем для каждого из них требуются особые меры предосторожности. Хотя может показаться желательным принятие шагов для Предотвращения или исправления любого возможного отказа, Все же необходимо идти на компромисс между защитой базы Данных и неимоверными затратами на операции и поддержку. По -видимому, путь к эффективности лежит если не в предви¬ дении типа каждого отказа, то по крайней мере в обладании стратегией восстановления на случай всякого отказа. Система
100 Oracle обеспечивает несколько средств восстановления, напри¬ мер: • программы экспорта/импорта; • команды ARCHIVELOG из SQL*DBA и RECOVER; • автоматическое восстановление экземпляра при запуске базы данных; • дополнительная защита восстановления среды. Эти средства предоставляют следующие возможности: • восстановление (после отказов) системного программного обеспечения или аппаратуры; • оперативное резервирование и восстановление частей базы данных; • восстановление одиночного табличного пространства при одновременном сохранении работоспособности остальной части базы данных; • гибкость конфигурирования структур восстановления; • минимальное приращение административных задач для подготовки на случай отказа носителей данных; • контроль времени восстановления, требуемого в случае отказа системы. В последующих четырех разделах обсуждаются отказы операторов, процессов, экземпляров и носителей данных, а также соответствующие восстановления. Отказ оператора В случае отказа оператора пользователю или администратору базы данных предпринимать каких-либо ответных действий почти не требуется. Такой отказ является следствием некоторого логического несовершенства, выявившегося при исполнении оператора в программе на языке Oracle. При этом либо программное обеспечение Oracle, либо сама система возвратит код ошибки или специальное сообщение об ошибке. Затем автоматически осуществляется обратная прокрутка результатов выполнения оператора до передачи управления пользователю или в программу пользователя. Можно написать такую прикладную программу, которая будет реагировать на подобные ошибки, или же пользователь может просто откорректировать возникшую проблему и выпол¬ нить оператор снова.
101 Отказ процесса Подобный отказ обычно не требует какого-либо вмешатель¬ ства со стороны администратора базы данных. Это отказ в пользовательском процессе доступа к системе Oracle, связанный с ненормальным отключением, завершением или особой ситу¬ ацией адресации. Экземпляр может продолжать работать не¬ смотря на нарушение процесса. В таком случае фоновый процесс PMON обнаруживает отброшенный процесс и автоматически решает проблему обратной прокрутки транзакции процесса и освобождения всех ресурсов, использовавшихся процессом. Отказ экземпляра Когда возникает проблема, препятствующая продолжению работы экземпляра, она называется отказом экземпляра. Эта проблема может быть обусловлена аппаратурой (выходом из строя) или программным обеспечением (порчей операционной системы), или же это может быть отказ программного обеспечения. Наиболее типичный признак отказа экземпляра состоит в прекращении одного или нескольких фоновых процессов - DBWR, LGWR, DBRD, ARCH, SMON или PMON. Этот тип отказа может потребовать вмешательства админист¬ ратора базы данных с целью восстановления экземпляра. Если вы работаете в системе с неразделяемым диском или в случае отказа всех экземпляров, разделяющих диск, админи¬ стратору базы данных следует лишь ликвидировать и запустить, экземпляр заново, поскольку восстановление экземпляра про¬ изводится автоматически при каждом запуске экземпляра. Однако если у вас имеется система с разделением диска и произошел отказ одного экземпляра (причем остался хотя бы один все еще работающий экземпляр), то любой действующий экземпляр может обеспечить восстановление отказавшего эк¬ земпляра. Отказ носителя данных Иногда при попытке писать или читать файл, требующийся для работы базы данных, может возникнуть неустранимая ошибка. Поломка головки дисковода может привести к потере всех данных, заполняющих диск. Отказ носителя данных может воздействовать на несколько файлов, в том числе на файлы регистрации, управления и базы данных, соответствующие
102 табличному пространству SYSTEM или другим табличным пространствам. Стратегия восстановления данных будет зависеть от того, какие файлы затронуты. Типы восстановления Существуют два типа действий, требуемых для восстанов¬ ления данных: • прямая прокрутка проверяет, что согласованные транзак¬ ции и включенные в базу данных изменения были действительно записаны в базу данных; • обратная прокрутка проверяет,! что никогда не согласо¬ вавшиеся транзакции были удалены из базы данных. Вместо того чтобы при вводе транзакций непосредственно изменять много блоков базы данных, СУРБД Oracle запоминает измененные блоки во временном рабочем пространстве, которое называется буферным пулом базы данных. Буферы могут содержать как согласованные, так и несогласованные данные. Буферы должны записываться на диск, однако для экономии ввода/вывода это делается лишь эпизодически. (Используется алгоритм LRU по принципу ’’самого давнего использования", при котором буферы, которые не использовались дольше всех других, в первую очередь пишутся в базу данных независимо от того, были они согласованы или нет.) При обычном завершении транзакции измененные блоки пишутся в базу данных автоматически, а протоколирование изменений в файлах регистрации действий происходит тогда, когда эти изменения согласуются. Причем всякие прокрученные назад данные устраняются из буферов и файлов базы данных. Впрочем, в случае ненормального окончания транзакция при¬ останавливается. Это может привести к следующим результатам: • Если транзакция не была завершена, то в силу алгоритма LRU база данных могла содержать несогласованные данные. Эти данные должны быть исключены из базы данных. • Если транзакция завершена, но модифицированные блоки не были переписаны в базу данных, то файл регистрации действий содержит согласованные данные, которые нужно переписать в базу данных. Для решения этих проблем в системе Oracle используются две структуры:
103 • регистрация действий, она служит для прямой прокрутки транзакций, состоящих из данных, которые не были переписаны; • сегменты обратной прокрутки, которые служат для обратной прокрутки несогласованных данных. Прямая прокрутка при регистрации действий "Повторение" всех ранее введенных изменений называется прямой прокруткой. Регистрация действий производится в наборе файлов операционной системы, в которой протоколи¬ руются все произведенные в базе данных изменения независимо от того, согласованы ли они и выполнена ли для них обратная прокрутка. Во время восстановления файла регистрации все регистрационные изменения применяются к базе данных. При прямой прокрутке файлы регистрации действий служат для возврат^ базы данных в то состояние, в котором она находилась в некоторый заданный момент времени теперь или раньше. Обратная прокрутка с сегментами обратной прокрутки В дополнение к прямой прокрутке следует устранить все изменения, которые не были согласованы. Сегменты обратной прокрутки представляют собой части базы данных, в которых представляются еще не согласованные изменения. Они служат для идентификации и отмены транзакций, которые находились в активном состоянии в момент отказа. Сегменты обратной прокрутки обеспечивают автоматическое восстановление. Оно происходит тогда, когда некий экземпляр запускается как часть восстановления экземпляра. СУРБД Oracle произведет идентификацию тех сегментов, которые содержат несогласованные данные. За счет комбинирования файлов регистрации действий сегментов обратной прокрутки последо¬ вательно выполняется восстановление, после которого база Данных переходит в согласующееся состояние. Восстановление экземпляра Для восстановления экземпляра администратор базы данных Должен только запустить экземпляр, после этого восстановление Происходит автоматически. Оно требуется, когда экземпляр не Может продолжать работу. Обычно отказ экземпляра происходит По следующим причинам:
104 • отказ ЦПУ; • порча операционной системы; • потеря мощности (обесточивание); • отказ фонового процесса. Если экземпляр прекращает работу, то остановите экземпляр Oracle по команде SHUTDOWN из SQL*DBA, используя в случае необходимости указание IMMEDIATE или ABORT. Затем заново запустите экземпляр по команде STARTUP. В результате начинается процесс восстановления экземпляра. Если отказ экземпляра происходит часто и вследствие отказа одного из фоновых процессов, то ищите файлы, генерируемые этим процессом. Место нахождения этих файлов указывается параметром BACKGROUND_DUMP_DEST из INIT.ORA, а содержание файлов может подсказать вам причину отказа процесса. Восстановление носителя данных Временные проблемы в аппаратном или программном обеспечении операционной системы могут вызвать отказ при чтении или записи файлов. Он называется отказом носителя данных. Для выполнения восстановления данных вы должны иметь • резервные копии файлов базы данных из "группы риска”; • архивизированные (автономные) файлы регистрации дей¬ ствий, начиная с точки резервирования. Этапы восстановления носителя данных включают прямую и обратную прокрутку, а также восстановление экземпляра. Но восстановление носителя данных должно начинаться в более ранний момент времени и поэтому может потребовать наличия более старых файлов регистрации действий, а таких оператив¬ ных файлов может и не быть. Поэтому регистрация действий должна использоваться в варианте ARCHIVELOG, чтобы опе¬ ративные файлы регистрации действий сохранялись автономно. Восстановление базы данных Целесообразно периодически резервировать представитель¬ ный набор файлов базы данных, когда опа не находится в оперативном режиме Представительное резервирование вклю¬ чает все файлы базы данных, все оперативные файлы регист¬ рации и все файлы управления. В таком случае восстановление базы данных (например, в случае потери файла регистрации
105 действий) вернет базу данных в нужное состояние, как и архивизация конкретного файла. Контрольные точки Контрольные точки возникают автоматически. Администратор базы данных может управлять частотой появления контрольных точек, устанавливая число блоков регистрации действий с помощью параметра LOG_CHECKPOINT_INTERVAL из INIT.ORA. Меньшие значения этого параметра будут сокращать время^ требуемое для восстановления после отказа, но будут увеличи¬ вать частоту контрольных точек и соответствующие накладные расходы. Контрольные точки будут • уменьшать время, необходимое для восстановления эк¬ земпляра; • готовить оперативный файл регистрации действий для архивизации или повторной записи. Контрольные точки позволяют гарантировать, что все блоки, которые модифицировались до последней контрольной точки, действительно переписаны на диск. Они появляются после того, как записано указанное число блоков регистрации действий, и тем самым служат в качестве промежуточной точки для восстановления. Все изменения вплоть до контрольной точки сохраняются, и поэтому восстановление требуется лишь для отмены тех изменений, которые произошли после контрольной точки. Контрольные точки позволяют также заново использовать файлы регистрации действий. Всякий раз, когда файл регист¬ рации действий заполняется до конца, возникает контрольная точка. В варианте NOARCHIVELOG контрольная точка должна возникнуть, а файл регистрации должен быть архивизирован До того, как можно будет заново использовать этот файл. Выполнение резервирования Для восстановления после отказа носителя данных вам требуется хотя бы одно из двух • отображающее оперативное или автономное резервирова¬ ние той части базы данных, которую вы хотите восстано¬ вить, и регистраций со ссылками на даты резервирования; • исчерпывающее резервирование всех файлов базы данных.
106 Отображающим резервированием называется поблочное ко. пирование файла. Сопоставьте его с резервированием, ripH котором блоки читаются и пишутся в разных форматах. Исчерпывающее резервирование осуществляется тогда, к-гда база данных не находится в оперативном режиме. Оно включает все файлы базы данных, все оперативные файлы регистрации и все файлы управления. Вы можете резервировать всю базу данных, когда она закрыта, и затем использовать результат резервирования для возврата базы данных в то же состояние. Это можно осуществить следующими этапами: 1) . выключение экземпляра; 2) . копирование всех файлов базы данных, оперативных файлов регистрации и файлов управления с применением утилиты резервирования из вашей операционной системы; 3) . повторный запуск экземпляра. Вы можете обеспечить резервирование и при открытой базе данных, однако такое резервирование полезно для восстанов¬ ления только текущего состояния базы данных и не может помочь восстановить ее прежнее состояние. Тем не менее резервирование открытой базы данных позволяет пользователям иметь во время резервирования обычный доступ ко всем табличным пространствам. Для резервирования открытой базы данных выполните следующие действия: 1. Если табличное пространство, которое содержит подлежа¬ щие резервированию файлы, находится в оперативном режиме, то введите оператор языка SQL: ALTER TABLESPACE <табличное пространстве^ BEGIN BACKUP Если табличное пространство находится в автономно i режиме, то приведенный выше оператор вводить не нужно. 2. Используя утилиту резервирования из вашей операцион¬ ной системы, скопируйте файл (файлы) для этого табличного пространства. 3. Введите оператор языка SQL: ALTER TABLESPACE стабличное пространство> BEGIN BACKUP Необходимо использовать оба оператора ALTER. В против¬ ном случае резервирующее копирование данных может ока¬
107 заться некорректным и/ил и СУРБД Oracle может неверно принять решение, что необходимо восстановление носителя данных, И может потребовать использование автономной регистрации. Экспорт/Импорт Утилиты экспорта/импорта могут служить для восстанов¬ ления, но из-за ряда своих ограничений они полезны в основном для архивизации и перемещения базы данных Oracle с одного устройства на другое. Экспорт С помощью утилиты Export вы можете переносить данные на файл операционной системы, с одного ЦПУ на другое или между двумя версиями программного обеспечения Oracle. Вы (как администратор базы данных) можете экспортировать все данные в базу данных или же можете специфицировать лишь те таблицы, которые были обновлены после последнего экспорта, все таблицы для одного пользователя, только описания таблиц, передачи, представления, кластеры или индексы. Тем самым обеспечивается значительная гибкость при решении того, что нужно экспортировать. Вы можете экспортировать только из работающей базы данных, а экспортируемые вами файлы редактироваться не могут. Если вы хотите экспортировать чтение исчерпывающего представления всех таблиц, используемых в прикладной про¬ грамме, вам следует осуществлять экспорт, когда пользователи не имеют доступа к таблицам, либо путем временной отмены привилегий для таблиц, либо путем эксплуатации базы данных только в режиме АБД. В рамках регулярной процедуры резервирования вам следует выполнять полный экспорт базы данных. Тем самым будут сохранены все табличные данные и описания, относящиеся к определенному моменту времени, в формате, который пригоден только для Oracle (поскольку логическая копия данных при обратном импорте в Oracle могла бы оказаться на совсем Другом месте). Заметим, что это несколько отличается от отображающего резервирования, упомянутого в разделе ’’Вос¬ становление носителя данных". Приращающий экспорт будет резервировать только те объ¬ екты, которые были обновлены после последнего экспорта
108 какого-нибудь типа. Накопительный экспорт резервирует та^ лицы, которые были обновлены после последнего накопитель, ного или полного экспорта базы данных. Он может служить для упаковки несколькиих файлов приращающего экспорта в меньшем количестве файлов. Импорт Утилита Import читает файлы, созданные утилитой Export и пишет данные обратно в базу данных. Вы можете принять решение, какие именно данные импортировать из экспортиро¬ ванного файла. Импорт может пригодиться при выполнении полного восстановления базы данных. Вы можете осуществить такое восстановление посредством следующих этапов: 1) . перевод в оперативный режим всех экспортных файлов, которые вы хотите импортировать; 2) . закрытие базы данных; 3) . выключение всех экземпляров, имеющих доступ к базе данных; 4) . в случае необходимости редактирование файла INIT.ORA; 5) . создание базы данных по команде CREATE и сохранение ее в открытом состоянии; 6) . импорт желаемого экспортного файла (файлов). Другие типы восстановления рассматривались в разд. "Вос¬ становление носителя данных". Ревизия Ревизия представляет собой такую функцию администратора базы данных, к которой могут обращаться и другие пользова¬ тели. Она рассматривается в разд. "Ревизия" из гл. 12 в рамках обсуждения защиты. Заключение В этой главе объясняются некоторые принципиальные задачи администраторов базы данных SYS и SYSTEM. К их числу относятся открытие бюджета операционной системы, подклю¬ чение в виде INTERNAL, использование программы SQL*DBA, управление работой с базой данных, начальное создание базы данных, запуск и выключение базы данных, использование параметров из INIT.ORA, обеспечение восстановления базы данных при любом типе отказа, экспорт/импорт и ревизия.
6 Языки SQL и SQL*Plus Язык структурированных запросов (SQL) обеспечивает интер¬ фейс между пользователем и базой данных Oracle. Первоначаль¬ но он был описан группой из исследовательской лаборатории IBM в Сан-Хосе, шт. Калифорния. Он является одновременно языком интерактивных запросов и языком программирования баз данных. В этой главе обсуждаются его интерактивные свойства, а в гл. 14 рассматривается его применение в качестве языка программирования. SQL*Plus — это интерактивный, управляемый командами интерфейс с системой Oracle, используемый для запросов и написания отчетов. Он разрабатывался корпорацией Oracle и впервые появился в виде версии 5 системы Oracle, заменив "дружественный к пользователю интерфейс” (UFI) из прежних версий Oracle. Язык SQL Язык SQL состоит из операторов четырех основных типов: • операторы определения данных (ООД); • операторы манипулирования данными (ОМД); • запросы; • операторы управления данными (ОУД). Первые три типа применяются всеми пользователями для создания и поддержания базы данных, а четвертый используется
110 преимущественно администратором базы данных. Все четыре типа описываются ниже. Операторы определения данных (ООД). Такие операторы как CREATE TABLE, CREATE VIEW, CREATE SYNONYM’ ALTER TABLE, DROP TABLE, DROP VIEW, DROP SYNONYM и DROP INDEX, служат для установки и поддержания базы данных. Синтаксис и применение этих операторов объясняются в гл. 7. Операторы манипулирования данными (ОМД). Такие опе¬ раторы, как INSERT, DELETE и UPDATE, служат для изменения данных в базе данных. Синтаксис и применение этих операторов объясняются в гл. 7. Запросы. Для восстановления данных из базы данных необходимо использовать запрос. Запросы всегда начинаются с зарезервированного слова SELECT, за которым следуют желаемая информация и имена содержащих ее таблиц или представлений. Запросы не изменяют данных. Принципы синтаксиса и примеры запросов представлены в гл. 9. Операторы управления данными (ОУД). Такие операторы, как GRANT CONNECT, REVOKE, COMMIT, ROLLBACK, LOCK TABLE и AUDIT, управляют доступом к данным к базе данных и определяют, как, когда и кем может осуществляться ма¬ нипулирование данными. Употребление операторов GRANT CONNECT, REVOKE и AUDIT и их синтаксис описываются в гл. 5; посвященной обязанностям администратора базы данных. Команда LOCK TABLE и все другие команды "запирания и отпирания" представлены в гл. 13. Операторы COMMIT и ROLLBACK объясняются в гл. 12. Типы данных Язык SQL в системе Oracle поддерживает типы данных, объединенных в табл. 6-1. Таблица 6-1. Типы данных в системе Oracle Имя Описание CHAR Столбцы могут содержать буквы алфавита, цифры и любые специальные символы. Данные CHAR хранятся в строках переменной длины, состоящих из значений в коде ASCII
Ill Таблица 6-1. Продолжение Описание или EBCDIC. Длина столбца CHAR выбирается при создании таблицы; максимальная длина = 255 VARCHAR То же, что и CHAR. В будущих версиях Oracle описание может измениться date LONG NUMBER Raw или long raw Поля даты могут содержать только реальные даты, начиная с 1 января 4712 г. до н. э. и кончая 31 декабрем 4712 г. н. э. Когда вы выводите изображение поля даты, оно появляется в стандартном формате ДД-ММ-ГГ Тип данных LONG включает более 255 символов. Это специальный вариант типа CHAR. В столбце с типом LONG может храниться строка символов переменной длины вплоть до 65 535 символов. На одну таблицу допускается не более чем один тип данных LONG Столбцы NUMBER могут содержать только цифры от 0 до 9 и в качестве опции знак минус. У вас имеется возможность выбора максимальной ширины и числа десятичных позиций для числового поля с помощью указания NUMBER (w,d), где w — ширина, ad — число десятичных позиций Служит для исключения из интерпретации системы Oracle байтовых данных. Тип RAW аналогичен типу данных CHAR, а тип LONG RAW — типу LONG с той разницей, что не делается никаких предположений относительно значения байтов. Эти типы предназначены для двоичных данных или байтовых строк, например для хранения последовательностей графических символов
112 Помимо типов данных системы Oracle, команды языка SQL CREATE TABLE... CREATE CLUSTER... допускают также типы данных из программных продуктов SQL/DS и DB2 фирмы IBM и обеспечивают их внутреннее преобразование в типы данных системы Oracle, как показано в табл. 6-2. В табл. 6-3 показаны все команды языка SQL и приводятся краткие описания каждой из них. Употребление этих команд объясняется в гл. 7 — 9. Таблица 6-2. Преобразование типов данных пакета SQL/DS в типы данных системы Oracle Тип данных пакета SQL/DS Тип данных системы Oracle SMALLINT NUMBER INTEGER NUMBER DECIMAL(m,n) NUMBER(m,n) FLOAT NUMBER VARCHAR(n) VARCHAR(n) LONG VARCHAR LONG GRAPHIC Нет соответствующего типа данных VARGRAPHIC То же LONG VARGRAPHIC То же Таблица 6-3. Обзор команд языка SQL Команда Описание /*...* / Комментарий внутри или до команды языка SQL ALTER CLUSTER Переопределяет параметры хранения кластера ALTER DATABASE Открывает/закрывает, формирует/ расформировывает, вводит/отменяет
113 Таблица 6-3. Продолжение Команда Описание ALTER INDEX alter ROLLBACK SEGMENT ALTER SEQUENCE ALTER TABLE ALTER TABLESPACE ALTER USER AUDIT COMMENT COMMIT CREATE CLUSTER архивизацию, добавляет/ ликвидирует файл регистрации и переименовывает базу данных Заново определяет будущее распределение памяти для индекса Заново определяет будущее распределение памяти для сегмента обратной прокрутки Заново определяет генерацию последовательности Добавляет столбец к существующей таблице или заново определяет в ней столбец Автономно или оперативно выделяет табличное пространство, устанавливает начало/конец резервирования, добавляет/переименует файл, изменяет место хранения Изменяет пароль пользователя, по умолчанию табличное пространство и по умолчанию временный сегмент Обеспечивает использование системой Oracle таблицы, представления, синонима или системного средства в целях ревизии Включает в словарь данных комментарий о таблице или столбце Делает постоянными те изменения, которые внесены в базу данных после последней команды COMMIT Создает кластер, который может содержать две таблицы или более
114 Таблица 6-3. Продолжение Команда Описание CREATE DATABASE CREATE DATABASELINK CREATE INDEX CREATE ROOLBACK SEGMENT CREATE SEQENCE CREATE SYNONYM CREATE TABLE CREATE TABLESPACE CREATE VIEW DELETE DROP DROP ROLLBACK SEGMENT DROP SEQUENCE DROP TABLESPACE GRANT Создает экземпляр базы данных Создает связь с именем пользователя в удаленной базе данных Создает индекс для таблицы Создает сегмент обратной прокругки в табличном пространстве Создает последовательность, пригодную для генерации первичных ключей Создает синоним для имени таблицы или представления Создает таблицу и переопределяет ее столбцы и другие особенности Создает в базе данных область для хранения таблиц Определяет представление для одной или нескольких таблиц и/ил и других представлений Удаляет из таблицы строки Удаляет из базы данных кластер, индекс и т. д. Ликвидирует в табличном пространстве сегмент обратной прокругки Ликвидирует последовательность для генерации первичного ключа Ликвидирует табличное пространство Создает идентификаторы пользователей, присваивает пароли, передает пользователям привилегии доступа к системе Oracle, таблицам и представлениям
115 Таблица 6-3. Продолжение Команда Описание INSERT LOCK TABLE NOAUDIT [RENAME REVOKE ROLLBACK AVEPOINT ELECT ET TRANSACTION EAD ONLY PDATE ALIDATE INDEX Добавляет к таблице или представлению новые строки Для таблиц устанавливается замок, что позволяет пользователю распределять доступ к ней, сохраняя ее целостность Частично или полностью изменяет действие предыдущей команды AUDIT или вариантов ревизии в таблице, используемой по умолчанию, прекращает в системе Oracle ревизию использования таблицы, представления, синонима или системного средства Изменяет имя таблицы, представления или синонима Отменяет у пользователя привилегии доступа к базе данных или таблице Отменяет все изменения, произведенные после начала прокрутки Устанавливает точку, до которой вы можете произвести обратную прокрутку Выполняет запрос, выбирает строки или столбцы из одной или нескольких таблиц Начинает чтение транзакции Изменяет значение полей в транзакции Проверяет целостность индекса таблицы
116 Пакет SQL*Plus SQL*Plus представляет собой интерфейс, разработанный корпорацией Oracle для работы с базой данных Oracle. С его помощью вы можете • создавать таблицы в базе данных; • запоминать информацию в таблицах; • изменять информацию в таблицах; • восстанавливать информацию в выбранной вами форме; • выполнять вычисления над восстановленной вами ин¬ формацией; • новыми способами комбинировать восстановленную вами информацию; • поддерживать базу данных. На языке SQL*Plus легко писать и читать команды, в то же время он достаточно выразителен, чтобы удовлетворять потребности пользователей, имеющих некоторый опыт работы с базами данных. В программу на языке SQL*Plus можно вводить команды с клавиатуры, затем она выполняет их средствами Oracle и форматирует результаты в соответствии с вашими спецификациями. В табл. 6-4 приводится обзор команд языка SQL*Plus и даются их описания. Таблица 6-4. Обзор команд языка SQL*Plus Команда Описания @ Запускает файл команд # Заканчивает последовательность строк комментария, начатую командой DOCUMENT $ Выполняет командную строку главной операционной системы, не покидая SQL*Plus. Эквивалентна команде HOST / Запускает команду на буфере SQL APPEND Присоединяет текст к концу текущей строки в текущем буфере BREAK Выбирает, какие события будут вызывать прерывания и какие действия SQL необходимо выполнить в случае прерывания
117 Таблица 6-4. Продолжение Команда Описания BTITLE Побуждает пакет SQL изображать заголовок внизу каждой страницы отчета CHANGE Изменяет содержимое текущей строки в текущем буфере CLEAR Очищает описания прерываний, текущий текстовый буфер, описания столбцов и т. д. COLUMN Выбирает способы форматирования столбца и заголовка столбца в отчете COMPUTE Выполняет вычисления на группе выбранных строк CONNECT Регистрирует выход из системы Oracle и возврат в нее указанного имени пользователя DEFINE Описывает пользовательскую переменную и присваивает ей символьное значение DEL Удаляет текущую строку из текущего буфера DESCRIBE Изображает краткое описание таблицы DISCONNECT Передает в базу данных незаконченную работу, регистрирует ваше отключение от системы Oracle, но не завершает работу SQL*Plus DOCUMENT Начинает блок документации в командном файле. (Не может употребляться в программах) EDIT Вызывает текстовый редактор в стандарте главной системы для контекста текущего буфера или файла EXIT Завершает работу SQL*Plus и передает управление в операционную систему GET HELP Загружает файл в текущий буфер Изображает информацию о команде языка SQL или SQL*Plus HOST Выполняет командную строку главной операционной системы, не прекращая работу SQL. Команда эквивалентна ”$”
118 Таблица 6-4. Продолжение Команда Описания INPUT Добавляет новые строки после текущей строки в текущем буфере LIST Перечисляет строки в текущем буфере NEWPAGE Направляет буферизированные выходные данные в начало следующей страницы. Вышедшая из употребления команда PAUSE Изображает сообщение, затем ожидает нажатия вами клавиши возврата QUIT Завершает работу SQL*Plus и передает управление в операционную систему. Синоним для EXIT REMARK Начинает замечание в программе ROLLBACK Прокручивает обратно (сбрасывает) те изменения, которые были внесены в используемую по умолчанию базу данугмх, после того как в последний раз были переданы изменения RUN Изображает и выполняет команду в буфере SQL SAVE Сохраняет содержимое текущего буфера (программа или команда на языке SQL) в базе данных или в файле операционной системы SET Устанавливает указанное значение для системной переменной SHOW Изображает установку системной переменной или такого свойства SQL*Plus, как номер текущей версии SPOOL Управляет буферизацией (копированием) изображаемых выходных данных в системном файле и на системном принтере SOLPLUS Системная команда. Запускает SQL*Plus START Выполняет содержимое командного файла
119 Таблица 6-4. Продолжение Команда Описания TIMING Проводит анализ производительности для команд на языке SQL или программ на языке SQL*Plus * TTITLE Изображает средствами SQL заголовок вверху каждой страницы выходных данных UNDEFINE Удаляет описание пользовательской переменной Как и сама система Oracle, пакет SQL*Plus может работать в различных типах систем. Информацию, относящуюся к вашему головному компьютеру, вы найдете в руководстве по установке Oracle и инструкции пользователю, выпущенных корпорацией Oracle для вашего оборудования. Чтобы запустить пакет SQL*Plus, введите SQLPLUS после приглашения от вашей операционной системы и нажмите клавишу возврата. После этого SQL*Plus предложит вам ввести имя вашего пользователя и пароль. Затем появится приглаше¬ ние от SQL*Plus SQL> Пакет SQL*Plus будет принимать команды как на языке SQL, так и на языке SQL*Plus. Синтаксис команд SQL в SQL* Plus Все команды SQL должны заканчиваться точкой с запятой (;). Вы можете ввести свою команду в одной строке или в стольких строках, в скольких пожелаете, с тем единственным условием, чтобы отдельные слова не разбивались на части при переносе с одной строки па другую. Если ваша команда занимает более одной строки, то пакет SQL*Plus будет подсказывать вам следующую строку, вводя 2 (для строки 2), затем 3 (для строки 3) и т. д., пока вы не завершите команду точкой с запятой. Слова в команде SQL должны быть разделены по Крайней мере одним пробелом.
120 В языке SQL*Plus иногда существенно, используете ли вы при формировании своей команды SQL прописные или строчные буквы. Возникнут различные ситуации, если ВЬ1 введете • значение CHAR (последовательность символов, которые должен обработать пакет SQL*Plus). Если вы вводите команду, предписывающую пакету SQL*Plus изобразить в качестве заголовка значение CHAR "Годовой отчет", то он будет отличаться от "ГОДОВОЙ ОТЧЕТ" и от "годовой отчет". Поэтому, выражая значение CHAR, вы должны использовать прописные и строчные буквы точно в той форме, в которой хотите их появления. • имя пользователя "МЭРИ", "Мэри" и "мэри" — это три разных имени пользователя. То же самое верно для паролей: прописные буквы не заменяются строчными в именах пользователей и паролей. Шрифт не окажет влияния, когда вы вводите • имя таблицы, столбца или другого объекта в базе данных. "СЛУЖАЩИЙ", "Служащий" и "служащий" — это одна и та же таблица в базе данных. • имя зарезервированного слова. Такие зарезервированные слова, как SELECT и FROM, могут записываться в любой комбинации прописных и строчных букв, например "SELECT", "Select" или "select". Синтаксис команд языка SQL*Plus Синтаксис команд SQL*Plus несколько отличается от син¬ таксиса команд SQL. 1. Обычно команда языка SQL*Plus вводится одной строкой. Однако если вы достигаете конца строки, не закончив команду, то можете продолжить в следующей строке, но не нажимайте клавишу возврата. Вместо этого вводите дефис (-) в конце каждой строки, кроме последней. Вам следует нажимать возврат только в том случае, если вы уже закончили всю команду независимо от того, сколько строк она занимает. Тем не менее вы должны вводить дефис в конце всякой строки, которая не является концом команды. 2. Вам нет надобности заканчивать команду языка SQL*Plus точкой с запятой, хотя вы можете поставить ее в конце. 3. Вы обязаны завершить команду языка SQL*Plus нажатием клавиши возврата.
121 редактирование команд языка SQL В табл. 6-5 перечислены некоторые команды редактирования, которые могут служить для проверки, изменения или повтор¬ ного запуска команд языка SQL без их повторного ввода. Таблица 6-5. Некоторые команды редактирования языка SQL*Plus Команда Сокращение Назначение APPEND текст Атгкст Добавляет текст в конец строки CHANGE С/старый/новый/ Заменяет в строке старый текст на новый CHANGE С/текст/ Удаляет из строки текст CLEAR BUFFER CL BUFF Удаляет все строки DEL (отсутствует) Удаляет строку INPUT I Добавляет неопределенное число строк INPUT Ттекст Добавляет строку, состоящую из текста LIST L Перечисляет все строки в буфере SQL LIST n L п Перечисляет указанную строку LIST m n L т п Перечисляет строки от т до п RUN R Заново запускает текущую команду на языке SQL SAVE SAV Сохраняет содержимое текущего буфера в файле главной системы Исправление ошибки Если при вводе команды вы допустили ошибку, то восполь¬ зуйтесь клавишей отхода на один символ, чтобы стереть его и заново введите нужный символ. Если же вы уже нажали клавишу
122 возврата, то клавиша отхода не устранит ошибку. В том случае если ошибка содержится в команде языка SQL, воспользуйтесь командами редактирования, представленными в табл. 6-5. Если в команде языка SQL*Plus допущена ошибка, то точно введите эту команду заново. Команды редактирования особенно полезны при исправле¬ нии ошибок набора или при модификации введенного вами запроса. Когда вы вводите команду языка SQL, пакет SQL *Plus запоминает ее на буфере, и она хранится там, пока вы не введете другую команду. Такая запомненная команда называется ’’текущей командой SQL". Все команды редактирования, кроме команд LIST и RUN, воздействуют на одну строку на буфере. Эта строка называется текущей строкой и помечается звездочкой, когда перечисляется текущая команда. Например, если вы хотите изобразить на экране содержимое буфера SQL, то введите LIST после подсказки от SQL (SQL>). Тогда пакет SQL*Plus возвратит следующую информацию (где показаны номера подсказок от SQL*Plus, так что мы можем проставлять звездочку за номером строки): SQL> LIST 1 SELECT ★ 2 FROM СЛУЖАЩИЕ 3* WHERE ТОРОГОВЕЦ = 432 Звездочка после номера строки 3 означает, что последняя является текущей строкой. Если в этот момент вы вводите команду CHANGE, то изменение повлияет на данную строку. Любые точки с запятой, которые вы вводили в конце исходной команды, не перечисляются, когда SQL*Plus изобра¬ жает содержимое буфера, поскольку точка с запятой не запоминается (хотя и может использоваться вами в команде на языке SQL при вводе этой команды). При вводе команды LIST точка с запятой не требовалась, потому что данная команда является командой языка SQL*Plus, а не языка SQL. Если у вас возникла ошибка, то вы получите сообщение об ошибке с указанием строки, в которой она произошла. Предположим, вы ошибочно пытаетесь применить команду
123 SELECT к STRENO, вместо STORENO, тогда сообщение об ошибке будет выглядеть следующим образом: SELECT STRENO ★ ERROR at line 1: ORA-0704: invalid column name (ошибка в строке 1: неверное имя столбца) В этом сообщении звездочка указывает место ошибки, т.е. ошибочное имя столбца STRENO. Теперь, вместо того чтобы заново набирать всю команду, вы можете исправить ошибку, отредактировав команду на буфере, например следующим образом: 1. Используйте команду LIST за которой следует номер строки, чтобы изобразить ошибочную строку, и сделайте ее текущей. 2. Используйте команду CHANGE, чтобы исправить ошибку. Вам понадобится ввести следующие три элемента, разделенные косыми чертами (слешами); • слово CHANGE (или букву С); • последовательность символов, содержащих ошибку; • последовательность символов, которые вы хотите вставить для исправления. Чтобы заменить STRENO на STORENO, отредактируйте ошибочный столбец следующим образом (для пояснения процесса подсказки от SQL*Plus показаны слева): 1. Введите LIST и номер строки, которую вы хотите изменить: SQL> LIST 1 2. Когда на экране появится строка 1* SELECT STRENO введите текст SQL> CHANGE/STRENO/STORENO/. на экране появится правильная строка 1* SELECT STORENO Команда CHANGE найдет первое вхождение указанной последовательности символов в текущей строке и заменит его на новую последовательность. После изменения команды вы можете воспользоваться командой RUN, чтобы повторно вы¬ вести на экран измененную команду. Введите только
124 RUN и на вашем экране появится и будет выполнена полная исправленная команда. Включение новой строки Чтобы добавить новую строку на буфер или вставить строку между имеющимися строками, используйте команду INPUT После этого вы можете пожелать снова применить команду RUN, чтобы увидеть и выполнить исправленный вариант исходной команды. Присоединение текста к строке Если вы хотите в конец строки на буфере добавить текст, воспользуйтесь командой APPEND следующим образом: 1. Изобразите с помощью команды LIST ту строку, которую вы хотите изменить. 2. Введите APPEND, а затем текст, который хотите добавить. Если добавляемый вами текст начинается с пробела, то отделите слово APPEND от первого символа текста двумя пробелами (один для разделения команды и текста, а другой для передачи на буфер вместе с текстом). Удаление строки Пользуйтесь командой DEL для удаления строки с буфера. 1. Изобразите с помощью команды LIST ту строку, которую хотите удалить. 2. Введите DEL. В результате следующая строка на буфере (если такая имеется) становится текущей строкой. Вы можете удалить несколько последовательных строк, сделав первую из них текущей строкой, а затем удалив командой DEL каждую из этих строк по очереди. Запоминание и печать результатов У вас может возникнуть желание запомнить результаты запроса в файле, чтобы получить возможность редактировать их системой подготовки текстов до выдачи на печать или включить их в некоторый другой документ. Чтобы запомнить их в файле и одновременно изобразить на экране, введите SPOOL <файл>.М5
125 Вся изображенная на экране информация после ввода вами команды SPOOL будет запомнена в файле, который вы выбрали перед знаком точка (.). Вы не можете использовать суффикс LIS. Пакет SQL*Plus будет продолжать буферизировать инфор¬ мацию в указанном вами файле, пока вы не остановите его, введя SPOOL OFF Чтобы распечатать результаты запроса, а не просто остано¬ вить буферизацию, введите SPOOL OUT Пакет SQL*Plus прекратит буферизацию и будет копировать содержимое файла буферизации на принтере вашего главного компьютера. Сообщения HELP В пакете SQL*Plus имеется очень много указаний HELP, демонстрирующих доступные команды и правила их исполь¬ зования. Для изображения всех команд языков SQL и SQL*Plus достаточно лишь ввести HELP Для изображения конкретной команды введите слово HELP, а затем имя команды, например HELP SELECT Сообщения об ошибках Если пакет SQL*Plus обнаруживает ошибку в команде, он показывает на экране сообщение об ошибке. Часто информация из такого сообщения оказывается достаточной, чтобы вы нашли ошибку и исправили ее. Если пет, то сопоставьте сообщение с публикацией корпорации Oracle "Error Messages and Codes" (Сообщения об ошибках и коды ошибок), чтобы понять суть Проблемы и узнать, как исправить ошибку. Прерывание изображения Если вы хотите, чтобы пакет SQL*Plus делал паузу после Каждого появления на экране длинного отчета, то можете Использовать команду SET PAUSE. Наберите SET PAUSE ON [<текст>]
126 и включите туда тот текст, который хотите вывести на экран перед паузой. После каждого указания PAUSE пакет SQL*PlUs будет ждать нажатия вами клавиши возврата и только после этого продолжит просмотр. Чтобы прервать такую паузу, введите SET PAUSE OFF [<текст>] и нажмите клавишу возврата. Прекращение изображения Чтобы остановить вывод на экран многостраничного изо¬ бражения прежде, чем оно закончится, нажмите клавишу прерывания [INTERRUPT]. Эта клавиша специфицируется операционной системой; во многих системах вы можете выполнить INTERRUPT, нажав Control С (ЛС). В таком случае пакет SQL*Plus прекратит показ изображения и выдаст подсказку. Однако нажатие [INTERRUPT] не прекратит операцию грам¬ матического разбора, если она находится в стадии выполнения. Выход из пакета SQL*Plus Если вы исчерпали работу с пакетом SQL*Plus и хотите вернуться в операционную систему, то введите EXIT Выполнение других программ Не выходя из пакета SQL*Plus, вы можете выполнять команду главной операционной системы. Например, если вы хотите посмотреть содержание каталога главной операционной системы, введите команду HOST языка SQL*Plus, а затем команду главной операционной системы. Например, в системе DEC VMS вы вводите HOST DIR *.SQL После завершения выполнения команды главной операци¬ онной системы снова появится подсказка языка SQL*Plus. Выполнение команды из файла Чтобы восстановить запрос из файла и выполнить его за один этап, воспользуйтесь командой START, за которой следует имя файла START <имя файла> В этом случае вам не нужно добавлять суффикс .SQL.
127 команды языка SQL*Plus в командном файле Когда вы запоминаете с помощью команды SAVE текущую команду SQL в файле, введенные вами команды на языке SQL*Plus вместе с ней не запоминаются. Когда вы позднее восстановите эту команду, вам придется заново ввести команды языка SQL*Plus, если вы хотите достичь такого же результата. Чтобы запомнить командный файл пакета SQL*Plus вместе с командами языка SQL, воспользуйтесь командой SET для установки текущего буфера, отличного от буфера пакета SQL. Эта команда имеет вид SET BUFFER <имя> где имя — это любое слово, удовлетворяющее обычным правилам именования объектов языка SQL*Plus. Тогда все команды редактирования будут работать на новом текущем буфере, а не на буфере пакета SQL. Примените редактор пакета SQL*Plus, чтобы собрать вместе ваши команды языка SQL*Plus и языка SQL на вашем новом текущем буфере. Сохраните эти команды с помощью оператора SAVE и запустите их командой START. Команда EDIT Если вы хотите пользоваться текстовым редактором вашей главной системы, а не командами редактирования SQL*Plus, то можете сделать это, введя EDIT В результате будет редактироваться содержимое текущего буфера. Если вы предпишете текстовому редактору сохранить отредактированный текст, то этот текст будет восстановлен на текущем буфере. Или же вы можете отредактировать содержимое конкретного файла, введя EDIT <имя файла> Для этого файла будет подразумеваться файловый суффикс •SQL. Если это не тот суффикс, который вы хотели, вы Должны в командной строке EDIT установить свой вариант файла, суффикс. Если вы сохраняете командный файл с Помощью текстового редактора, то он будет восстановлен в том Же файле.
128 Использование SQL и SQL.Plus Подробности относительно использования пакетов SQL и SQL.Plus для создания таблиц и других объектов базы данных а также для организации запросов и поддержки базы данных приводятся в гл. 7 — 9. Заключение В этой главе введены язык структурированных запросов SQL и дружественный *к пользователю интерфейс SQL*Plus системы Oracle и даны общие указания об их использовании в СУРБД Oracle.
7 Операторы определения данных и манипулирования ими в языке SQL Существуют два основных типа команд языка SQL для установки и поддержки базы данных: 1. Операторы определения данных, например CREATE, ALTER, DROP, которые определяют и/или описывают объекты базы данных. 2. Операторы манипулирования данными, например SELECT, UPDATE, DELETE, INSERT и CREATE VIEW, которые обес¬ печивают манипулирование и/или обработку содержимого базы данных. В первой части этой главы объясняется и иллюстрируется использование операторов определения данных пакета SQL для баз данных, табличных пространств, таблиц, кластеров, индек¬ сов, последовательностей и синонимов. Вторая часть главы посвящена перечисленным выше операторам манипулирования данными языка SQL.
130 Создание базы данных Для создания базы данных требуется привилегия адми¬ нистратора базы данных. Синтаксис и применение этой команды рассмотрены в разд. ’’Начальное создание базы данных'' (гл. 5). Создание табличного пространства Вы найдете описание синтаксиса и применения команды CREATE TABLESPACE в разд. "Создание нового табличного пространства" (гл. 11). Создание таблицы Чтобы создать ■ таблицу в системе Oracle, наберите слова CREATE TABLE, а затем имя, которое вы хотите присвоить таблице. Имя таблицы должно удовлетворять следующим правилам: • содержать не более 30 символов; • начинаться с одной из букв от А до Z; • после начальной буквы содержать любые буквы от А до Z, любые цифры от 0 до 9 и любые из четырех символов -, #, $, @. (см. исключения в конце этого списка); • использование прописных или строчных букв не должно влиять на имя таблицы. Например, ПЕРСОНАЛ, Персо¬ нал и персонал — это одно и то же имя таблицы с точки зрения системы Oracle (исключения см. ниже); • не может совпадать с именем другой таблицы или представления (рассматриваются ниже); • не может использовать зарезервированное слово языка Oracle или SQL (зарезервированные слова перечислены в приложении А); • заключенное при создании в апострофы может содержать любую комбинацию символов, за исключением апострс^ фов в самом имени; • заключенное при создании в апострофы приведет к тому, что имя будет выдаваться именно в том виде, в каком оно было введено по отношению к прописным или строчным буквам. Например, "ПЕРСОНАЛ", "Персона! и "персонал" — это не одна и та же, а три разные таблицы
131 Ваша команда создать таблицу будет выглядеть следующим образом: CREATE TABLE <имя таблицы> Затем вы должны выбрать имя, ширину и тип данных для каждого столбца в таблице. (Типы данных, допускаемых в столбце, рассматриваются в гл. 6.) Столбцы должны быть перечислены в скобках после имени таблицы. Информация о последовательных столбцах должна быть разделена запятыми. Имена столбцов могут содержать до 30 символов. Если вы не выбрали ширину столбца, система Oracle задаст вам вопрос о ширине. (Проверьте информацию об используемой вами машине, чтобы определить максимально возможное число столбцов.) Вы должны выбрать значения ширины столбцов, набрав имя (т. е. имя Столбец 1), тип (т. е. Char) и размер (т. е. 10) каждого столбца непосредственно под вашей командой CREATE TABLE. Столбцы CHAR должны выбирать ширину. В конкретной таблице каждое имя столбца является уни¬ кальным. Другими словами, никакая таблица не может содер¬ жать более одного столбца с одним и тем же именем. Выберите NOT NULL, если для вашей работы существенны данные для определенного столбца. Тогда, если кто-нибудь попытается ввести запись без заполнения значения для этого столбца, система Oracle возвратит сообщение об ошибке. Значения NUMBER могут состоять из цифр от 0 до 9 и включать знаки плюс ( + ) или минус (-). Числовые значения должны содержать не более 40 цифр. Если цифры включают десятичную точку, вы должны указать, сколько цифр должно находиться справа от десятичной точки при выборе NUMBER (w,d) где w = общее число цифр в столбце; d = число цифр справа от десятичной точки. Имена столбцов должны удовлетворять тем же правилам, которые были сформулированы выше для имен таблиц. При указанных столбцах ваша команда CREATE TABLE будет выглядеть следующим образом: CREATE TABLE имя таблицы (имя столбца 1 CHAR (5), имя столбца 2 CHAR (30),
132 имя столбца 3 NUM (10), NOT NULL, имя столбца 4 NUM (6,2)); Приведенная выше команда создает пустую базовую таблицу с четырьмя столбцами, первый из которых имеет ширину в пять символов, а второй — в 30 символов. Третий столбец будет содержать числовые значения длиной до 10 цифр, а четвертый — до шести цифр с двумя цифрами справа от десятичной точки. Заметим, что третий столбец порождает спецификацию NOT NULL, поэтому при включении строк в таблицу этот столбец должен быть заполнен некоторым значе¬ нием. Эту таблицу можно использовать для перечисления персонала на производстве. Она имела бы вид CREATE TABLE СЛУЖАЩИЕ ( сдолжность симя сномер сокпад CHAR (5), CHAR (5), NUM (10), NOT NULL, NUM (6,2)); Данная команда установит таблицу с четырьмя столбцами, первый из которых будет характеризовать должность сотрудника в пространстве из пяти символов. Во втором столбце будет содержаться имя сотрудника с использованием до 30 символов. В третьем столбце будет представлен номер сотрудника всего из десяти цифр. Этот столбец должен быть заполнен числовым значением всякий раз, когда некоторая строка вводится в таблицу, поскольку имеется спецификация NOT NULL. Если это значение не заполнено, система Oracle выдаст сообщение об ошибке. В четвертом столбце указывается оклад сотрудника с использованием всего шести цифр, две из которых находятся справа от десятичной точки. Фактическое включение строк значений данных в эту таблицу требует применения одного или нескольких операторов мани¬ пулирования данными, которые рассматриваются ниже, или же вам понадобится вводить данные через загрузчик SQL*Loader, который обсуждается в гл. 2. Использование имени таблицы в качестве префикса для имени столбца Хотя вы и не можете иметь два столбца с одинаковыми именами в одной и той же таблице, разные таблицы могут
133 содержать столбцы с одинаковыми именами. Например, таблица с именем ’’Suppliers’’, перечисляющая поставщиков, услугами которых вы пользуетесь, могла бы перечислять детали, посту¬ пающие от этих поставщиков. В то же самое время таблица с именем "Orders”, перечисляющая заказы, размещенные вами среди некоторых поставщиков, могла бы перечислять заказан¬ ные вами детали. Поэтому у вас могло бы возникнуть желание отличать детали, перечисленные в таблице Suppliers, от деталей, перечисленных в таблице Orders, когда вы принимаете к сведению информацию команды SELECT. Вы можете добиться этого, включив имя таблицы в качестве префикса в имя столбца. Тогда вы должны обратиться по имени SUP.PARTS к столбцу деталей в таблице Suppliers и по имени ORD.PARTS к столбцу деталей в таблице Orders. Создание кластера Синтаксис команды CREATE для кластера демонстрируется и обсуждается в разд. "Управление кластерами” в гл. 11. Создание индекса Индекс предназначается для ускорения восстановления дан¬ ных. Однако, хотя индекс и ускоряет восстановление, он может замедлить обновление. Может существовать любое количество индексов, основывающихся на любой хранимой таблице. У вас могут быть отдельные индексы для каждого столбца таблицы и, кроме того, свои индексы для комбинаций столбцов. Например, применительно к таблице, содержащей имена, номера отделов, названия должностей и заработки, у вас могут быть индексы для каждого из четырех названных столбцов, а также индекс для комбинации "названия должностей и зара¬ ботки" (и/или любой другой комбинации из четырех столбцов). Назначение комбинации состояло бы в сокращении числа считываний при частом запросе "названий должностей и заработков". Другими словами, если для каждого из четырех столбцов существуют лишь отдельные индексы, то запрос "Найти все названия должностей с заработками ниже 50 000 долл." привел бы к двум считываниям (потому что он включает в себя две переменные: "названия должностей" и "заработки"). Однако если существует комбинированный индекс, то тот же
134 запрос мог потребовать лишь одно считывание, обеспечивая экономию считывания. Единственные операции, которые вы можете выполнять непосредственно над индексами, — это CREATE и DROP (т. е. создать и ликвидировать). Ни один пользователь не может реализовать применительно к индексам такие операторы ма¬ нипулирования данными языка SQL, как SELECT, потому что с целью оптимизации восстановления именно система прини¬ мает решения относительно того, какой индекс использовать для ответа на запрос SQL. (Впрочем, в главе 10 вы познако¬ митесь со способами стратегического размещения выражений в рамках запроса, посредством которых вы можете оказывать влияние на использование индексов системой Oracle.) Команда языка SQL для создания индекса выглядит следующим образом: CREATE INDEX <имя индекса> ON <имя таблицы >; Решение о типе создаваемого индекса принимается в основном на административном уровне. Поэтому подробности о возможных вариантах создания индексов приводятся в гл. 5, посвященной функциям администратора базы данных. Создание последовательности Оператор создания последовательности CREATE SEQUENCE впервые появился в версии 6 системы Oracle, как и генератор последовательностей, к которому он обращается. Теперь вы можете независимо от транзакций пользоваться последователь¬ ными числами, чтобы автоматически генерировать уникальные первичные ключи для ваших данных и координировать ключи по множественным строкам или таблицам. Соответствующий синтаксис имеет вид CREATE SEQUENCE < последовательность> [INCREMENT BY {1/n}] [START WITH n] [MAXVALUE n]/[NOMAXVALUE] [MINVALUE n]/[NOMINVALUE] [CYCLE]/[NOCYCLE] [CACHE n]/[NOCACHE] [ORDER]/[NOORDER]
135 где последовательность — это имя последовательности, для которой справедливы те же правила именования, что и для других объектов базы данных INCREMENT BY определяет интервал между последовательными числами. Если он отрицательный, то последовательность убывает, если положительный, то возрастает. По умолчанию принимается возрастание на 1 START WITH — это первое число из создаваемой последовательности. По умолчанию принимается MINVALUE для возрастающих последовательностей и MAXVALUE — для убывающих MINVALUE/ NOMINVALUE- устанавливает минимальное значение для генерации. При возрастании по умолчанию принимается MINVALUE (со значением 1), при убывании — NOMINVALUE MAXVALUE/ NOMAXVALUE Устанавливает максимальное значение для генерации. При возрастании по умолчанию устанавливается NOMAXVALUE. При убывании — MAXVALUE (со значением -1) CYCLE/NOCYCLE по умолчанию выбирается NOCYCLE. Последовательность будет либо неограниченно возрастать и прекратится по достижении предопределенного предела, либо начинаться заново при достижении предела. Чтобы последовательность неограниченно возрастала, не выбирайте MAXVALUE для возрастающих последовательностей или MINVALUE для убывающих. Для последовательностей, прекращающихся в точке предела, выбирайте MAXVALUE для возрастания или MINVALUE для
136 убывания. Выбирайте NOCYCLE. Для последовательности, которая начинается заново после достижения предела, выбирайте MAXVALUE для предела возрастающей последовательности или MINVALUE для предела убывающей последовательности. Выбирайте CYCLE CACHE/NOCACHE будет предварительно распределять последовательные числа таким образом, что они могут храниться в памяти, в результате ускорится генерация чисел. Используется для приложений с высокими требованиями производительности. Г]о умолчанию принимается NOCACHE ORDER/NOORDER гарантирует, что последовательные числа будут генерироваться в порядке требований. Имеет существенное значение для приложений, в которых последовательные числа используются как временные метки. Обычно не имеет существенного значения для таблиц, в которых последовательности служат для генерации первичных ключей Последовательные числа используются с двумя словами NEXTVAL и CURRVAL, которые не являются зарезервирован¬ ными словами и поэтому могут служить именами псевдостолб¬ цов в операторах языка SQL. Создание синонима Оператор CREATE SYNONYM создает синоним для имени таблицы или представления. Чтобы создать синоним, вы должны стать владельцем таблицы или обладать для нее привилегией SELECT. Соответствующий синтаксис имеет вид CREATE [PUBLIC] SYNONYM <синоним> FOR [ < пользователь > ] < таблица > [@< связь базы данных>]
137 где синоним — это имя синонима, для которого справедливы те же правила именования, что и для других объектов базы данных пользователь существующее имя пользователя в базе данных. Если вы не включите имя пользователя, то в команде предполагается, что вы являетесь владельцем таблицы или представления PUBLIC указывает, что вы создаете синоним, к которому любой пользователь может обращаться без уточнения. Если такое указание отсутствует, то другие пользо¬ ватели (кроме вас) должны уточнять этот синоним вашим пользовательским именем. Синоним PUBLIC может созда¬ вать только администратор базы данных таблица — это существующая таблица в базе данных связь базы данных — это существующая связь с удаленной базой данных Изменение таблицы Существующую базовую таблицу можно изменить в любой момент, добавив элементы таблицы, изменяя определения столбцов, ликвидируя ограничения или изменяя последующее распределение памяти. Полный синтаксис имеет вид ALTER TABLE [пользователь.] таблица [ADD {элемент_таблицы/(< элемент таблицы > [,<элемент_таблицы >]...)}] [MODIFY {<определение_столбца>/ (< определ ение_столбца > [, <определение_столбца>]...)}] DROP CONSTRAINT {ограничение/[,<ограничение>]...)}] [PCTFREE < целое >][PCTUSED < целое >] [INITRANS <целое>j[MAXTRANS <целое>] [STORAGE <память>] [BACKUP]
138 где: пользователь таблица владелец таблицы существующая таблица, которой вы владеете или по отношению к которой обладаете привилегией ALTER элемент_та блицы корректный уникальный заголовок столбца память определяет последующее распределение места в памяти ограничения — это такие ограничения на столбцы в таблице, как NOTNULL или UNIQUE PCTFREE и PCTUSED определяет, будут ли вставленные строки входить в существующие или в новые блоки. PCTFREE изменяется в пределах 0 — 100 и представляет собой ту процентную часть таблицы, которая не будет заполнена вставляемыми строками. Строки хранятся в блоках Oracle, причем размер блока зависит от операционной системы и обычно заключен в пределах 1024 — 4096 байт. Значение 0 для PCTFREE означает, что блок будет заполнен. Значение PCTFREE по умолчанию равно 10 Вы можете также изменять столбцы в рамках таблицы, увеличивая их ширину или изменяя число десятичных позиций. Вы можете уменьшить ширину столбца или изменить его тип данных, только если все значения в столбце равны NULL. Добавление столбца В языке SQL добавление столбца обеспечивается командой ALTER TABLE, за которой следует имя таблицы, которую вы хотите изменить, и командой ADD, за которой следует имя столбца, в который нужно внести изменение, а также желаемое изменение. Эти команды будут выглядеть следующим образом: ALTER TABLE имя_таблицы ADD имя_столбца тип_данных;
139 Например, вы можете пожелать, чтобы ваша таблица служащих содержала номер места, где находится каждый индивидуум. Такой столбец можно добавить, воспользовавшись командой ALTER следующим образом: ALTER TABLE служащие ADD ном места NUMBER; Теперь все записи (т. е. строки), существующие в таблице персонала, будут расширены для включения этого дополни¬ тельного столбца с типом данных NUMBER. В этот момент значением нового столбца в каждой строке будет NULL. Когда вы добавите столбец, он будет располагаться справа от имеющихся столбцов. Сначала все поля в новом столбце будут содержать NULL. Добавляя новый столбец, вы не можете выбрать NOT NULL, если ваша таблица уже содержит строки. (Впрочем, имеется способ добавить спецификацию NOT NULL к таблице с существующими строками. Он объясняется в следующем разделе о модификации столбца.) Модификация столбца В любой момент можно изменить существующую базовую таблицу, увеличив размер столбца или заменив в нем число десятичных позиций. Это действие реализуется в языке SQL командой ALTER TABLE, за которой следует имя таблицы, куда вносится изменение, а затем команда MODIFY языка SQL, имя подлежащего изменениям столбца и желаемое изменение. Увеличение размера столбца от любого числа, меньшего 20, до 20 выглядит следующим образом: ALTER TABLE <имя_таблицы> MODIFY <имя_столбца> CHAR (20); Предположим, например, что вы намереваетесь создать новые должности в некоторых отделах и нуждаетесь в более широком диапазоне названий должностей. Вам следует увели¬ чить ширину столбца должностей в таблице Служащие. Изме¬ нение будет следующим: ALTER TABLE Служащие MODIFY должны CHAR (20); Вы можете заменить для столбца вариант NOT NULL на NULL, добавив к спецификации столбца предложение NULL ...MODIFY (сномер (20) NULL);
140 Можно заменить для столбца NULL на NOT NULL анало¬ гичным образом, но только если в столбце нет пустых значений. У вас может возникнуть желание добавить столбец NOT NULL к таблице, которая уже содержит данные, но это нельзя сделать в один этап. С помощью предложения MODIFY вы можете добавить столбец NOT NULL к таблице с существующими строками, выполнив следующие три этапа: 1. Добавить столбец. 2. Заполнить некоторым непустым значением каждое поле в столбце: 3. Использовать ALTER TABLE MODIFY, чтобы добавить к столбцу спецификацию NOT NULL. Для уменьшения ширины столбца или изменения ширины столбца необходимо, чтобы все значения в столбце для всех строк были пустыми (NULL). Команда изменения данных будет следующей: ALTER TABLE <имя_таблицы> MODIFY <имя_столбца> (тип_данных); Изменение других объектов базы данных Вы можете также изменять кластеры, базы данных, индексы, последовательности, табличные пространства и заменять поль¬ зователей, как показано ниже. Изменение кластера Если вы хотите заново определить будущие параметры хранения для кластера, то воспользуйтесь командой ALTER CLUSTER. Вы не можете изменить столбцы, которые составляют ключ кластера. Команда ALTER CLUSTER не изменяет таб¬ личное пространство кластера. Соответствующий синтаксис имеет вид ALTER CLUSTER [<пользователь>.] <кластер> [PCTUSED n][PCTFREE п] [SIZE п] [INITRANS n][MAXTRANS п] [STORAGE < память >] Дальнейшая информация о кластерах содержится в главе 11.
141 Изменение базы данных Вы можете использовать команду ALTER DATABASE для формирования базы данных, добавления или ликвидации файла регистрации действий, переименования файла регистрации действий или файла базы данных или же для указания, что протоколы регистрации действий будут или не будут архиви- зированы. Изменять базу данных может только администратор базы данных. Не нужно формировать или открывать базу данных, когда вы применяете к ней команду ALTER. Соответ¬ ствующий синтаксис имеет вид ALTER DATABASE [<база данных>] [ADD LOGFILE <специф_файла> [,<специф_файла>]...] [DROP LOGFILE <текст> [,<текст>]...] RENAME FILE <текст> [,<текст>]...ТО <текст> [,<текст>] ...] [ARCHIVELOG/NOARCHIVLOG] [MOUNT [SHARED/EXCLUSIVE]/DISMOUNT] [OPEN/CLOSE [NORMAL/IMMEDIATE]] Вы найдете объяснения вариантов, представленных в этом синтаксисе, а также другую информацию об изменении баз данных посредством команды ALTER в разд. "Управление хранением индексов" в гл. 11. Изменение индекса Вы можете воспользоваться командой ALTER INDEX с целью изменения будущего распределения памяти для индексных блоков. Для этого вы должны быть владельцем индекса или обладать привилегией администратора базы данных. Соответ¬ ствующий синтаксис ALTER INDEX [<пользователь>.] <индекс> [INITRANS n][MAXTRANS п] [STORAGE <память>] где индекс имя индекса память позволяет вам выбрать следующие параметры: [INITIAL < целое>][NEXT < целое >] [MINEXTENTS. <целое>][MAXEXTENTS <целое>] [PCTINCREASE <pct>]
142 Изменение последовательности Вы можете употребить команду ALTER SEQUENCE для изменения любого варианта, который вы использовали, когда создавали последовательность, за исключением начального значения. Если вы хотите начать последовательность с другого числа, то должны ликвидировать последовательность командой DROP и создать ее снова командой CREATE. Изменяя последовательность командой ALTER, вы не можете установить новое значение MAXVALUE, меньшее прежнего MAXVALUE или текущего числа последовательности. Изменение табличного пространства Вы можете изменить табличное пространство командой ALTER, добавляя или переименуя файл (файлы) базы данных, изменяя параметры хранения по умолчанию, выбирая опера¬ тивный или автономный режим и начиная или прекращая резервирование. Соответствующий синтаксис имеет вид ALTER TABLESPACE стабличное пространство> [ADD DATAFILE <специф_файла> [,<специф_файла>]...] [RENAME DATAFILE <текст> [,<текст>]...ТО <текст> [,<текст>]...] [DEFAULTSTORAGE <память>] [ONLINE/OFFLINE [NORMAL/IMMEDIATE]] [BEGIN BACKUP/END BACKUP] где табличное пространство имя существующего табличного пространства специф-файла спецификация файла базы данных в виде 'имя файла'[$У£Е<целое> [К/М]] [REUSE], где <целое> специфицирует SIZE в числе байтов. Отсутствие целого означает, что система Oracle будет использовать по умолчанию табличное пространство размером в 10М. Если за целым значением следует символ К, то SIZE равняется этому целому, умноженному на 1024. Если используется символ М, то SIZE будет равняться целому, умноженному на 1 048 576
143 текст — это либо прежнее, либо новое имя файла (заключенное в одинарные кавычки) память — это то же, что в команде ALTER INDEX ONLINE означает, что табличное пространство должно возвращаться оперативно OFFLINE означает, что табличное пространство должно браться в автономном режиме либо сразу, либо после того, как все текущие пользователи завершат свой доступ к нему BEGIN BACKUP означает, что составляющие это табличное пространство файлы базы данных подлежат процедуре системного резервирования. Не оказывает воздействия на доступ. Эта возможность особенно полезна для поддержания файлов управления и записей регистрации действий Изменение пользователя Вы можете использовать команду ALTER USED, чтобы изменять пароли, табличные пространства по умолчанию для создания объектов, а также временные табличные пространства по умолчанию для временных сегментов, созданных от имени пользователя. Для этого вы должны обладать привилегией администратора базы данных. Соответствующий синтаксис имеет вид ALTER USER < пользователь> [IDENTIFIED BY <пароль>] [DEFAULT TABLESPACE стабличное пространство>] [TEMPORARY TABLESPACE стабличное пространство] Вы можете также изменить пароль пользователя с помощью команды GRANT. Копирование строк в таблицу Вы можете создать таблицу и одновременно копировать в нее строки из некоторой существующей таблицы посредством
144 команды CREATE TABLE и слова AS. (Другие случаи упот¬ ребления AS объясняются в разд. ’’Подзапросы” гл. 9.) Вам необходимо выбрать те столбцы из существующей таблицы, которые вы хотите копировать в свою новую таблицу. Все спецификации, перечисляемые после AS, должны быть заклю¬ чены в скобки. Предположим, например, что вы хотите создать таблицу администрации фирмы, определенной как весь персонал в должности менеджера или с окладом свыше 50 000 долл. Это можно сделать, позаимствовав их имена, занятия и оклады из таблицы, в которой перечислен весь персонал. Затем вы должны создать таблицу и заполнить ее в надлежащих строках одной командой следующим образом: CREATE TABLE Администрация (имя, занятие, оклад) AS (SELECT имя, занятие, оклад FROM Служ WHERE занятие = "менеджер" OR оклад > 50000); Заметим, что при использовании команды AS вы не выбираете ширину столбцов или типы данных. Они определя¬ ются шириной и типами данных из столбцов, специфициро¬ ванных в уже существующей таблице. Удаление файлов базы данных Вы не можете ликвидировать файлы базы данных командой DROP, по можете сделать их недоступными, либо ликвидировав соответствующее табличное пространство (пространства), либо выбрав табличное пространство (пространства) в автономном режиме. (См. гл. 4 о поддержании табличного пространства.) Даже если в табличном пространстве файлы базы данных содержат данные, вы можете их удалить следующим оператором языка SQL: DROP TABLESPACE стабличное пространство> [INCLUDING CONTENTS] Ликвидация кластера Вы можете ликвидировать кластер, если являетесь его владельцем или администратором базы данных. Соответству¬ ющий индекс имеет вид
145 DROP CLUSTER [<пользователь>.] <кластер> [INCLUDING TABLES] где пользователь владелец кластера кластер имя существующего кластера INCLUDING TABLES ликвидирует все таблицы, относящиеся к этому кластеру. При отсутствии такого указания команда DROP применима только к пустому кластеру Ликвидация связи базы данных Вы можете ликвидировать принадлежащую вам связь базы данных. Синтаксис имеет вид DROP [PUBLIC] DATABASE LINK <связь базы данных> Если связь базы данных является PUBLIC (общего пользо¬ вания), то ликвидировать ее командой DROP может только администратор базы данных. Ликвидация индекса Для ликвидации индекса воспользуйтесь командой DROP INDEX языка SQL, за которой следует имя индекса, например DROP INDEX [<пользователь^] <имя индекса> Может оказаться, что два индекса для разных таблиц имеют одинаковые имена. В таком случае вам следует указывать, какой именно индекс ликвидируется. Для этого выберите имя таблицы после ON, как показано в приведенном выше примере. Если же вы уверены, что ни при какой другой таблице нет другого индекса с тем же именем, то достаточно использовать команду DROP INDEX <имя индекса >; Ни одна из приведенных выше команд DROP INDEX не будет ликвидировать таблицы или представления, на которых базируется индекс. Ликвидация последовательности С помощью команды DROP вы можете ликвидировать любую последовательность, если являетесь владельцем или админист¬ ратором базы данных. У вас может появиться желание
146 ликвидировать последовательность, чтобы запустить ее снова. Соответствующий синтаксис имеет вид DROP SEQUENCE [<пользователь>.] <пользователь> Ликвидация синонима Вы можете ликвидировать частный синоним, если владеете им или являетесь администратором базы данных. Вам разре¬ шается ликвидировать синоним типа PUBLIC только в том случае, если вы обладаете привилегией администратора базы данных. Один из способов изменения синонима состоит в его ликвидации и повторном создании. Синтаксис имеет вид DROP [PUBLIC] SYNONYM <синоним> Ликвидация таблицы Из базы данных существующая базовая таблица может быть удалена в любой момент. Это осуществляется командой DROP TABLE языка SQL. Она выглядит следующим образом: DROP TABLE [<пользователь>.] <имятаблицы> Например, предположим, что созданная в этой главе таблица Служащие заменяет аналогичную таблицу, которая называется Персонал. Поскольку таблица Служащие теперь содержит все элементы прежней таблицы Персонал, а также иную инфор¬ мацию, то вы можете расстаться с прежней таблицей^ Команда реализации этого выглядит так: DROP TABLE Персонал; Имейте в виду, что при ликвидации базовой таблицы автоматически ликвидируются все представления и индексы, определенные по этой базовой таблице. Ликвидация табличного пространства Если вы являетесь администратором базы данных, то командой DROP можете ликвидировать то или иное сущест¬ вующее табличное пространство (кроме табличного простран¬ ства SYSTEM, к которому неприменима команда DROP), независимо от того, содержит ли это табличное пространство объекты базы данных. Ликвидировать можно только такое табличное пространство, которое находится в оперативном режиме. Соответствующий синтаксис имеет вид DROP TABLE стабличное пространство > [INCLUDING CONTENTS]
147 Язык манипулирования данными (ЯМД) пакета SQL К числу операторов манипулирования данными пакета SQL относятся операторы INSERT UPDATE DELETE SELECT CREATE VIEW В этом разделе объясняются и иллюстрируются операторы манипулирования данными для базовых таблиц, представлений и индексов. Обсуждается также создание и использование представлений. Вставка Команда INSE/RT вставки служит для добавления к таблицам строк или частей строк. Если таблица была создана только что, то команда INSERT может служить для внесения начальной строки (строк) данных. В общем виде команда INSERT будет выглядеть так: INSERT INTO <имята(5лицы> [(<имя_столбца1 >,<имя_столбца2>,...) VALUES (’<зь’ачение_1 >’,’<значение_2>’,...); Пусть, например, у вас появился новый поставщик, и нужно ввести в таблицу поставщиков его имя, местонахождение и условия. Запись будет выглядеть следующим образом: INSERT INTO Поставщики (имя, место, условия) VALUES (’экми’,’бостон’,’net30’); Если список, имен столбцов опущен, то значения для каждого столбца должны быть перечислены в таблице и список значений должен быть задан в той же последовательности, в какой следуют столбцы в таблице. Иначе говоря, вы можете задать имена всех столбцов в виде INSERT INTO имя та блицы (столбец 1, столбец 2, столбец 3...) VALUES (значение 1, значение 2, значение 3); Или если з качения расположены точно в таком же порядке,
148 как и столбцы, и ни одно значение не пропущено, то вы можете опустить имена столбцов и написать INSERT INTO имя таблицы VALUES (значение 1, значение 2, значение 3...); Если у вас нет значения для одного или нес кольких столбцов, то в качестве соответствующего значения вы. можете указать NULL, если этот столбец не содержит спецификацию NOT NULL. (Если вы попытаетесь ввести значение NULL в столбец NOT NULL, то пакет SQL*Plus возвратит сообщение об ошибке и не включит данную строку.) Например, если у вас нет значения для столбца 2 и он в свою очередь содержит спецификацию NOT NLHLL, то вы можете вставить значения любым из следующих двух способов: INSERT INTO имя таблицы (столбец 1, столбец 3...) VALUES (’значение Г, ’значениеЗ’...); или INSERT INTO имя таблицы VALUES (’значение Г, NULL, ’значение 3’...); причем значения располагаются точно в таком же порядке, как столбцы в таблице, или INSERT INTO имя таблицы (столбец 1, столбец 2, столбец 3...) VALUES (’значение Т, NULL, ’значение 3’...); Вообще говоря, нет необходимости утруждать себя вводом имен столбцов, если (1) вы включаете значения ibo все столбцы и (2) вы вставляете значения в том же порядке, в каком столбцы появляются в таблице. С другой стороны, нужно пользоваться списком имен столбцов, когда 1. Включается меньше значений для столбцоЕ^, чем количе¬ ство столбцов, существующих в таблице. 2. Значения для столбцов вводятся не в том порядке, в котором столбцы появляются в таблице. Когда вы включаете командой INSERT значения дат, они должны быть представлены в стандартном формате ДД-МЕС-ГГ, например 31-МАР-87. Если ваши календарные данные пред¬
149 ставлены в некотором другом порядке, то вы должны преоб¬ разовать их в стандартный формат с помощью функции форматирования дат TO_DATE. Вообще говоря, вставляемые значения должны удовлетворять следующим правилам: 1. Если значение опущено и номера столбцов не выбраны, то система Oracle будет исходить из предположения, что каждый столбец должен быть заполнен некоторым значением и вставит NULL на место того значения, которое она считает отсутству¬ ющим (если данный столбец не имеет спецификации NOT NULL). 2. Вставляемые значения должны соответствовать типу данных столбца, в который они включаются. 3. Вставляемые значения должны разделяться запятыми. 4. Команда INSERT может использоваться для копирования строк или частей 'строк из одной таблицы в другую. 5. Символьные значения должны быть заключены в оди¬ нарные кавычки. Обновление Команда обновления UPDATE служит для изменения зна¬ чений в существующих строках. Общая форма команды UPDATE имеет следующий вид: UPDATE <имя таблицы > SET сстолбец 1> = <новое значение>, <столбец2> = <новое значением <столбецЗ> = сновое значением... WHERE <условие>; Предложение SET в команде UPDATE содержит информацию о том, какие столбцы нужно обновлять и какие значения должны быть в них заключены. Команда UPDATE оперирует над всеми строками, которые удовлетворяют условию (условиям) предло¬ жения WHERE. П редложение WHERE является необязательным, но если оно опущено, то все строки будут обновлены. Командой UPE&ATE вы можете перевести столбец в состояние NULL, если этот столбец не содержит спецификации NOT NULL. Можно обновить столбец с помощью функций системы Oracle, которые работают на одной строке в предложении SET. Для обновления полей в столбце вы можете употребить те же выражения, какие вы использовали бы для выбора этих
150 выражений (по команде SELECT). Несколько столбцов в каждой строке могут быть обновлены одной командой UPDATE путем перечисления этих столбцов после ключевого слова SET. Можно обновить несколько строк сразу, выбрав их посред¬ ством предложения WHERE. Все строки,! удовлетворяющие условию WHERE, будут обновлены. Предположим, что вы желаете увеличить на 5% заработную плату всех торговцев, перечисленных в таблице служащих. Тогда введите UPDATE Служ SET оклад = оклад * 1.05 WHERE (занятие = торговец); В результате оклад каждого торговца умножится на 1,05. Каждый получившийся оклад заменит существовавший оклад в таблице Служ. Если в этом примере вы опустите предложение WHERE, то все сотрудники получат пятипроцентную прибавку независимо от занимаемой ими должности. Использование подзапросов для обновления. Предложение WHERE в команде UPDATE может содержать подзапрос. (Подзапросы рассматриваются в гл. 9.) Предположим, напри¬ мер, что каждый сотрудник, указанный в таблице менеджеров, должен получить прибавку к окладу в размере 10%. Тогда вы должны ввести UPDATE Служ SET оклад = оклад * 1.10 WHERE симя IN (SELECT симя FROM Менеджеры); Заметим, что подзапрос должен быть заключен в скобки. Подзапрос может использоваться также в предложении SET в команде UPDATE. Удаление Команда DELETE служит для удаления строк из таблицы. В общем виде команда DELETE записывается следующим образом DELETE FROM <имятаблицы> WHERE <условие>; Вы не можете удалять командой DELETE неполные строки, поэтому вы не должны выбирать имена столбцов.
151 Предложение WHERE определяет, какие строки будут уда¬ лены. Если предложение WHERE не выбрано, то будут удалены все строки. Предложение WHERE может быть сложным и может включать несколько условий, операций и/или подзапросов. Если вы хотите удалить из таблицы только одну строку, то воспользуйтесь командой DELETE с предложением WHERE, которое специфицирует идентифицирующую характеристику этой строки. Например, для удаления из вашей таблицы поставщиков поставщика с именем Джонс, введите DELETE FROM Поставщики WHERE пимя = ’джонс’; Если вы хотите одной командой удалить из таблицы несколько строк, то выберите строки с желаемым условием в предложении WHERE. Например, чтобы удалить из вашей таблицы всех поставщиков из Далласа, введите DELETE FROM Поставщики WHERE город = ’Даллас’; Для удаления из таблицы всех строк введите лишь команду DELETE FROM < имя таблицы >; и опустите предложение WHERE. В результате из таблицы будут удалены все строки и останутся только спецификации столбцов и имя таблицы. Выбор Команда SELECT служит для восстановления данных из таблицы. Ниже приводится ее общий вид SELECT <столбец 1 >,<столбец2>,<столбец3>... FROM <имятаблицы>; Если вы хотите восстановить все столбцы в конкретной таблице, то воспользуйтесь звездочкой (*) для указания всех столбцов вместо их перечисления. Например, предположим, что вы желаете восстановить всю информацию, содержащуюся в таблице Поставщики, относящейся к поставщикам вашей фирмы. Сделайте это следующим образом: SELECT * FROM Поставщики; Любые элементы, выбранные после SELECT, должны раз¬ деляться запятыми. Команда SELECT и предложение FROM
152 требуются для каждого запроса SQL. Константы могут выби¬ раться командой SELECT и будут иметь одинаковые значения в каждой строке. Строки, возвращаемые в ответ на команду SELECT, поступают и изображаются в произвольном порядке. Выражения могут выбираться командой SELECT, как и имена столбцов. Заголовками столбцов по умолчанию будут имя столбца или выражение, если не выбраны другие заголовки. Команда SELECT и предложение FROM должны появляться раньше любых других предложений в запросе. Создание представления Вместо того чтобы формулировать усложненный запрос для извлечения из таблицы конкретной информации, у вас может появиться желание создать представление таблицы, показыва¬ ющее только ту информацию, которая вам нужна. В таком случае вы можете получить избранную информацию посред¬ ством более простого запроса, чем в случае, когда вы запрашиваете всю таблицу. Чтобы сделать это в один этап, воспользуйтесь командой CREATE VIEW и выберите ваш запрос после слова AS. Соответствующий синтаксис имеет вид CREATE VIEW <имявида> AS (< запрос >); Запрашивающая часть команды выбирает конкретные стол¬ бцы и строки из конкретной таблицы. Предположим, например, что вы хотите выделить торговцев из других служащих для вычисления комиссионного вознаграждения. Вы создали бы представление из таблицы служащих в виде CREATE VIEW Торговцы AS (SELECT симя, сокпад FROM Служ WHERE занятие = продавец); После создания представления вы можете выдать для него запрос точно так же, как выдали бы запрос относительно любой таблицы. В команде CREATE VIEW вы можете использовать любой конкретный запрос, кроме предложения ORDER BY. Если вы хотите упорядочить упомянутых торговцев как-то иначе, чем они упорядочены в таблице Служащие, то вы должны сделать это в отдельном запросе, ориентированном на это представление.
153 Чтобы изобразить содержимое созданного выше представления, введите SELECT * FROM Торговцы; Когда вы запрашиваете представление, то можете восполь¬ зоваться предложением WHERE точно так же, как в случае таблицы SELECT симя FROM Торговцы WHERE оклад = 50000; Когда вы изменяете информацию в таблице, относящейся к представлению (например, таблицу, из которой создается представление), то информация в представлении тоже изме¬ нится. Если вы обновляете таблицу Служ, эти обновленные значения появятся также и в представлении, которое вы теперь назвали Торговцы. Если вы включаете или удаляете строки в базовой таблице, эти строки будут добавлены или исключены из представления. Обновление и удаление строк в представлении. Вы можете обновить представление, а не базовую таблицу, но только если представление: а) , относится только к одной таблице. б) , не содержит предложений GROUP BY, DISTINCT, групповой функции или ссылки на псевдостолбец ROWNUM. Вы не можете удалить строку из представления при тех же ограничениях, которые применимы к обновлению, и при дополнительном ограничении, что представление в) , не содержит столбцов, определяемых выражениями. (См. о выражениях в гл. 8.) Представление по более чем одной таблице. Для создания представления более чем из одной таблицы вы должны определить представление по запросу, содержащему соединение. (Дальнейшие подробности о соединениях см. в гл. 8.) Вы можете соединить в одном представлении любое количество таблиц. Использование в представлениях выражений и функций. При создании представления у вас может возникнуть желание скомбинировать столбцы или выполнить другие операции над значениями из столбцов в таблице, из которой извлекается
154 представление. В результате в представлении появятся другие столбцы, потому что: поскольку значения из этих столбцов не хранятся в базовых таблицах, то они вычисляются заново каждый раз, когда изображается представление. Поэтому они называются "вирту¬ альными столбцами". Вы должны выбрать все имена столбцов, если используете в представлении выражения или функции. Вы можете пользо¬ ваться в определениях представлений предложениями GROUP BY и групповыми (агрегатными) функциями, например, Average, Maximum, Minimum и Total. (Эти агрегатные функции рассматриваются в гл. 8 и 9.) Столбцы в представлении будут содержать значения того же типа данных, что и базовая таблица, из которой они были извлечены. Ликвидация представления. Как и в случае базовой табли¬ цы, представления могут исключаться командой DROPVIEW языка SQL. Например, следующая команда удалит некоторое представление DROPVIEW <имя представления>; Например, допустим, что у вас не находит непосредственного применения представление служащих в магазине № 5. Изба¬ виться от этого представления можно следующей командой: DROPVIEW Служ_магазин5; Эта команда ликвидирует также любые другие представления, которые могут быть определены на представлении Служ_мага- зин 5.. Однако базовая таблица, по которой определено это представление, не будет ликвидирована, если только ликвиди¬ руется определенное по ней представление. Заключение В этой главе объяснятюся синтаксис и употребление операторов и определения данных языка SQL. Такими опера¬ торами являются операторы CREATE, ALTER и DROP для кластеров, баз данных, индексов, последовательностей, синони¬ мов, таблиц и табличных пространств. Операторами манипу¬ лирования данными являются операторы INSERT, UPDATE, DELETE, SELECT и CREATE VIEW.
8 Предложения, функции, выражения и операции языка SQL Для использования языка определения данных и языка манипулирования данными из гл. 7 команды, представленные в этой главе, обычно должны сопровождаться другими корот¬ кими терминами. По необходимости некоторые из них появ¬ лялись в двух главах в связи с терминами DDL и DML. В этой главе подробно рассматриваются эти и другие связанные с ними термины, в частности следующие: • предложения FROM, WHERE, ORDER BY, GROUP BY, HAVING; • символьные, числовые, календарные, агрегатные функции} • логические, арифметические, типа CHAR (символьные) выражения} • количественные, качественные, логические операторы. Предложения Некоторые термины, обычно состоящие из одного слова, определяются как предложения. Таковыми являются: FROM, WHERE, ORDER BY, GROUP BY и HAVING.
156 Предложение FROM Предложение FROM используется вместе с командой SELECT для восстановления данных из таблицы базы данных. Запрос в общем виде будет выглядеть следующим образом: SELECT <столбец1>, <столбец2>, <столбецЗ>... FROM < имя таблицы >; Предложение FROM должно следовать за командой SELECT. Предложение FROM и команда SELECT требуются для каждого запроса языка SQL и вместе должны предшествовать любым другим предложениям в запросе. Можно поместить команду SELECT и предложение FROM в одной и той же строке или (как показано выше) в двух отдельных строках. Предложение WHERE Предложение WHERE служит для идентификации отдельного подмножества строк для восстановления из таблицы. Оно используется в виде SELECT <столбец1>, <столбец2>, <столбецЗ>... FROM < имя таблицы > WHERE <столбец> = <условие>; Предложение WHERE должно следовать за предложением FROM. Фигурирующие в предложении WHERE столбцы не должны содержаться среди столбцов из команды SELECT. Система Oracle будет возвращать каждую строку из таблицы, которая принадлежит к подмножеству, выбранному предложе¬ нием WHERE. Команда SELECT с предложением WHERE будет восстанавливать лишь те строки, которые удовлетворяют вашим условиям поиска. В предложении WHERE вы можете употреблять значения типов NUMBER, CHAR или DATE, но при использовании значений CHAR или DATE вы должны заключать их в одинарные кавычки. (Не заключайте в кавычки значения NUMBER.) С помощью предложения WHERE вы можете: 1. Сравнивать значение из столбца с числовой константой. 2. Сравнивать значение из столбца с символьной константой. Для установления соответствия между указанной константой и значением (значениями) в базе данных: • константа должна быть заключена в одинарные кавычки (если это не •число),
157 • шрифт (прописной или строчной) должен быть таким же, как у запомненного значения. 3. Сравнивать значение из столбца с арифметическим выражением, включающим значения из столбцов и/ил и кон¬ станты. 4. Сравнивать значение из столбца с другим значением из столбца. Функции, выражения и операции, комбинируемые с пред¬ ложением WHERE, описываются в разд. 'Функции языка SQL" данной главы. Предложение ORDER BY (упорядочение) Поскольку система Oracle хранит строки в произвольном порядке, единственным способом гарантировать восстановление строк в предписанном порядке является использование пред¬ ложения ORDER BY. Если это предложение отсутствует, то строки будут возвращаться в произвольном порядке. По умолчанию принимается порядок возрастания (начиная с наименьшего значения) для числовых значений и алфавитный порядок для значений типа CHAR. Убывающий порядок можно выбрать, вводя в предложение ORDER BY слово DESC после имени столбца. Если вы упорядочиваете столбцы, включающие значение NULL, то записи NULL будут всегда изображаться первыми, независимо от того, выбираете ли вы порядок возрастания или убывания. Предложение ORDER BY должно быть последним в опера¬ торе языка SELECT FROM WHERE ORDER BY SQL. Обычно оператор ORDER BY имеет вид <столбец1>, <столбец2>, <столбецЗ>... <имя таблицы > < выбранные условия > true <имя столбца>, DESC; Если вы употребляете предложение ORDER BY с календар¬ ными значениями и пользуетесь установкой по умолчанию (возрастание), то первой появится самая старая дата, за которой будут следовать менее отдаленные даты. Предложение GROUP BY Используйте предложения GROUP BY для группирования данных, над которыми необходимо выполнить вычисления. Обычно это будет выглядеть следующим образом:
158 SELECT <столбцы > или <функции> FROM < имя таблицы > WHERE < выбранные условия> true GROUP BY <имя столбца>; Например: SELECT размер_магазина FROM магазины WHERE доход > 1000000 GROUP BY размер_магазина Как всегда, предложение WHERE будет ограничивать те строки, которые будут выбраны для формирования группы. Однако предложение WHERE не является обязательным: если вы хотите сгруппировать по размеру все магазины, а не только те, для которых доход превышает 1 млн. долл., то вы могли бы опустить предложение WHERE в приведенном выше примере. Тогда все магазины будут группироваться по размеру независимо от их дохода. Если ваш запрос содержит предложение WHERE, то пред¬ ложение GROUP BY должно следовать за предложением WHERE. Если же предложения WHERE нет, то следует поместить предложение GROUP BY после предложения FROM. Дальнейшие подробности о предложении GROUP BY содержатся в разд. "Календарные функции" данной главы. Предложение HAVING Предложение HAVING должно включать только элементы GROUP BY (см. предыдущий раздел) или агрегатные функции (см. разд. "Агрегатные функции"). Оно может применяться только к групповым данным. В нем выбираются условия, которым должна удовлетворять группа. Общая форма имеет вид SELECT FROM < столбцы > или < функции > <имя таблицы > GROUP BY столбец 1... HAVING < выбранные групповые характеристики >; Предложение HAVING должно располагаться после предло¬ жения GROUP BY. Например: SELECT должность, COUNT (*) FROM служ GROUP BY должность HAVING COUNT (*) > 10;
159 В этом примере служащие будут группироваться по долж¬ ностям для всех должностей, относящихся к более чем 10 служащим. Если вы включаете в один запрос предложения WHERE и HAVING, то пакет SQL*Plus обрабатывает этот запрос следу¬ ющим образом: 1. Предложение WHERE используется для выбора строк. 2. Формируются группы, и вычисляются все групповые функции. 3. Предложение HAVING применяется для выбора групп. В следующем примере перечисляются все магазины более чем с двумя кассирами и эти кассиры группируются по номерам магазинов. SELECT номмагазин FROM служ WHERE должность = "кассир" GROUP BY номмагазин HAVING COUNT (*) > 2 Вы можете использовать предложение HAVING для сравне¬ ния признака группы с постоянным значением. Или же вы можете воспользоваться предложением HAVING для выбора группы на основе сравнения с другой группой. Если с помощью команды SELECT вы хотите выбрать группы и сравнить их с другой группой (по тому же принципу, что и при сравнении группы с константой), делайте это, включая характеристики группозого сравнения (например, константу) в подзапрос. Подзапросы рассматриваются в разд. ’’Подзапросы” в гл. 9. Функции языка SQL В этом разделе обсуждаются функции строк символов, числовых строк, дат, агрегатов (или групп) и смешанные функции. Функции строк символов Функции строк символов могут использоваться в команде SELECT, а также в предложениях WHERE и ORDER BY. Эти функции не изменяют внутренних данных. В табл. 8-1 представлены функции строк символов из языка SQL.
160 Таблица 8-1. Функции CHAR Функция Назначение CHARTOROWID (симв) Преобразует значение CHAR в строку ID Столбец || столбец Сочленяет столбцы без промежуточных пробелов DECODE (из,знач, код,.. .умолчание) Если из равняется какому-либо знач, то возвращается следующий код; если нет, то возвращение по умолчанию. Из может относиться к любому типу данных, знач должно быть тем же самым. Возвращаемое значение приводится к тому типу данных, который соответствует первому коду HEXTORAW (симв) Преобразует значение CHAR, содержащее шестнадцатеричные цифры, в двоичное значение (удобное для включения в столбец RAW) INITCAP (симв) Делает прописной первую букву каждого слова LENGTH (симв) LOWER (симв) RAWTOHEX (строк) Выдает длину строки Делает все буквы строчными Преобразует строчное значение в значение CHAR, содержащее шестнадцатеричное число ROWIDTOCHAR (идстрок) Преобразует идентификатор строки (идстроки) в значение CHAR SOUNDEX (симв) Значение CHAR, представляющее глубину слова (слов) в CHAR Строка 1 | | Строка 2 Сочленяет строки символов без промежуточных пробелов TO_CHAR (п[фмт]) Преобразует п в значение CHAR в предписанном формате. Если фмт опущен, то и преобразуется в
161 Таблица 8-1. Продолжение Функция Назначение значение CHAR точно такой длины, какая требуется для размещения значащих цифр TO_NUMBER (симв) Преобразует значение CHAR, содержащее число, в число TRANSLATE (старстр,новостр) UPPER (столбец) Подставляет символ в новостр вместо соответствующего символа старстр Преобразует строчные символы в прописные USERENV (симв) Возвращает информацию о пользователе, полезную для заполнения специализированной таблицы контрольного журнала. Если симв — это "ENTRYID” (идентификатор записи), то возвращается идентификатор доступной контрольной записи. Если "SESSIONID" (идентификатор сеанса), то возвращается идентификатор контрольного сеанса пользователя. Если "TERMINAL”, то возвращается идентификатор пользовательского терминала операционной системы Функция DECODE преобразует закодированные записи в значения кода. Предположим, например, что все магазины закодированы как (1) большие, (3) средние и (5) малые. Если вы хотите получить осмысленный перечень магазинов по размерам, то вам желателен показ декодированных значений. Для этого вы могли бы ввести следующую команду: SELECT номмагазина, размер DECODE (размер, "большой", 1, "средний", 3, "малый", 5, 2) размер_магазина FROM магазины;
162 Если в вашем списке имеются магазины, не охваченные перечисленной классификацией, но требующие некоторых дру¬ гих характеристик (например, "очень малые" или "между средним и большим"), то номер 2 в операторе DECODE обеспечивает включение всех этих магазинов под кодовым номером 2 по умолчанию. Вы можете использовать функцию DECODE для любого типа декодирования: уровней качества в арифметические вы¬ ражения, кодов занятий в соответствующие должности, номеров деталей в названия деталей и т. д. Аргументы функции DECODE определяют: 1. Столбец для декодирования (номмагазин). 2. Исходное и преобразованное значения в столбце ("боль¬ шой", 1,) и т. д. 3. Любое значение по умолчанию, в которое должны быть декодированы исходные значения, которые не выбраны в вашем операторе DECODE (2). Числовые строчные функции Числовые строчные функции могут использоваться в ко¬ манде SELECT, а также в предложениях WHERE и ORDER BY. Табл. 8-2 содержит перечисление числовых строчных функций Таблица 8-2. Числовые строчные функции Функция Описание ABS (и) CEIL (п) FLOOR (п) MOD (m,n) POWER (m,n) ROUND (n[,m]) Абсолютное значение n Минимальное целое, которое не меньше п Максимальное целое, которое не больше п Остаток от деления m на п Результат возведения m в степень п Значение п округляется до m десятичных знаков; m тиожет быть положительным или отрицательным. Если значение m опущено, происходит округление до нуля позиций. Если m отрицательно, то округление слева от десятичной точки, если положительно, то справа от десятичной точки
163 Таблица 8-2. Продолжение Функция Описание SIGN (п) Если п<0, то -1; если п>0, то 1 SQRT (п) Возвращает положительный квадратный корень из п. Если п<0, то NULL TRUNC (n[,m]) Значение п усекается до m десятичных знаков. Если ш опущено, то до 0 позиций. При отрицательном m сохраняется 0 слева от десятичной точки Функция ROUND округляет число до указанного количества десятичных знаков. Например, если вы хотите рассчитать средний дневной доход для каждого магазина в течение 30-дневного периода с округлением результата до ближайшего числа пенсов, то должны сформулировать команды типа SELECT назмагаз, доход, доход/30, ROUND (доход/30,2) FROM магазины ROUND (доход/30,2) означает, что вам нужен результат, округленный до двух десятичных знаков. Если в запросе требуется ROUND (доход/30,0) это означает, что вы желаете округлить сумму до ближайшего количества долларов (или до ближайшего целого). Функция TRUNC обрезает (усекает) числа до указанного количества десятичных знаков, не округляя их. Например, если вы усекаете 56,99 до целого, то результат равен 56, тогда как если вы округляете командой ROUND 56,99 до целого, то результат равен 57. Устанавливайте запрос с помощью команды TRUNC точно так же, как с помощью команды ROUND. Выражение TRUNC (доход/30,0) означает усечение всех чисел после десятичной точки. Однако имейте в виду, что окончательные результаты могут очень сильно отличаться от результатов округления посредством команды ROUND. Календарные функции Календарный формат по умолчанию имеет вид "ДД-МЕС-ГГ" как для входных, так и для выходных данных. Тип данных
164 дата содержит век, год, месяц, день, час, минуты и секунды, как показано в табл. 8-3. Вы всегда должны к календарному полю прибавить/вычесть число дней и/или дробные части дней. Чтобы показать время, необходимо использовать функцию TO_CHAR. Заметим, что "МГ означает минуты, а "ММ" — месяцы. SYSDATE — это зарезервированное слово, которое может служить для представления сегодняшней даты в операторе языка SQL любого типа (SELECT, INSERT, UPDATE...). Вы можете выполнять над календарными полями арифме¬ тические действия следующим образом: дата + число дата - число дата - дата Прибавляет число дней к некоторой дате и вырабатывает дату-результат. Вычитает число дней из некоторой даты и вырабатывает дату-результат. Вычитает одну дату из другой и вырабатывает в виде результата число дней между этими двумя датами. Таблица 8-3. Календарные функции Функция Назначение дата + число Прибавляет число дней дата + часы/24 Прибавляет число часов дата + минуты/(24*60) Прибавляет число минут дата + секунды/(24*60*60) Прибавляет число секунд дата - число Вычитает число дней дата - часы/24 Вычитает число часов дата - минуты/(24*60) Вычитает число минут дата - секунды/(24*60 *60) Вычитает число секунд дата - дата Определяет число промежуточных дней (дата - дата) *24 Определяет число промежуточных часов
165 Агрегатные функции (групповые функции) Агрегатные функции применяются к группам записей. Они суммируют столбец значений и возвращают одиночное значе¬ ние. Все агрегатные функции могут применяться к числовым значениям. К символьным и календарным значениям могут применяться только агрегатные функции M1N, МАХ и COUNT. В табл. 8-4 показаны агрегатные функции, поддерживаемые системой Oracle. Таблица 8-4. Агрегатные функции Функция Описание AVG ([DISTINCT |ALL]n) Среднее значение n с игнорированием пустых значений COUNT ([DISTINCT | ALL] {* | expr} ) Число применений ехрг к какому-то непустому объекту. Наличие побуждает функцию COUNT подсчитывать все выбранные строки MAX ([DISTINCT |ALL]Bbipax) Максимальное значение выраж MIN ([DISTINCT |ALL[Bbipa>K) Минимальное значение выраж STDDEV ([DISTINCT |ALL]nbipax) Стандартное отклонение для выраж с игнорированием пустых значений VARIANCE ([DISTINCT |ALL|Bbipa>K) Дисперсия для выраж с игнорированием пустых значений Чтобы найти среднее для столбца значений, пользуйтесь функцией AVG. Например, чтобы найти средний оклад кассиров, введите SELECT AVG (оклад) FROM служ WHERE должность = “кассир”
166 Для вычисления среднего будут использованы все строки, удовлетворяющие условию WHERE должность =’’кассир”. Этот запрос вернет вам одиночное значение AVG (оклад). В команде SELECT вы можете воспользоваться не менее чем одной групповой функцией, например SELECT AVG (оклад), AVG (комиссион) FROM служ WHERE должность = "продавец"; В результате будут возвращены средний оклад и средние комиссионные для всех служащих с должностью "продавец’. Функция COUNT подсчитывает число непустых значений или строк, выбранных по запросу. Если вы хотите подсчитать число уникальных элементов в списке (т. е. за исключением дубликатов), то воспользуйтесь термином DISTINCT. Например, если хотите сосчитать количество различных должностей в большой группе служащих, многие из которых занимают одинаковые должности, то вам следует установить следующий запрос: SELECT COUNT (DISTINCT должность) FROM служ WHERE город = "Чикаго" Эта команда исключит повторяющиеся значения до подсчета. При использовании зарезервированного слова DISTINCT будут приняты в расчет только уникальные значения в столбце. Существует специальная форма подсчета COUNT (*), которая обеспечивает подсчет числа строк, удовлетворяющих условиям в предложении WHERE. Например, чтобы сосчитать число служащих в конкретном отделе, потребуется запрос SELECT COUNT (*) FROM служ WHERE отдел = "торговый" При использовании агрегатных функций важно иметь в виду и пустые значения, поскольку они неявно скажутся на результатах. Вы получите различные результаты в зависимости от того, как система Oracle интерпретирует пустые значения. Функция NULL VALUE (NVL) полезна для гарантии получения вами желаемого результата. Подробно этот вопрос разбирается ниже. Сравнение групповых функций с индивидуальными функ¬ циями. Когда в команду SELECT вы включаете групповую
167 функцию, у вас нет возможности включить в ту же команду какую-то индивидуальную функцию. Например, если ваша команда начинается с имени для SELECT, то вы не можете затем указать AVG (оклад). Столбец ’’имя” содержит по значению для каждой выбранной строки, в то время как AVG (оклад) содержит единственное значение для всего запроса. Если вы комбинируете групповую функцию с индивидуальной, то система Oracle выдаст сообщение об ошибке. Однако существуют два исключения из этого правила: 1. Вы можете затребовать индивидуальные результаты на основе групповой функции в подзапросе или же групповые результаты на основе индивидуальных выборов в подзапросе. (Подзапросы рассматриваются в гл. 9.) 2. Вы можете выбирать отдельные столбцы для формиро¬ вания подгрупп. Подробнее см. в следующем разделе. Суммирование нескольких групп строк. Если вы хотите узнать средний оклад служащих в каждом из нескольких магазинов, то можете сделать отдельные запросы AVG (оклад) для каждого магазина. Однако вы можете получить ту же информацию с помощью одного запроса, используя предложе¬ ние GROUP BY. Предложение GROUP BY разделяет таблицу на группы строк, причем строки в каждой группе содержат одинаковые значения в выбранном столбце. Например, для вычисления средних окладов в каждом из нескольких магазинов вы должны ввести SELECT номмагаз, AVG (оклад) FROM служ GROUP BY номмагаз; Эта команда возвратила бы список номеров магазинов и средних окладов в каждом из них. Приведенный выше пример не содержит предложение WHERE, и поэтому предложение GROUP BY помещается после предложения FROM. Если ваш запрос содержит предложение WHERE, то предложение GROUP BY появится после такого предложения. Вы можете также разделить строки в таблице на группы, основываясь на значениях более чем в одном столбце. У вас может возникнуть желание сгруппировать всех служащих по номерам магазинов и должностям. Для этого в списке SELECT и в предложении WHERE специфицируйте как номер магазина, так и должность.
168 Включение групповой функции в подзапрос. Предположим, что вы хотите выяснить, какой из нескольких магазинов в группе приносит максимальный доход. Вы не можете ввести SELECT мимя, МАХ (доход), потому что мимя принимает некоторое значение для каждой выбранной строки, тогда как МАХ (доход) принимает единичное значение для всего запроса. Однако вы можете извлечь эту информацию с помощью подзапроса, который будет выглядеть следующим образом: SELECT мимя, город, доход FROM Магазины WHERE доход = (SELECTMAX (доход) FROM Магазины); Разнородные функции Подобными функциями являются GREATEST, LEAST и NVL. Их применение объясняется ниже. GREATEST. Вы можете выполнять некоторые вычисления с функциями. GREATEST — это функция с двумя или более аргументами. Аргументами являются имена значений, разде¬ ленные запятыми. При вычислении системой Oracle функции GREATEST ее значение представляет собой наибольшее из значений ее аргументов. Все выражения после первого преоб¬ разуются в тип первого выражения до выполнения сравнения. Соответствующий синтаксис имеет вид SELECT <имя столбца>, GREATEST (< аргумент 1 >, <аргумент2>) FROM < имя таблицы >; Например, у вас может возникнуть желание узнать, люди какой должности имеют более высокий доход, независимо от того, поступает этот доход от оклада или комиссионных. Для этого вы можете ввести следующий запрос: SELECT должность GREATEST (оклад, комиссионные) FROM служ; Функция GREATEST может возвращать значение любого типа. Тип возвращаемого значения совпадает с типом значения первого аргумента. Когда функция GREATEST применяется к календарным значениям, более позднее значение считается большим по сравнению с более ранним. При применении к
169 значениям CHAR больше то значение, которое позднее появ¬ ляется в алфавитном порядке. LEAST. Функция LEAST работает точно так же, как и функция GREATEST с той лишь разницей, что из значений своих аргументов она возвращает наименьшее. Подобно фун¬ кции GREATEST она может вернуть значение любого типа: CHAR, календарное или числовое значение в зависимости от типа первого аргумента. Функция NULL VALUE (NVL). Эта функция подставляет некоторое значение вместо пустых значений. Иногда у вас может возникнуть желание рассматривать пустые значения как нуль (или некоторое другое число). Например, если в вашей фирме служат люди, получающие комиссионные, то, возможно, следует интерпретировать пустые комиссионные как нулевые. С другой стороны, если вы обнаруживаете пустое значение в столбце, содержащем список номеров социального страхования, то было бы неуместно интерпретировать его как нулевое. Вы можете пользоваться функцией NVL для преобразования пустого значения в указанное непустое значение с целью оценки выражения. Для функции NVL требуются два аргумента: • выражение; • непустое значение. При всяком вычислении функции NVL она будет возвращать значение выражения, если это значение непустое. Если же значение выражения пустое, то она возвратит значение второго аргумента, которое является непустым. Синтаксис имеет вид NVL <х, выражение > Например, если вы хотите интерпретировать комиссионные как нуль (0) всякий раз, когда вместо них стоит левый пробел, то используйте функцию NVL следующим образом: NVL (комиссион, 0) Тогда, если вы хотите перечислить полные доходы для всех служащих в магазине №5, введите SELECT имя, оклад + NVL (комиссион,0) FROM служ WHERE номмагаз = 5 Функция NVL особенно удобна для работы с такими групповыми функциями, как AVG и SUM, в которых система Oracle будет автоматически игнорировать или засчитывать как
170 нули любые пустые значения в данных, если вы не специфи¬ цируете другого варианта посредством функции NVL. Функция NVL может возвращать символьное, календарное или числовое значение с применением тех же двух аргументов, что и выше. Выражения Выражение представляет собой группу значений и операций, которые могут быть вычислены в одно значение. Существует три типа: логические, символьные (CHAR) и арифметические выражения. Логические выражения Логическим является выражение, содержащее предложение WHERE более чем с одним условием. Примером может служить сочетание трех условий в следующем выражении: WHERE город = "Чикаго" and номмагаз = 10 and доход < 500000 Более подробно эта тема освещается в разд. ’’Булевские операторы”. Арифметические выражения Арифметическое выражение содержит два или более имен столбцов и значений столбцов, соединенных такими количест¬ венными операторами, как +, -, *, /, или заключенных между ...и.... Арифметическое выражение можно включить в команду SELECT точно так же, как вы включили бы один столбец. Например: SELECT пимя, цена, издержки_транспортировки, цена + затраты_транспортировки FROM Поставщики WHERE продукция = хлеб Этот запрос возвратит имена всех поставщиков хлеба, стоимость их продукции, транспортные расходы для такой продукции, а также столбец, содержащий сумму стоимости + транспортные расходы. Арифметическое выражение может использоваться и в предложении WHERE SELECT пимя, стоимость, транспортные-расходы FROM Поставщики WHERE транспортные-расходы < 0.05 * стоимость
171 Этот запрос возвратит имена всех поставщиков, у которых транспортные расходы составляют меньше, чем 5% стоимости их продукции. Выражения CHAR Выражение CHAR является результатом присоединения одного значения CHAR (столбца или константы) к другому с помощью операции сочленения (| |). Например, вы могли бы захотеть соединить номер магазина с городом, в котором находится этот магазин, и поместить результат соединения в один столбец, разделив два значения пробелом, тире и еще одним пробелом. Для этого нужна такая команда: SELECT номмагаз | | ’-’ | | город размещения FROM Магазины В запросе дается обозначение ’’размещения" для нового (сочлененного) заголовка столбца. В результате столбец будет выглядеть, например, следующим образом: РАЗМЕЩЕНИЯ 10 —ДАЛЛАС 12 —БОСТОН 15 —ДЕНВЕР 20 —АТЛАНТА Имейте в виду, что вы не можете выполнять арифметических действий с выражениями CHAR, даже если они случайно содержат числа. Константа CHAR всегда окружается одинарны¬ ми кавычками. Поэтому вы не можете употребить одиночную кавычку внутри константы CHAR, так как пакет SQL*Plus интерпретировал бы позицию, в которой появляется кавычка, как конец константы CHAR. Например, введет в заблуждение следующий текст: ’broker’s interests’ (проценты для маклера) Это выражение интерпретировалось бы системой Oracle как две константы: ’broker’ и ’s interests’. Во избежание такого недоразумения пользуйтесь двойными кавычками. Корректна следующая запись: ’brokers interests’
172 Операторы Предложение WHERE в запросе специфицирует условие, которое должно соблюдаться в ответе на ваш запрос. Условие, специфицируемое в предложении WHERE, состоит из трех частей: 1) имени столбца; 2) оператора сравнения; 3) имени другого столбца, значения константы или списка значений Например, рассмотрим следующий простой запрос: SELECT * FROM номагаз WHERE доход > 500 000; Перечисленными выше тремя частями предложения WHERE являются: 1) имя столбца = доход; 2) оператор сравнения = знак "больше чем", >; 3) имя другого столбца, значение константы или список, значений = 500 000 (долл.) Таким образом, при вводе запроса команда SELECT должна обеспечить проверку этой комбинации из трех элементов, для того чтобы осуществить выбор строк для обработки. Затем "оператор" формирует связь между тем, что вы уже знаете (номерами магазинов), и тем, что вы хотите узнать (какие номера магазинов соответствуют доходу, превышающему 500 000 лолл.). Операторы служат для сравнения значения столбца с числовой константой и с константой CHAR. Для выполнения таких сравнений символьная (CHAR) и календарная константы должны быть заключены в одинарные кавычки. (Для числовой константы это не требуется.) Шрифт (строчный или прописной) константы должен совпадать с шрифтом значения столбца. Кроме того, операторы служат для сравнения значения столбца с таким арифметическим выра¬ жением, как поступления/затраты, а также со значением другого столбца. Предложение с использованием оператора имеет следующий общий вид: SELECT < имя столбца>, < имя столбца>,... FROM < имя таблицы >
173 WHERE (<значение> = <константа>)<операция> (< значение > = < константа >); Например: WHERE цена = 1.25 ♦ затраты Количественные операторы Количественные операторы, выполняемые пакетом SQL*Plus, перечислены в табл. 8-5. Качественные операции (логические операции) Качественные операторы представлены в табл. 8-6. Вы можете искать значение CHAR, когда не знаете всех символов в значении. Например, вы можете искать имя поставщика, начинающееся с букв DET, даже если не знаете, как точно пишется остальная часть имени. В таком случае вы можете воспользоваться знаком % сопоставления символов в предложении WHERE, например: SELECT пимя, город FROM Поставщики WHERE пимя LIKE ’det%’; Пакет SQL*Plus возвратит все имена поставщиков, начина¬ ющиеся с DET, и названия городов, где они находятся, независимо от того, сколько букв следует за буквами DET. Таблица 8-5. Количественные операторы Оператор Значение = Равно ! = He равно > Больше > = Больше или равно between... and... Между двумя in (список) Любое значение из списка LIKE Сопоставление с образцом символов is null Является пустым значением Для отрицания оператор NOT: NOT NULL. последних четырех операторов используйте NOT BETWEEN, NOT IN, NOT LIKE и IS
174 Таблица 8-6. Качественные операторы Операции Значение % Представляет строку из любого числа символов (возможно, пустую). Может появиться в любом месте закавыченной строки, причем более одного раза подчеркивание Универсальное сопоставление. Каждое подчеркивание внутри одиночных кавычек представляет одну позицию универсального сопоставления CHAR in Эквивалентно последовательности OR (или). Например, WHERE служащий in отдел 30, 42, 52 означает то же самое, что WHERE служащий is in отдел 30 OR 42 OR 52 like "Сопоставляет следующий образец". ’%’ сопоставляет любую строку символов, сопоставляет любой одиночный символ not Обращает результат условия not in Эквивалентно последовательности отрицательных and NULL Означает отсутствие данных; не обязательно то же самое, что шуль. Не занимает памяти в строке и не обязательно равняется другому значению NULL Знак % сопоставления символов может использоваться в любой точке строки символов и появиться более одного раза. Например, если вы знаете, что имя поставщика закапчивается буквами "Нил", но не знаете, является ли полным именем МакНил или О’Нил, вам следует установить такое предложение WHERE: WHERE пимя LIKE И%нил"; При большом списке использование знака % сопоставления символов может привести к возврату очень многих строк. Вы можете сократить их число, если допускаете ошибку только в одной букве искомого имени (или другого элемента). Например,
175 если вы знаете, что имя — не то Джонсон, не то Джонсен, то вы можете воспользоваться подчеркиванием, т. е. универсаль¬ ным сопоставлением для представления неизвестной буквы. Чтобы найти искомое имя, установите такое предложение WHERE: WHERE пимя like ’джонс_н’; Как и знак процентов, подчеркивание может использоваться в строке символов несколько раз. Поэтому, если вы сомневаетесь в нескольких буквах в имени (или другом элементе), которое пишется, например, не то "хэвиган", не то "хэвиген" или "хевикэн", установите предложение WHERE с подчеркиванием на месте каждой сомнительной буквы WHERE пимя LIKE ’х_ви н’; Каждое подчеркивание представляет только один символ. Поэтому если вы не уверены в том, сколько букв содержится в последующей части имени (или другого элемента), то у вас может возникнуть желание скомбинировать использование подчеркивания и знака процентов следующим образом: WHERE пимя LIKE ’х__ви%н’; Тем самым гарантируется, что имя будет найдено, незави¬ симо от того, сколько букв отсутствует в том месте, где вы поставили знак процентов %. Слово NOT может употребляться для отрицания LIKE. За счет этого команда SELECT будет выбирать все строки, которые ‘ не соответствуют образцу, специфицируемому вами с помощью этих операций. Булевские операторы (AND и OR) Операторы AND и OR называются в математике "булевскими соединителями". В системе Oracle они используются, когда необходимо специфицировать более чем одно качество элемента, выбираемого посредством команды SELECT. Как показано выше, операторы AND и OR могут употребляться в предложе¬ ниях WHERE. Соединение условий с помощью операций AND. Операция AND служит для восстановления строк, удовлетворяющих более чем одному условию. Число условий, которые должны быть удовлетворены, равно увеличенному на единицу количеству операций AND. Чтобы восстановить некоторую строку, для нее
176 должны быть истинными и условие, предшествующее AND, и условие, следующее за AND. Если вы знакомы с булевой алгеброй, то узнаете в операции AND пересечение двух или более множеств. Например: WHERE город = "Чикаго" AND доход > 500000; Соединение условий с помощью операции OR. Операция OR служит для восстановления строк, удовлетворяющих одному, двум или более заданным условиям. Чтобы восстановить некоторую строку, требуется, чтобы было истинным только одно условие, специфицированное в операции OR, но может удовлетворяться и несколько условий. В булевой алгебре операция OR образует объединение двух или нескольких множеств. Например: WHERE город = "Чикаго" OR доход > 500000; Старшинство операций Операции AND и OR могут использоваться в одном предложении WHERE. Если они появляются одновременно в одном и том же предложении WHERE, то сначала выполняются все AND, а затем выполняются все OR, поскольку оператор AND старше опер? гора OR. В системе Oracle все операции упорядочены в некоторой иерархии, которая определяет, какие операции выполняются раньше. В любом выражении операции выполняются в порядке присвоенного им старшинства от самого высокого до самого низкого. Если операторы в запросе имеют одинаковое стар¬ шинство, то они выполняются в том порядке, в каком вы разместили их в запросе, слева направо. В табл. 8-7 перечислены некоторые логические операторы в порядке их старшинства. Если вы хотите изменить эту установленную иерархию старшинства, то можете сделать это с помощью скобок. Часть выражения внутри скобок будет вычисляться до остальной части выражения. Например, по-разному будут вычисляться следую¬ щие два предложения WHERE: 1. WHERE оклад > 50000 AND должность = "менеджер" OR должность = "контролер" 2. WHERE оклад > 50000 AND (должность = "менеджер* OR должность - "контролер")
177 Предложение WHERE, помеченное номером 1, возвратит список всех менеджеров с окладами свыше 50 000 долл, и всех контролеров, независима от их окладов. Дело в том, что сначала вычисляются значения с обеих сторон от AND. Таблица 8-7. Иерархия некоторых операторов Оператор Функция Пример 0 Подавляет обычные правила старшинства операций SELECT (X+Y)/(X-Y) + - Знак, предшествующий QTYSOLD = -1 числовому выражению WHERE A < -(5*B); * / Умножение и деление SELECT 2*X + 1 WHERE X > Y/2; + - Сложение и вычитание SELECT 2*S + 1 WHERE X > Y - Z; II Сочленение значений CHAR Код := код||подкод := Присваивает значение переменной пользователя X: = 15; Предложение WHERE, помеченное номером 2, возвратит список всех менеджеров и контролеров с окладами свыше 50 000 долл. Дело в том, что выражение внутри скобок будет вычислено первым. Поэтому при составлении запроса важно учитывать стар¬ шинство операций, но иногда бывает трудно определить или вспомнить точное старшинство. В таком случае всегда оказы¬ вается проще подавить старшинство за счет использования скобок, чтобы гарантировать, что запрос возвратит именно то, что вы ищете. Имейте в виду, что в иерархии скобки всегда старше всего остального. Заключение В этой главе иллюстрируются предложения, функции, выражения и операции языка SQL, необходимые для констру¬ ирования операторов и запросов SQL. Обсуждаются предложе¬ ния FROM, WHERE, ORDER BY, GROUP BY и HAVING, символьные, числовые, календарные, агрегатные и разнородные функции, логические, арифметические и символьные (CHAR) выражения, количественные, качественные и логические операции.
9 Использование системы Oracle В этой главе представлены способы обработки данных с целью удовлетворения ваших потребностей. В зависимости от размера вашей базы данных и специальных требований вашей вычис¬ лительной установки вы можете счесть целесообразным пользо¬ ваться некоторыми или всеми описываемыми здесь методами. Операторы COMMIT и ROLLBACK должны использоваться в любых системах. В зависимости от задач вашей реализации вам могут оказаться полезными псевдонимы, соединения, уравнивающие соединения и подзапросы. Обработка транзакций В базе данных следует организовывать работу по логическим группам, а не по отдельным элементам. ’’Логическое группи¬ рование" можно рассматривать как группирование, сохраняющее согласованность базы данных, тогда как любая отдельная команда в группе не обеспечивает этого. Например, если было введено увеличение в "числе проданных элементов", база данных может потерять согласованность до тех пор, пока "запасы" не будут уменьшены на то же количество. В такой ситуация транзакция представляет собой группу изменений, которые образуют логическую группу записей, и
179 ваша база данных должна проектироваться на основе транзакций как базовых элементов вашей реализации, а не на основе Отдельных записей. В общем случае транзакцию можно опре¬ делить как изменения, внесенные в базу данных между операторами COMMIT, которые вводят группу изменений в базу данных. Размеры транзакций и частота, с которой они регулярно вводятся в базу данных, будут влиять на запросы замков для таблиц и строк, на количество данных, теряемых при отказе системы, а в мультипрограммной системе и на вероятность возникновения тупиковых ситуаций. Поэтому следует увязывать понятия внесения данных с согласованием и обратной про¬ крутки введенных, но не согласованных данных с понятием логических единиц работы. Для продолжительных задач, состоящих из многих этапов, команда SAVEPOINT позволяет вам сохранять части работы, так что если для данного этапа необходима обратная прокрутка, то заново потребуется вводить заново не всё этапы транзакций. COMMIT (внесение данных с согласованием) Такие изменения, как применение команд INSERT, DELETE или UPDATE, следует вносить групповым образом как логи¬ ческие транзакции, а затем согласовывать с базой данных оператором COMMIT. Тем самым гарантируется согласован¬ ность и целостность данных. До появления оператора COMMIT внесенные изменения заметны только для пользователя, кото¬ рый выполняет их. После появления оператора COMMIT изменения становятся видимыми для всех пользователей. До появления оператора COMMIT изменения могут коррек¬ тироваться, пересматриваться или исключаться (см. обратную прокрутку) даже без вхождения в базу данных. После появления оператора COMMIT изменения можно корректировать, пере¬ сматривать или исключать только путем применения к ним другой команды INSERT, UPDATE или DELETE. Оператор имеет общий вид COMMIT [WORK] Ключевое слово WORK является необязательным и не оказывает никакого воздействия. После отказа системы будут сохранены только те изменения, к которым применялся оператор COMMIT.
180 Переключение на вариант AUTOCOMMIT приведет к тому, что COMMIT будет применяться к каждому изменению сразу после появления такого изменения. Хотя может показаться желательным поступать так при всяком внесении изменения, на самом деле для этого нет оснований. Вариант AUTOCOMMIT следует использовать, когда вносимые изменения не являются логически связанными. Если он применяется при внесении логически связанных изменений, то, как показано выше, в правильно спроектированной системе база данных может отвергнуть часть изменений в силу их несогласованности. Поскольку одна команда INSERT, UPDATE или DELETE может привести к изменению многих строк, то следует принимать меры предосторожности, чтобы не вносить слишком много изменений до появления оператора COMMIT. Приме¬ нение оператора COMMIT сразу к очень многим изменениям истощит систему. Кроме того, коль скоро отказ в системе произойдет до согласования оператором COMMIT большого количества изменений, то все эти изменения требуется восп¬ роизвести при восстановлении системы. Поэтому желательно частое, но разумное использование оператора COMMIT. Следующие команды приводят к автоматическому приме¬ нению оператора COMMIT: ALTER AUDIT CREATE DISCONNECT DROP EXIT GRANT NOAUDIT QUIT REVOKE Если вы только что ввели другие транзакции и еще не согласовали их оператором COMMIT, а теперь вводите одну из перечисленных выше команд, то вся прежняя несогласован¬ ная работа будет теперь обработана оператором COMMIT. В результате завершается единица работы, которую вы выполнили. Точка сохранения Если вы занялись большой задачей из нескольких частей (и, возможно, хотите вернуться назад и проверить части до того, как фактически согласовывать оператором COMMIT всю транзакцию), может оказаться полезным отметить точки сохранения. Таким образом, если вы совершили ошибку, то вам не понадобится запускать каждый оператор заново. Кроме того, точки сохранения полезны, если вы работаете над прикладной программой, содержащей несколько частей. Вы можете создать точку сохранения перед каждой частью. Тогда
181 в случае отказа какой-то части вы можете внести исправление и выполнить эту часть заново, вместо того чтобы повторять всю программу. Синтаксис создания точки сохранения имеет вид SAVEPOINT <ид точка сохранения> Здесь ид точка сохранения — это идентификатор языка SQL или "главная переменная". Например: SAVEPOINT новый_служащий SAVEPOINT обновление SAVEPOINT :varx Потом вы можете либо согласовать работу оператором COMMIT WORK, либо провести обратную прокрутку к точке сохранения, введя ROLLBACK WORK ТО <ид точка сохранения > Если вы хотите создать другую точку сохранения в рамках той же транзакции и не терять прежнюю точку сохранения, то вы должны присвоить новой точке сохранения другой идентификатор, поскольку повторное использование того же самого идентификатора удаляет точку сохранения, которую вы создали ранее. По умолчанию вы можете употребить пять активных точек сохранения, однако можно изменить этот предел, заменив значение параметра SAVEPOINT в INIT.ORA. Абсолютный предел составляет 255. Обратная прокрутка Обратная прокрутка отменяет те изменения, которые завер¬ шены, но не согласованы оператором COMMIT с базой данных. В результате база данных остается в таком виде, как будто изменения никогда не вносились. Общая форма задания обратной прокрутки имеет вид ROLLBACK WORK Как и в операторе COMMIT, ключевое слово WORK является необязательным и не оказывает воздействия. Обратная прокрутка выполняется автоматически для всех пользователей, когда система Oracle восстанавливается после системного отказа. Команды, к которым автоматически при¬ меняется COMMIT (см. список), не могут подвергаться обратной прокрутке. Обратную прокрутку будут вызывать некоторые ошибки, например попытка вставить в столбец
182 некачественную запись, дубликат записи или неверное число. Однако синтаксические ошибки, обнаруженные при граммати¬ ческом разборе, не приведут к обратной прокрутке. Использование псевдонимов Если из-за частого употребления целесообразно сократить имена таблиц, вы можете воспользоваться псевдонимами для этих имен. Для этого вам нужно определить псевдонимы в предложении FROM. Например, мы можем сократить "Пекарни” до буквы П, ’’Консервные заводы” до буквы К, определив псевдоним в предложении FROM. Отделяйте каждый псевдоним от имени таблицы пробелом. SELECT пимя, пместо, кимя, кместо FROM Пекарни П, Консервные заводы К WHERE ... AND С другой стороны, может оказаться, что уже сокращенные имена столбцов в вашей базе данных отличаются от тех имен, которые вы хотели бы видеть распечатанными. При чтении печатного отчета нелегко догадаться, что такое имя голбца, как AVG (ргс), означает среднюю цену. Поэтому у вас может возникнуть желание, чтобы система Oracle при ответе на ваш запрос печатала "псевдоним”. Для этого в качестве псевдонима используйте расшифровку значения названия вашего столбца в базе данных, например: SELECT продукция, AVG (pre) ’средняя цена’ FROM Поставщики WHERE ... Одинарные кавычки, в которые взят термин "средняя цена", необходимы для того, чтобы указать, что, хотя средняя и цена — это два слова, в ответе они должны появиться как единый псевдоним в тех случаях, когда пакет SQL*Plus обычно напечатал бы имя столбца AVG (pre). Если псевдоним является одним словом, то кавычки не требуются. Соединения Соединение возникает, когда запрос требует информацию из двух или более таблиц, в которых одна переменная общая. Синтаксис простого соединения имеет вид
183 SELECT <имя_столбца> FROM <имя таблицы 1 >,<имя таблицы 2> WHERE <имя_столбца из таблицы 1 > = симястолбца из таблицы2> В сущности, приведенное выше соединение следовало бы называть ’’уравнивающим соединением", поскольку между име¬ нами столбцов в предложении WHERE имеется знак равенства. Поскольку это наиболее распространенный вид соединения, его обычно называют просто "соединением". В разделе "Неуравни¬ вающие соединения" мы рассматриваем такие соединения, для которых столбцы в предложении WHERE не равны друг другу. Пример соединения возникает, когда вам нужен список всех таких оптовых поставщиков хлеба и овощных консервов, которые находятся в одном и том же городе. Данные поступают из таблиц, содержащих информацию об оптовых поставщиках хлеба и овощных консервов, причем общим элементом является город. Эта информация восстанавливается следующей командой: SELECT П.*,К.* FROM Пекарни П, Консервные заводы К WHERE П.город = К.город Это является "соединением" таблиц Пекарни и Консервные заводы по общему столбцу Город. Соединение представлении Если вы хотите создать представление па основе столбцов более чем из одной таблицы, то определите представление с помощью запроса, содержащего соединение. Ниже приводится соответствующий пример для выбора из двух таблиц. CREATE VIEW (< имя представления> <имя столбца 1 из представления >, <имя столбца 2 из представления>)AS SELECT <имя столбца из таблицы 1 >, <имя столбца из таблицы 2> FROM <имя таблицы 1 >,<имя таблицы 2> WHERE < имя столбца из таблицы 1 > = <имя столбца из таблицы 2> Имена столбцов из представления заключаются в скобки, чтобы указать системе Oracle, что они будут именами столбцов в представлении, создаваемом командой CREATE. Их порядок
184 должен соответствовать порядку имен столбцов в команде SELECT. Если имена столбцов в представлении должны совпадать с именами столбцов в двух таблицах, из которых требуется выбирать эти столбцы, то вам не нужно именовать эти столбцы в операторе CREATE. Вы не можете применить команды UPDATE, INSERT или DELETE к представлению, составленному более чем из одной таблицы. Соединение в одном представлении более чем двух таблиц Вы можете соединить в одном представлении любое коли¬ чество таблиц. Если вы хотите сразу посмотреть на представ¬ ление поставщиков нескольких различных видов продукции, то можете соединить подходящие столбцы из отдельных таблиц для каждого типа поставщика точно так же, как при соединении двух таблиц. Соединение таблиц с представлениями Вы можете также соединять представления с таблицами или другими представлениями точно так же, как при соединении двух таблиц друг с другом. Пользуйтесь созданными вами в представлении именами столбцов так, как будто это имена столбцов в таблице. Если вы хотите скомбинировать все столбцы из созданного вами представления с некоторым столбцом из таблицы, воспользуйтесь обозначением имя_представления.*, например: SELECT <имя_представления>.*, <имя_столбца из таблицы > FROM <представление, таблица> Неуравнивающие содннення Существует несколько типов соединений. Когда вы соеди¬ няете две таблицы посредством знака равенства ( = ), это называется "уравнивающим соединением". Все другие соедине¬ ния являются "неуравнивающими", поскольку отношение между соединенными объектами не представляется знаком равенства. Соответствующий синтаксис подобен синтаксису, который показан для соединений в разд. "Соединение представлений", с той лишь разницей, что предложение WHERE должно показы¬ вать неравенство вместо знака равенства, как в следующем примере:
185 WHERE <имя столбца из таблицы 1 > != <имя столбца из таблицы 2> ; или WHERE <имя столбца из таблицы 1 > > <имя столбца из таблицы 2>; или при использовании между двумя именами столбцов любых других арифметических выражений, отличных от знака равенства ( = ), например: WHERE X.оклад > Y.оклад WHERE Х.ном_служ != У.ном_служ WHERE Х.оклад < Y.оклад Как в уравнивающих, так и в неуравнивающих соединениях столбец из одной таблицы можно соединить со многими столбцами из другой таблицы. Другие соединения Внешнее соединение представляет собой строку, которая не удовлетворяет условию соединения. Предположим, что вы хотите изобразить те строки из первой таблицы, перечисленной в вашем условии соединения, которые не удовлетворяют условию из второй таблицы. Для этого воспользуйтесь в конце вашего предложения WHERE символом внешнего соединения ( + ). Тогда несогла- сующиеся строки будут изображены наряду с согласующимися и в каждом столбце, который соответствует столбцу из второй таблицы, появится пустое значение NULL. Соединение таблицы с самой собой Вы можете соединить одну строку в таблице с другой строкой из той же таблицы, специфицировав соединительные столбцы в предложении WHERE. Например, предположим, что у вас имеется таблица, в которой перечислены кассиры и менеджеры с указанием их окладов и личных номеров. Вы хотите связать каждого кассира с его менеджером всякий раз, когда кассир зарабатывает больше, чем менеджер. Вы должны соединить соответствующие строки кассира и менеджера из таблицы следующим образом: SELECT Кассир.симя, Кассир.оклад, Менеджер.симя, Менеджер.оклад
186 FROM Служащие кассир, Служащие менеджер WHERE Кассир.менеджер = менеджер.номслуж AND Кассир.окпад > Менеджер.окпад; Подзапросы (вложенные команды SELECT) Подзапрос — это запрос внутри запроса. Он представляет собой дополнительное условие, помещенное во внешнем запросе. Иначе говоря, подзапрос — это запрос, содержащийся в предложении WHERE из другого запроса. Подзапросы обеспе¬ чивают вам результаты, необходимые для завершения основного запроса. Они полезны, когда вы хотите выбрать из таблицы строки с помощью условия, которое зависит от того, какие данные находятся в таблице. Вам разрешается пользоваться подзапросами всякий раз, когда вы можете употребить предложения WHERE, в частности в командах SELECT, INSERT, UPDATE и DELETE. Помните, что вы всегда должны заключать подзапросы в скобки. Обычно подзапрос сводится к выражению SELECT-FROM-WHERE, которое вложено внутрь другого такого выражения. Кроме того, подзапрос может включать в себя предложения GROUP BY и HAVING, но не может включать предложения ORDER BY или HAVING. Вы можете помещать подзапросы внутри подзапросов (всего до 16 подзапросов, связанных с запросом более высокого уровня). Далее приводится пример простейшего подзапроса. Предпо¬ ложим, что вы хотите знать имена всех поставщиков, которые поставляют такую же продукцию, как фирма X. Для осущест¬ вления этого вам потребовались бы два запроса: один для выяснения, какую продукцию поставляет фирма X, и другой для поиска других поставщиков, которые могут предоставлять ту же продукцию. Вместо того чтобы прибегать к двум запросам, вы можете обойтись одной операцией с использованием подзапроса. Система обрабатывает эту операцию, рассматривая сначала подзапрос. Иначе говоря, она сначала ищет продукцию, постав¬ ляемую фирмой X. Затем она отвечает на остальную часть запроса. Очевидно, что этот метод более эффективен, по сравнению с первоначальным рассмотрением большей группы поставщиков, а затем прослеживанием в этой группе для фиксации членов меньшей группы, состоящей из поставщиков
187 такой же продукции, какая поступает от фирмы X. С запросом можно справиться, используя следующий подзапрос: SELECT пимя, продукция FROM Поставщики WHERE продукция = (SELECT продукция FROM Поставщики WHERE пимя =‘X’; Команда всегда будет выполняться отрабатыванием от последнего (самого внутреннего) SELECT обратно к первому, за исключением случая соотносимых подзапросов, рассматри¬ ваемых в разд. "Соотносимые подзапросы". Все аналогичные подзапросы можно записать в виде последовательности соединений JOIN. Результат будет тем же самым. Целесообразность использования подзапроса или по¬ следовательности соединений будет зависеть от того, какой вариант лучше подходит для вашей цели или какой вариант кажется вам более удобным способом выражения запроса. Возврат множества значений: ANY и ALL Поскольку употребление операций ANY и ALL может привести к путанице и чревато ошибками, мы предлагаем вам использовать вместо них операцию EXISTS. Она применима к случаям, когда вы могли бы использовать ANY и ALL, причем использование EXISTS даст вам искомый ответ с большей вероятностью. Проверка существования Условный подзапрос EXISTS обеспечивает поиск данных, которые можно или нельзя включить в искомую таблицу. Если данные находятся в ней, то считается, что подзапрос "истинен", если данных в ней нет, то — "ложный". (С точки зрения формальной логики, подзапрос EXISTS в этом контексте является квантором существования.) Например, предположим, что вы хотите перечислить все имена поставщиков (из таблицы поставщиков) для тех поставщиков (если они существуют), которые поставляют продукцию П1 (из таблицы продукции). Вы установили бы запрос и подзапрос следующим образом: SELECT пимя, FROM Поставщики
188 WHERE EXISTS (SELECT * FROM Продукция WHERE ном_П = ’П1’); Заметим, что этот предикат представляется выражением (SELECT * FROM...) в подзапросе с использованием операции EXISTS. Применение EXISTS представляет собой другой способ установки запроса, при котором вы можете использовать либо IN, либо JOIN. На самом деле любой запрос, который вы можете выразить с помощью IN, можно выразить с помощью EXISTS. Однако обратное утверждение неверно (т. е. не для всякого запроса с использованием EXISTS вы можете произ¬ вести эквивалентную замену на использование IN). Возврат списка значений: IN и NOT IN Вы можете подставить IN вместо =ANY и NOY IN вместо !=ALL. Чтобы перечислить поставщиков в Чикаго, которые предоставляют ту же продукцию, что и какой-либо ваш поставщик из Далласа, введите SELECT пимя, продукция FROM Поставщики WHERE город = ’Чикаго’ AND продукция IN (SELECT продукция FROM Поставщики WHERE город = ’даппас’); В этом примере подзапрос возвращает список продукции, предоставляемой поставщиками из Далласа. Основной запрос выбирает поставщиков из Чикаго, продукция которых входит в список, возвращаемый по подзапросу. Возврат более одного столбца Рассмотренные до сих пор подзапросы выбирают только один столбец из таблицы, но вы можете выбирать и более одного столбца. Если устанавливается подзапрос для выбора более одного столбца, вы должны заключить в скобки столбцы справа от операции сравнения. Предположим, что вы хотите перечислить поставщиков, которые предоставляют такую же продукцию и за ту же цену, что Джонс, консервный завод
189 которого запрашивает 10 долл, за одну упаковку. Чтобы перечислить поставщиков с той же продукцией и той же расценкой, как у Джонса, введите SELECT" пимя, продукция, цена FROM Поставщики WHERE продукция, цена = (SELECT продукция, цена FROM Поставщики WHERE пимя = ’джонс’); Множественные подзапросы Предложение WHERE из запроса может содержать любое количество условий с подзапросами, соединенных операциями AND и OR. Чтобы перечислить поставщиков, у которых либо такая же продукция, как у Джонса, либо цена не меньше, чем у Смита, и при этом упорядочить их по продукции и цене, введите SELECT пимя, продукция, город, цена FROM Поставщики WHERE продукция IN (SELECT продукция FROM Поставщики WHERE пимя = ’джонс’) OR цена > = (SELECT цена FROM Поставщики WHERE пимя = ’смит’) ORDER BY продукция, цена; Подзапросы, которые относятся более чем к одной таблице Операции UNION, INTERSECT и MINUS полезны для конструирования подзапросов, которые относятся более чем к одной таблице. Однако эти три операции налагают определенные ограничения на те запросы, к которым они применяются. Запросы (или подзапросы), содержащие операции UNION, INTERSECT и MINUS, должны выбирать одинаковое количество столбцов, и выбранные столбцы должны быть одного и того же типа. Не требуется, чтобы у них была одинаковая длина, однако эти запросы не могут относиться к какому-либо столбцу типа LONG. Предложение ORDER BY в запросе, заключающем UNION, intersect или MINUS, должно использоваться только один
190 раз, и оно должно находиться в конце всего запроса, а не в конце каждого оператора SELECT. Вы не можете специфици¬ ровать порядок столбцов по именам, потому что их имена могут оказаться различными в каждой запрашиваемой таблице. Вместо этого вы должны специфицировать их по их позициям в каждом списке из SELECT. Например, предположим, что у вас имеется несколько сходных по структуре таблиц, содержащих записи о поставщиках различных видов продукции. Чтобы сформировать запрос о двух таких таблицах, упорядоченных по номеру поставщика, вы должны ввести SELECT FROM UNION SELECT FROM ORDER BY пимя, ном_продукции Поставщики A пимя, ном_продукции Поставщики В Поставщики А Соотносимые подзапросы (соотносимые вложенные операторы SELECT) До сих пор рассматривались такие подзапросы, что каждый подзапрос выполнялся один раз, а затем результирующее значение использовалось в предложении WHERE основного запроса. Вы можете установить и такой подзапрос, который исполняется неоднократно. Для этого процесса нам нужно ввести понятие кандидатурной строки, т. е. строки, которая может после того, как будут выполнены определенные операции, удовлетворить условиям в запросе. Например, предположим, что вы хотите найти поставщиков, которые запрашивают за данную продукцию больше средней цены этой продукции у всех поставщиков. Мы не можем выявить этих поставщиков простым просмотром таблицы поставщиков. "Кандидатурные строки” представляют тех по¬ ставщиков, для которых установленные ими цены будут сравниваться со средней ценой предлагаемой ими продукции. Вычисление может проходить следующим образом: 1) устанавливается основной запрос для выбора поставщиков из таблицы Поставщики SELECT продукция, пимя, цена FROM Поставщики
191 WHERE пцена > (средняя цена продукции поставщика - кандидата); 2) затем устанавливается подзапрос для вычисления средней цены продукции каждого поставщика - кандидата SELECT AVG (цена) FROM Поставщики WHERE продукция = (продукция поставщика - кандидата); Основной запрос будет рассматривать каждую кандидатурную строку. Делая это, он должен возбуждать подзапрос и сообщать ему о продукции поставщика. Затем подзапрос должен вычис¬ лить среднюю цену для этой продукции поставщика. Наконец, основной запрос должен сравнить установленную поставщиком цену со средней ценой данной продукции. Описанный выше подзапрос называется соотносимым под¬ запросом, поскольку каждое выполнение подзапроса соотносится со значением некоторого поля в одной из кандидатурных строк основного запроса. Чтобы установить подзапрос, вам в качестве псевдонима таблицы следует использовать букву X (или другое имя — псевдоним). Буква X появляется в показанном ниже основном запросе (FROM Поставщики X) и в подзапросе (WHERE Х.продукция = продукция). В подзапросе псевдоним таблицы X относится к значению продукции из кандидатурной строки, т. е. к продукции поставщика - кандидата. Когда подзапрос исполняется для каждой из кандидатурных строк основного запроса, он сравнивает значение продукции из кандидатурной строки (Х.продукции) со значением продукции в каждой строке таблицы (...= продукция). Он возвращает среднее значение AVG (цена), вычисленное по выбранным строкам. Полный соотносимый подзапрос устанавливается следующим образом: SELECT продукция, пимя, цена FROM Поставщики X WHERE цена > (SELECT AVG (цена) FROM Поставщики WHERE Х.продукция = продукция); Суть сказанного выше можно сформулировать следующим образом: соотносимый подзапрос получает сигнал по ссылке
192 на псевдоним таблицы. Псевдоним таблицы ссылается на значение столбца в каждой кандидатурной строке. Подзапросы с использованием команды INSERT Вы можете использовать команду INSERT для копирования строк из одной таблицы в другую, если замените обычное предложение VALUE в команде INSERT на подзапрос. Напри¬ мер, предположим, что вы только что наняли несколько новых продавцов, которые раньше были перечислены в списке претендентов на работу. Теперь вы хотите добавить сведения об этих новых сотрудниках в вашу таблицу персонала. Сделайте это следующим образом: INSERT INTO Персонал (симя, работа, оклад) SELECT пимя, работа, оклад FROM Претенденты WHERE работа = ’продавец’); Подзапросы с использованием предложения AS Предложение AS полезно, когда вы хотите копировать строки из некоторой таблицы в создаваемую вами новую таблицу. Создание таблицы и копирование в нее строк можно выполнить одной командой. Такая процедура описывается в гл. 7. Подзапросы обновления строк Вы можете воспользоваться подзапросом для обновления указанной группы строк в таблице. Подзапрос помещается после предложения WHERE. Эта процедура объясняется и иллюстри¬ руется в гл. 7. Подзапросы для обновления значений Вы можете использовать подзапрос в предложении SET из команды UPDATE, но он должен возвратить ровно одну строку и столько же столбцов такого же типа, как и обновляемые столбцы. Эта процедура объясняется в гл. 7. Заключение В этой главе рассматривается понятие обработки транзакции и объясняется использование операторов языка SQL. Иллюст¬ рируются различные типы соединений, а также разнообразные применения подзапросов.
Оптимизация производительности Существуют два основных понятия, относящиеся к точной настройке системы баз данных для максимальной производи¬ тельности: оптимизация использования памяти и оптимизация дискового ввода/вывода. Иначе говоря, цель состоит в опти¬ мизации как обработки, так и хранения. Оптимальный результат получается тогда, когда нагрузка как для памяти (ЦПУ), так и для ввода/вывода точно сбалансирована, причем ЦПУ и диски работают настолько взаимосвязанно, насколько это возможно для достижения 100%-ной пропускной способности. Ответственность за достижение наилучшей общей произво¬ дительности базы данных возлагается в первую очередь на администратора базы данных, однако всем пользователям полезно знать, что требуется для достижения хорошей произ¬ водительности, особенно при построении запросов на языке SQL и при работе с индексами и кластерами, описываемыми далее в этой главе. В первую очередь производительность зависит от того, насколько хорошо проектировщик системы знает теорию реляционных баз данных и ее практическое применение. (Проектирование баз данных обсуждается в гл. 18.) Существует сколько угодно способов установки таблиц в базе данных. Окончательный результат должен в максимальной степени
194 основываться на преимуществах реляционной теории и за счет этого быть максимально эффективным. Обычно имеются по крайней мере два способа формулиро¬ вания запроса на языке SQL, продолжительное использование языка покажет наблюдательному пользователю, что один опе¬ ратор на языке SQL более эффективен, чем другой. Аналогично повышению эффективности может способствовать употребление предложений ORDER BY, GROUP BY и JOIN. Администратор базы данных и проектировщик приложений могут повысить эффективность работы всех пользователей, уточнив параметры для INIT.ORA и установки базы данных по умолчанию. Кроме того, повышению вашей производительности будут способствовать сведения об операционной системе, которые вы найдете в руководстве по установке и инструкции пользователю для вашей системы. Оптимизация в системах индивидуального пользования В системе индивидуального пользования основной выигрыш достигается за счет проектирования баз данных. Первостепен¬ ную важность имеют способы хранения данных и организации таблиц. Поэтому если индивидуальный пользователь не обладает фундаментальными знаниями для глубокого проникновения в теорию реляционных баз данных и в ее приложения и не располагает временем для приобретения таких знаний, то прислушаться к профессиональному совету в начале проекти¬ рования своей базы данных ему было бы неплохо. Однако существует еще много способов, посредством которых индивидуальный пользователь может повысить производитель¬ ность своей работы за счет эффективного применения индексов, предложений и других операций, рассматриваемых в этой главе. Настройка при начальной установке системы Некоторые методы оптимизации производительности могут быть реализованы лишь при начальной установке системы. К их числу относятся описанные в руководстве по установке и инструкции пользователю для вашей операционной системы структуры каталогов или дисковые размещения для файлов системы Oracle, рекомендации относительно хранения и запо¬
195 минания, привилегии и приоритеты процессов, общий код Oracle, непосредственный доступ к памяти и загрузка во время работы системы. К общим факторам оптимизации производи¬ тельности относятся: Установка приоритетов процессов. Если вы повышаете приоритет фоновых процессов, это не оказывает значительного воздействия на производительность системы. Однако вы можете благоприятно повлиять на производительность, если повысите приоритеты процессов пользователей, которые активно работают с системой Oracle. Исключение фрагментации диска. Создайте базу данных на пустом диске или воспользуйтесь программой поддержания диска или оптимизации диска. Тем самым будет обеспечена непрерывность ваших файлов базы данных на диске, а это будет способствовать лучшей интеграции СУРБД Oracle и вашей операционной системы. Выбор размера блока ввода/вывода. Если ваша операци¬ онная система позволяет специфицировать количество байт данных в одном вводе/выводе, то вам повезло. Размер ввода/вывода в байтах должен быть не меньше, чем размер блока Oracle. Если размер ввода/вывода в байтах больше размера блока Oracle, то он должен быть четным кратным размера блока Oracle (например, если размер блока Oracle равен 2К байт, то размер ввода/вывода должен составлять 2, 4 или 8К байт). Конфигурирование доступа к данным на многих дисках. Помимо программных файлов Oracle и файлов пользователей, СУРБД Oracle требует: • один или более файлов базы данных; • два или более файлов регистрации действий (оперативная регистрация действий); • один или более файлов управления. В случае отказа устройства хранения данных оптимальное размещение этих файлов влияет как на производительность, так и на стратегии восстановления. Поэтому корпорация Oracle рекомендует размещать: 1). файлы регистрации действий на диске отдельно от файлов базы данных, потому что для файлов регистрации действий требуется напряженный ввод/вывод. (Файлы регистрации дей¬ ствий могуг находиться все на одном и том же диске, поскольку каждый раз запись производится только в один из них.);
196 2) . различные файлы баз данных на отдельные диски, чтобы избежать конфликтов на дисках и расширить параллельный доступ; 3) . дубликатные копии файлов управления на разные диски. Создание дополнительных сегментов обратной прокрутки. Чем больше сегментов обратной прокрутки у вас имеется, тем в большей степени вы уменьшите вероятность образования очередей из многочисленных пользователей системы, основы¬ вающейся на транзакциях. Вы можете создать сегменты с параметрами хранения INITIAL 50К и NEXT 50К. Позаботьтесь о том, чтобы присваивать имена каждому новому сегменту в списке сегментов для параметра ROLLBACK-SEGMENTS. Переменные параметры для INIT.ORA Вы можете достичь наибольшей производительности систе¬ мы Oracle, настраивая для файла INIT.ORA переменные параметры. В первую очередь вам следует рассмотреть изме¬ нения следующих параметров: DB_BLOCK BUFFERS LOG_ALLOCATION LOG-CHECKPOINTJNTERVAL В приложении Б приводится полный список параметров для INIT.ORA, включающий информацию о том, следует ли вам или нет изменять установки по умолчанию. Хранение таблиц Чтобы обеспечить одновременный доступ к большим табли¬ цам со стороны многих пользователей, вы можете ’’располосо¬ вать” большие таблицы, т. е. разбить их на части и распределить эти части по разным дискам. Например, чтобы разделить таблицу в 100 Мбайт на 10 частей: создайте табличное пространство из 10 файлов, каждый из которых занимает немного больше чем 10 Мбайт (чтобы допускалось наложение). Каждый из этих десяти файлов создавайте на отдельном диске. При создании таблицы вос¬ пользуйтесь следующими параметрами хранения: storage(initial 10m next 10m minextents 10 pctincrease 0) Тогда при загрузке таблицы данные будут распределены между всеми десятью файлами.
197 Индексы При использованиии индексов преследуются две основные цели: 1) . ускорение исполнения: индексы являются основным средством сокращения ввода/вывода на диске 2) . гарантия уникальности: индекс может гарантировать, что данные в некотором столбце или в комбинации столбцов являются уникальными для каждой записи в таблице. Прежде всего установим различие между индексами и ключами. Индексы фактически существуют в базе данных. Они реализуются пакетом SQL для выполнения двух сформулиро¬ ванных выше целей. Они обязательно находятся в системе Oracle. Одним из основных применений индекса в Oracle является индекс по столбцу (столбцам), который образует ключ. Ключи представляют собой логические объекты. Ключ — это столбец или комбинация столбцов, который (которая) может служить для уникальной идентификации строки. Не требуется, чтобы он присутствовал в системе Oracle. (Точное определение ключа дано в гл. 18.) Внешние ключи тоже являются логическими объектами. Внешний ключ — это столбец (или столбцы) в некоторой таблице, который является ключом не в этой, а в другой таблице. (См. гл. 18.) Внешние ключи полезны для комбинирования данных из нескольких таблиц с помощью соединений. Существует несколько различных типов индексов: сочленен¬ ные, сжатые, несжатые, уникальные, неуникальные, а также существуют различные способы использования индексов. Эти типы и особые применения будут рассмотрены ниже. Эффективное создание индексов Владелец таблицы, а также любой пользователь, которому был доверен индексный доступ к этой таблице, может создавать Для нее индексы. Синтаксис создания уже был описан, и его предложения определены в гл. 7. Когда вводится команда создания индекса CREATE INDEX, упорядочивается столбец (столбцы) для индексирования и для каждой строки сохраняется ROWID. Иначе говоря, для столбца производится сортировка, а для всех существующих строк выполняется ROWID. После своего создания индекс автомати¬ чески поддерживается и используется системой Oracle без
198 дополнительных усилий со стороны пользователя вне зависи¬ мости от того, сколько добавлений, обновлений или удалений производится применительно к данным. Для всякой таблицы можно сформировать любое количество индексов. Однако чем больше появилось индексов, тем больше накладных расходов возникает при обновлении таблицы. Поэ¬ тому может возникнуть компромисс между скоростью обнов¬ ления и скоростью поиска. Например, если таблица только читается, то, возможно, желательно иметь больше индексов. Но если таблица часто обновляется, то лучше иметь меньше индексов. Более эффективной оказывается загрузка таблицы с по¬ мощью пакета SQL*Loader до того, как для нее созданы какие-либо индексы. В силу этой и ряда других причин обычно индекс создается уже при наличии данных. Если индекс создается до загрузки данных, то он должен обновляться при каждом включении строки. Вы можете отклониться от этого подхода ценой некоторой потери производительности, если хотите гарантировать, что конкретное значение является уни¬ кальным для каждой загруженной строки. В таком случае можно создать уникальный индекс на том столбце (столбцах), : ^орый вы хотели бы видеть уникальным. Сочлененные индексы Сочлененным называется индекс, созданный по двум или более столбцам таблицы. Только посредством сочлененных индексов можно гарантировать уникальность на протяжении нескольких столбцов (например, при комбинировании кода местности и номера телефона). Если для гарантии уникальности нужно более одного столбца, то требуемое количество столбцов должно быть использовано в сочленении. Сочлененные индексы ускоряют поиск данных, возвращае¬ мых операторами языка SQL, когда в этих операторах предус¬ матривается несколько различных критериев в предложении WHERE. Вы можете включить в сочлененный индекс до шестнадцати столбцов в зависимости от числа символов, которые могут индексироваться. Максимальное число символов в любом индексе равно 255 (включая однобайтовые разделители, ис¬ пользуемые для различения столбцов). Вы можете определить ширину своего сочлененного индекса, просуммировав значения
199 ширины всех подлежащих индексации столбцов и добавив число подлежащих индексации столбцов без единицы (чтобы учесть разделители). Сочлененный индекс возникает, когда вы хотите скомбини¬ ровать имена поставщиков и их местонахождение, например: CREATE UNIQUE INDEX IND ИД__ПОСТ ON ПОСТАВЩИКИ (ИД_ПОСТ, ГОРОД); Было бы целесообразно сконструировать такой индекс, если бы часто поступали запросы, подобные следующему: SELECT * FROM Поставщики WHERE ИД_Поставщика = ’502’ AND город = ’денвер’; Не обязательно, чтобы порядок, в котором вы называете столбцы в команде CREATE INDEX, соответствовал тому порядку, в котором эти столбцы появляются в определении таблицы. Однако вы благотворно повлияете на производитель¬ ность, если поместите первым наиболее часто используемый столбец. Сочлененный индекс повысит эффективность любого запро¬ са, использующего ведущую часть индекса. Кроме того, часто окажутся успешными запросы с предложениями WHERE, в которых используется только первый столбец сочлененного индекса. Если в предложении WHERE не упоминается первый столбец индекса, то нельзя воспользоваться сочлененными индексом и в результате не получится никакого выигрыша в производительности. Вообще говоря, работа с сочлененными индексами повысит производительность, когда запрос может быть удовлетворен чтением только блоков индекса вместо блоков данных. В версии 5.0 системы Oracle вы имели бы возможность сжать индексы или указать, что они не должны сжиматься. Это обеспечивалось за счет использования при создании индекса ключевых слов COMPRESS или NOCOMPRESS. Однако в версии 6.0 вам не предоставляется такая возможность. Если вы привыкли специфицировать, подлежит ли индекс сжатию, и пользуетесь ключевыми словами COMPRESS или NOCOMPRESS, система Oracle воспримет эти слова, но они не окажут воздействия на индексные данные. Индексные данные будут
200 храниться с использованием сжатия в разветвляющихся вер¬ шинах В*-дерева и без сжатия в "листовых” (тупиковых) вершинах вне зависимости от ваших указаний. Для сжатых индексов требуется примерно 10 байт на элемент, а для несжатых индексов — примерно 17 байт на элемент. При планировании распределения памяти следует учитывать эти факторы. В гл. 11 представлена формула для вычисления количества индексных сегментов, которые должны быть раз¬ мещены. Кластеры Цель кластеризации состоит в тесном совместном хранении совместно используемых данных и в сокращении объема используемой памяти за счет того, чтобы элементы, общие для множеств данных, хранились только в одном месте. Например, если ключом кластера является AREA CODE и имеется несколько сотен телефонных номеров с одним и тем же кодом местности, то код местности AREA_CODE хранился бы только в одном месте, а не при каждом из нескольких сотен телефонных номеров. Кластеризация представляет собой альтернативный метод хранения данных. Она не влияет на операторы языка SQL, используемые для поиска этих данных. Чтобы идентифициро¬ вать данные, для которых кластеризированная форма хранения предпочтительнее, чем некластеризированная, ищите таблицы, имеющие общие столбцы (обычно ключевые столбцы) и ищите таблицы, которые часто используются вместе, как в соедине¬ ниях. Когда кластеры созданы и данные запомнены, пользователи могут запрашивать кластеризированные данные точно так же, как они запрашивали бы некластеризированные данные. На самом деле пользователи даже не будут знать, кластеризированы данные или нет. Блоки кластернзнрованных данных Избыточность кластеризации блока составляет 44 байт для каждого физического блока и 32 байт для каждого логического блока. Для каждого физического блока может иметься несколько логических. Дальнейшие подробности о формате блоков кла- стеризированных данных приводятся в гл. 11.
201 Ключ кластера Оператор CREATE CLUSTER создает кластер, называя столбцы, которые формируют ключ кластера. Этот ключ хранится для каждого блока кластера. Кроме того, он появляется в каждом сцепленном блоке кластера. Система Oracle автома¬ тически строит и поддерживает индекс по ключу кластера. Поэтому вам нет нужды пользоваться оператором CREATE INDEX для построения индекса по столбцам, образующим ключ кластера. Однако вы можете построить индекс с помощью ключа кластера, если делаете его частью сочлененного ключа или если хотите сделать его уникальным индексом для одной из таблиц в кластере. Вы можете обновить данные в столбцах таблицы, соответст- вущей ключу кластера. Поскольку местонахождение данных зависит от ключа кластера, изменение ключа кластера для некоторой записи приводит к физическому перемещению записи. Создание кластеров Синтаксис создания кластера такой: CREATE CLUSTER <имя кластера>(< ключ кластера 1 > <тип данных>,<ключ кластера 2><тип данных>,...) [SPACE <имя области >] [SIZE <размер логического блока>]; где SPACE относится к определению области, как и в случае CREATE TABLE; SIZE относится к требуемому размеру логического блока, который уточняется системой Oracle до фактического размера логического блока. Если параметр SIZE не специфицирован, то по умолчанию принимается размер блока Oracle в конкретной операционной системе за вычетом избыточности физического блока. Определение размера логического блока рассматривается в следующем разделе. К созданию кластеров применимы следующие правила: 1) . совместно ^пастеризироваться могут не более чем 16 столбцов; 2) . типы данных и размер ключа кластера в таблице должны соответствовать типу и размеру ключа кластера в кластере;
202 3) . индексы кластера должны создаваться вручную по команде CREATE INDEX до того, как станет возможным доступ к данным кластера; 4) . Ключ кластера должен иметь несколько столбцов. Определение размера логического блока для кластера Несмотря на то что ваш выбор размера логического блока для кластера существенно влияет на производительность, мы не можем предложить надежного и быстрого способа осущест¬ вления такого выбора. В то же время хороший выбор размера логического блока будет означать более эффективное исполь¬ зование памяти и меньшую потребность в операторах чтения в течение физического поиска. Поэтому ниже предлагаются некоторые ограничивающие условия. Размер логического блока должен быть меньше, чем размер блока системы Oracle, который зависит от вашей операционной системы. Требуемый вами размер будет уточнен системой Oracle. Обычно он станет несколько длиннее, чтобы соответст¬ вовать следующему интегральному подразделению физического блока. Применяемый алгоритм и количество логических блоков на блок системы Oracle изменяются в зависимости от размера ключа кластера, а также в зависимости от операционной системы. Вообще говоря, один логический блок системы Oracle может равняться шести-семи логическим блокам кластера. В большинстве случаев логические блоки могут содержать не менее чем 300 байт. Чтобы сопоставить требуемые и факти¬ ческие размеры, воспользуйтесь запросом: SELECT ТРЕББЛОК, ЛОГБЛОК FROM Каталог WHERE <тимя> = <имятаблицы>; Попробуйте использовать меньшие размеры логических блоков, не создавая многих сцепленных блоков. Если по тому же ключу кластеризируется меньшее количество записей, то предпочтительнее меньшие размеры логических блоков, чтобы избежать излишнего расхода памяти. Вам следует выбрать размер между средним и максимальным размерами логических блоков. Тем самым будет соблюден баланс между израсходо¬ ванной памятью в блоках и потребностью в создании сцеплен¬ ных блоков.
203 Настройка кластеров Если для ^пастеризированных таблиц являются общими два или более столбца, то сделайте ключ кластера сочлененным ключом. Слишком малое количество строк на один ключ кластера приведет к излишнему расходу памяти и даст маленький выигрыш в производительности. (Более подробно кластеры рассматриваются в гл. 4.) Если у вас имеются две или более таблиц, которые часто соединяются, то в этой ситуации целесообразна кластеризация. Если позднее вы сочтете кластеры бесполезными, то можно отменить кластеризацию таблиц. Когда в одном или нескольких столбцах единственной таблицы имеется несколько общих значений, которые часто используются в запросах, то такая ситуация благоприятна для кластеризации только этой таблицы. Загрузка кластеров После создания кластера вы можете специфицировать, какие таблицы будут в нем содержаться. Хотя бы один столбец в таблице (соответствующий одному из столбцов ключа кластера) должен быть определен как NOT NULL в операторе CREATE TABLE. Добавляйте таблицы к кластеру с помощью оператора CREATE TABLE. Для кластеризации новой таблицы введите: CREATE TABLE < новая таблица> (<тип данных столбца 1 >,<тип данных столбца 2>,..., <тип данных столбца п>) CLUSTER <имя кластера>(<столбец таблицы 1 >); Чтобы скопировать существующую таблицу в кластере, создайте, кластеризируйте и загрузите новую таблицу одним оператором следующим образом: CREATE TABLE < новое имя таблицы > CLUSTER симя кпастера>(<столбец таблицы>) AS SELECT*FROM <существующая таблица>; Затем ликвидируйте старую таблицу, которая не была кпастеризирована: DROP TABLE < существующее имя таблицы > После этого, если хотите, переименуйте созданную вами таблицу в кластер с именем прежней таблицы:
204 RENAME < новое имя таблицы> ТО <старое имя таблицы >; Таблицы могут быть кластеризированы как с данными, так и без данных, причем добавление пустых таблиц влечет за собой меньше избыточности. В этом случае требуются только некоторые обновления в словаре данных и изменение исходных блоков, присваиваемых таблице. Для копирования таблиц с данными требуется больше накладных расходов за счет произ¬ водительности или времени исполнения. Дело в том, что все существующие данные должны быть прочитаны и перемещены из блоков таблицы в блоки кластера. До того как можно будет ликвидировать кластер, нужно удалить из этого кластера каждую содержащуюся в ней таблицу. Синтаксис ликвидации кластера следующий: DROP CLUSTER <имя кластера:*; Оптимизация операторов языка SQL Некоторые операторы языка SQL автоматически оптимизи¬ руются системой Oracle, для других операторов языка SQL автоматическая оптимизация не обеспечивается. В этом разделе рассматриваются только те случаи оптимизации, при которых вы имеете возможность в какой-либо степени управлять эффективностью за счет выбора синтаксических конструкций. Оптимизация запросов В случае малой таблицы система Oracle будет выполнять достаточно быстрый поиск и поэтому пет необходимости в индексах. Однако когда вы занимаетесь поиском в множест¬ венных таблицах, например в соединениях, или в больших таблицах со многими строками, то использование индексов и кластеров может заметно повысить быстродействие. Это осо¬ бенно верно, если вы называете в предложении WHERE столбцы, которые индексируются или кластеризируются. Когда вы называете в предложении WHERE много столбцов, система Oracle на основании ряда правил решает, какие условия из WHERE проверять в первую очередь. Осуществляемый системой Oracle выбор того, где начать проверку относительно предложений WHERE, называется ‘'движущим” столбцом. Иначе говоря, этот столбцовый критерий будет ’’продвигать” запрос. Например, применен ш первым некоторого предложения WHERE
205 может сразу исключить 75% из строк большой таблицы, тогда как применение первым некоторого другого предложения могло бы исключить только 15% строк. Корпорация Oracle постоянно проводит исследования и разработки по оптимизации. Поэтому правила, лежащие в основе оптимизатора запросов, могут время от времени изменяться. В настоящее время корпорация Oracle рекомендует в отношении оптимизации запросов эмпирические правила, показанью в табл. 10-1. Таблица 10-1. Рекомендации по оптимизации запросов Эти варианты быстрее Чем следующие: Индексированные столбцы Уникальные индексы ROWID ( = постоянный) Ограниченный диапазон Сопоставление с образцом типа ’х%’ Неиндексированные столбцы Неуникальные индексы Любой другой вид поиска Неограниченный диапазон Сопоставление с образцом типа ’%х%’ Оптимизация отрицаний В системе Oracle индексы не используются для предикатов, содержащих предложения NOT EQUAL. Обычно в запросах с "NOT =” число восстанавливаемых строк бывает больше, чем число опускаемых строк. Дело в том, что для чтения системой Oracle индекса, а затем таблицы требуется дополнительный ввод/вывод. Поэтому обычно выполнение полного считывания таблицы оказывается более быстрым, чем работа с индексом. Впрочем, система Oracle может пользоваться индексом в другой части выражения, содержащего "NOT =". Например, в предложении: WHERE X! = 7 AND Y = 8 Несмотря на отсутствие работы с индексом для столбца X, можно воспользоваться индексом для столбца Y. Когда предикат содержит операцию NOT наряду с другими операциями, система Oracle преобразует выражение в такое выражение, с которым могут применяться индексы. Например:
206 NOT > заменяет на < = NOT > = заменяет на < NOT < заменяет на > = NOT < = заменяет на > Оптимизация операций OR При использованиии операции OR лучше всего поместить наиболее специфичный предикат первым в списке предикатов, а последним поместить тот предикат, который пропускает наибольшее количество записей. Дело в том, что когда вы вводите запрос вида: SELECT * FROM Поставщики WHERE город = ’даллас’ OR транспортировка = ’воздухом’; при наличии индексов для обоих столбцов город и транспор¬ тировка, система Oracle будет выполнять процедуру, аналогич¬ ную объединению следующих двух запросов: SELECT * FROM Поставщики WHERE город = ’даллас’; SELECT * FROM Поставщики WHERE транспортировка = ’воздухом’ AND город = ’даллас’; Помещение первым наиболее конкретного предиката в подобных запросах будет минимизировать количество проверок для "не равно". Для операторов, содержащих предложения OR, индексы используются при некоторых обстоятельствах. Оптимизация применяется также к предложениям IN, которые преобразуются в OR. Например: ПОСТАВЩИК IN (X,Y,Z) означает то же самое, что и OR OR ПОСТАВЩИК = X ПОСТАВЩИК = Y ПОСТАВЩИК = Z Предикаты OR не используются для оптимизации в тех случаях, когда: • оператор языка SQL содержит предложение CONNECT BY; • когда оператор языка SQL содержит внешнее соединение. (Подробности о внешних соединениях см. в гл. 9.);
207 • когда встроенные в систему Oracle правила указывают, что применение индексов не приведет к оптимизации запроса. Оптимизация предложений ORDER BY Единственный способ гарантировать упорядочивание состоит в том, чтобы поместить предложение ORDER BY в конец вашего оператора на языке SQL. Упорядочивания, полученные любыми другими способами, могут быть не возвращены в том же самом порядке в последующих запросах. Поэтому вам следует явно потребовать упорядочивание с помощью предло¬ жения ORDER BY. При использовании предложения ORDER BY система Oracle сначала получает требуемые данные, а потом сортирует их. Оптимизация предложений ORDER BY Как можно раньше исключите строки, которые не удовлет¬ воряют критерию выбора в предложении WHERE. Например, запрос SELECT название_работы, AVG (оклад) FROM Служащие WHERE название_работы ’= ’президент’ AND название_работы != ’менеджер’ GROUP BY работа; будет обрабатываться быстрее запроса SELECT название работы, AVG (оклад) FROM Служащие GROUP BY название_работы HAVING название_работы != ’президент’ AND название_работы != ’менеджер’; Дело обстоит именно так, потому что: 1. Во втором запросе отсутствует предложение WHERE. Все строки будут подвергнуты обработке. Предложение WHERE отбросило бы некоторые строки раньше. 2. Предложения HAVING предназначаются для исключения группировок данных (таких, как меньшие, чем некоторый Минимум, или большие, чем среднее значение). Предложения HAVING не всегда следует употреблять в чередовании с предложениями WHERE.
208 Оптимизация соединений Существуют два общих правила оптимизации производи¬ тельности путем применения соединений: 1. Столбцы, используемые в предложениях соединения, должны индексироваться. 2. Операторы языка SQL следует формулировать с ориен¬ тацией на работу с индексами, а не на их устранение. Если индексов по соединенным столбцам не существует, то система Oracle выполняет сортировку/слияние, если: • не существует другого пути запроса, который могла бы использовать Oracle. • предложение соединения имеет вид таблица_а выражение = таблица_Ь выражение Это означает, что выражение соединения не может иметь вид больше-чем, меныпе-чем, болыпе-или-радно и т. д. При соединении сортировки/слияния каждая таблица раз¬ рабатывается отдельно. Сортируются записи, которые проходят через таблицу, затем отсортированные списки сливаются на основе столбца, формирующего соединение. Если только для одной таблицы имеется годный к употреблению индекс, то другая таблица (неиндексированная таблица) обычно выступает в роли движущей таблицы. Исключение из этого правила возникает, когда путь запроса является однострочным, в таком случае оптимизация производится автоматически. Если имеются индексы по обоим соединенным столбцам (или по предикату последующего выбора), то система Oracle выбирает оптимальный путь, основываясь на более избиратель¬ ном варианте. В общем случае при выборе пути будут приниматься во внимание следующие факторы: • какие предикаты могут использовать индексы; • какие индексы являются уникальными; • сформированы ли индексы по столбцам NOT NULL. Поэтому, для того чтобы при конструировании запроса максимально повлиять на производительность, вам следует учитывать следующее: • количество записей в запрашиваемых таблицах; • распределение данных, которые индексируются неуни¬ кальным индексом. Система Oracle выберет путь запроса, представляющий собой
209 результат взаимного взвешивания всех путей в соответствии со схемой ранжирования. В табл. 10-2 сведены результаты относительного ранжиро¬ вания, используемые системой Oracle для различных типов запросов. Каждое предложение WHERE, соединенное операцией AND, ранжируется, как и всякое соединение или внешнее соединение. Соединения оцениваются согласно числу подлежа¬ щих соединению таблиц без индекса и числу декартовых произведений. Если указанное в табл. 10-2 оценивание приводит к одинаковому ранжированию двух путей, то система Oracle использует в качестве движущей таблицы последнюю таблицу из предложения FROM. Поэтому вам следует последними в предложении FROM указать большие таблицы с наименьшим числом квалифицированных строк. Кроме того, при написании многотабличного соединения вам следует предложение соеди¬ нения для пары таблиц с наименьшим результатом указать последним в списке предложений соединения. Таблица 10-2. Оптимальное ускорение пути запроса Ранг Путь (Самые низкие ранги соответствуют самым быстрым путям.) 1 ROWID = постоянный 2 Уникальный индексированный столбец = константа 3 Единый уникальный сочлененный индекс = константа 4 Единый ключ кластера = соответствующий ключ кластера в другой таблице, находящийся в том же самом кластере 5 Единый ключ кластера = константа 6 Единый неуникальный сочлененный индекс = константа 7 Неуникальный индекс = константа 8 Единый сочлененный индекс = нижняя граница 9 Специфицирован самый ведущий сочлененный индекс Ю Уникальный индексированный столбец BETWEEN (между) нижним AND (и) верхним значениями или
210 Таблица 10-2. Продолжение Ранг Путь уникально индексированный столбец LIKE ’С%’ (ограниченный диапазон) 11 Уникальный индексированный столбец BETWEEN нижним и верхним значениями или неуникально индексированный столбец LIKE ’С%’ (ограниченный диапазон) 12 Уникальный индексированный столбец или константа (неограниченный диапазон) 13 Неуникальный индексированный столбец или константа (неограниченный диапазон) 14 Сортировка/слияние (только соединения) 15 Максимум или минимум из одиночного индексированного столбца 16 ORDER BY для единого индекса 17 Полные просмотры таблиц 18 Неиндексированпый столбец = константа, или столбец IS NULL, или столбец LIKE ’%С%’ (полный просмотр таблицы) Замечания: • Каждый из соединенных операцией AND предикатов вычисляется отдельно и оценивается в показанной выше последовательности от самого низкого (быстрейшего) до самого высокого (самого медленного). • Сочлененный индекс означает либо индекс, составленный из нескольких столбцов таблицы, либо ключ кластера. • Содинения оцениваются числом таблиц, которые будут соединены, за вычетом индекса и числом декартовых произведений. • Если ранги равны, то система Oracle использует в качестве движущей таблицы последнюю таблицу из предложения FROM.
211 Если какой-то таблице соответствует низкая оценка (и поэтому быстрый путь) для поиска, но она может соединяться с другими таблицами только без индексов, то в качестве движущей будет выбрана другая таблица, которая может соединяться с индексом. Фактор соединения всегда преобладает над накопительным фактором. Обработка массивов Oracle версии 6 включает обработку массивов, которая позволяет работать с несколькими строками. В результате производительность может десятикратно возрасти по сравнению с операциями над одиночными строками. Утилизы ODL и Export/Import могут использовать массивы для ускорения исполнения. Кроме того, вы получите выигрыш в производительности при работе с командами INSERT и SELECT, если будете применять массивы в программных продуктах Pro* системы Oracle (Pro*FORTRAN, Pro*COBOL, Pro*C, Pro*PL/l, Pro*PASCAL и т. д.). Описания типов данных и синтаксис вызовов для обработки массивов вы найдете в руководстве по интересующему вас языку или в руководствах Pro*С User's Guide, Pro*FORTRAN User's Guide, Pro*COBOL User's Guide и т. д. Написание операторов языка SQL для использования индексов Существуют два основных способа доступа к данным в базе данных: 1) использование полного просмотра таблиц; 2) использование индексов. Использование индекса обычно бывает предпочтительнее, чем полный просмотр таблиц, потому что большинство ваших операторов языка SQL будуг извлекать из таблиц только избранные строки, а не все строки. Полный просмотр таблиц оказывается предпочтительнее в том случае, когда вы знаете заранее, что следует выбрать примерно 25% или более записей из запрошенной таблицы. Применение индекса для поиска всех записей только добавило бы накладные расходы. Ниже приводятся некоторые эмпирические правила относительно того, в каких ситуациях вы можете максимизировать производительность путем использования индекса.
212 Индексами можно пользоваться, если: • ссылка на индекс имеется в предложении предиката. ("Предикатом" является всякая часть критерия выбора, которую вы можете применить для включения строк в результат или исключения из него строк.) Например, два предиката содержатся в следующем предложении WHERE: WHERE название - ’поставщики’ AND город = ’даллас’; • индексированный столбец не модифицируется функцией или арифметической операцией. Индекс будет использоваться системой Oracle, если опти¬ мизатор Oracle сочтет это уместным. Вы можете повлиять па такой выбор, приняв во внимание следующие правила, которым будет следовать оптимизатор. Индекс не будет использован, если: • отсутствует предложение WHERE; • предикат модифицирует индексированный столбец лю¬ бым способом, например посредством функции или арифметического выражения. Индексом нельзя пользо¬ ваться, если для удовлетворения критерия выбора столбец должен быть модифицирован, как в следующем примере: SELECT * FROM Служ WHERE оклад * 12 = 36000; Исключением является случай, когда запрос включает выражение, содержащее только не столбцы: {MIN | МАХ} (<столб> {-ь | -} <константа>) • производится явный поиск для записей со значениями NULL или NOT NULL в индексированном столбце, т. е. в случае, когда предикат содержит или IS NULL, или IS NOT NULL. Один и тот же запрос может быть выражен различными способами с использованием или без использования индекса. Например, предположим, что столбец ДЕНЬ РОЖДЕНИЯ определен как DATE (календарная дата) и обладает неуникаль¬ ным индексом. Тогда запрос: SELECT * FROM Служ WHERE ТО_СНАР(день_рождения,’Месяц дд.гггг ) = "Апрель 4,1986м;
213 модифицирует столбец дней рождения с помощью функции ТО_СНАR. Для дня рождения не используется индекс. Причем в запросе SELECT * FROM Служ WHERE день_рождения = TO-DATE (Ап рель 4, 1986’, Месяц дд.гггг’) константа (Апрель 4, 1986) преобразуется в данные, и поэтому система Oracle применит индекс для выполнения поиска. Вообще говоря, предпочтительнее согласовать константы, служащие в качестве критерия выбора, с типами данных, определенными для таблицы. В последующих четырех разделах рассматриваются способы написания операторов языка SQL с применением или без применения индексов, а также опреде¬ ления того, какие индексы следует использовать. Одиночные индексы В случае простого запроса по одной таблице, когда предикат относится к индексированному столбцу, система Oracle, после того как она идентифицировала индекс и приняла решение об его использовании, производит поиск, а не просмотр индекса для интересующего пользователя значения (значений). (Про¬ смотр представляет собой последовательный перебор таблицы, при поиске используется некоторый индекс.) Таким образом удается избежать как полного просмотра таблицы, так и просмотра индекса. Для следующего запроса, когда система Oracle обнаружит, что столбцу ДОЛЖНОСТЬ соответствует индекс (уникальный или неуникальный), она будет искать желаемое значение в индексе ’’ПРОДАВЕЦ’’ и возвратит все записи со значением "ПРОДАВЕЦ". SELECT номслуж, имя_служ FROM служ WHERE должность = ’продавец’; Индексы и пустые значения Если имеется возможность, определяйте столбцы таблиц как NOT NULL. Это позволит использовать индексы для большего количества запросов. Система Oracle не будет пользоваться индексами, если предикат содержит либо IS NULL, либо IS NOT NULL. Однако если вы заинтересованы в получении
214 значений NOT NULL, то обычно можете написать оператор языка SQL таким образом, что он будет работать с индексом. При этом имеется возможность возвращать строку, когда столбец обладает некоторым значением, но не столбцы со значением NULL. Например, предположим, что вы хотите обозреть всех служащих, которые получают комиссионные, т. е. тех, для кого комиссионные NOT NULL. Вы можете восполь¬ зоваться любым из следующих запросов: Запрос 1: Запрос 2: SELECT * FROM Служ SELECT * FROM Служ WHERE комм IS NOT NULL; WHERE комм > 0; Если существует индекс по столбцу комм, то он не используется при запросе 1, но применяется запросом 2 для получения результатов без выполнения полного просмотра таблицы. Однако если большинство записей в таблице СЛУЖАЩИЕ обладают каким-то значением для комм, то предпочтительнее запрос 1. Запрос 2 предпочтителен, только если большинству записей соответствует пустое (null) значение для комм. . Несколько индексов по одной таблице В запросе с двумя или более предикатами можно для ускорения поиска использовать несколько индексов, если: • Эти индексы представляют собой неуникальные индексы столбцов • Предикаты являются равенствами • Все предикаты построены по одной и той же таблице. Данные, найденные в поиске по каждому очередному индексу, "сливаются" с предыдущими результатами для получения окончательного результата. Множественные индексы не приме¬ няются для таких предикатов "ограниченного диапазона и равенства", как: SELECT * FROM служ WHERE должность = ’менеджер’ AND номмагаз > 8; Вместо этого продвигать запрос будет индекс для равенства. Выбор среди нескольких индексов Когда трудно отдать предпочтение какому-то из нескольких индексов, система Oracle выберет движущий индекс, основы¬
215 ваясь на типах индексов (сжатый/несжатый, уникальный/неу- никальный) и характеристиках столбца. Когда доступны как уникальный, так и неуникальный индекс, система Oracle пользуется уникальным индексом и пренебрегает неуникальным, избегая тем самым ’’слияния". Например, предположим, что имеются уникальный индекс по НОМСЛУЖ и неуникальный индекс по ОКЛАД в следующем запросе: SELECT симя FROM служ WHERE оклад = 4000 AND номслуж = 4703; Тогда система Oracle будет использовать только индекс по НОМСЛУЖ. Если найдена строка с НОМСЛУЖ = 4703, то система рассмотрит фактическое поле ОКЛАД, вместо того чтобы пользоваться индексом по окладам, с целью проверить, содержится ли в нем значение 4000. Пресечение использования индексов Поскольку все подходящие индексы сливаются, иногда исполь¬ зование индекса может понизить производительность. Или же, поскольку в одном запросе применяются до пяти индексов, то при написании оператора на языке SQL с предикатными ссылками более чем на пять индексированных столбцов вы можете пожелать пресечь использование наименее избирательных индексов. Чтобы исключить работу с индексом, пользуйтесь "пустой" функцией или выражением со столбцом того индекса, который вы не хотите возбуждать. Для этого обычно вы либо добавите нуль к числовому столбцу, или сочлените пустую строку с символьным столбцом, например: SELECT симя, номмагаз, оклад FROM служ WHERE номмагаз + 0 = 30 AND симя = ’джонс’ Не забывайте указаний из разд. "Написание операторов языка SQL для использования индексов" относительно способов обойтись без индексов. Команда проверки правильности индекса Вы можете пользоваться командой VALIDATE INDEX для проверки согласованности конкретного индекса. Кроме того, вы
216 можете проверить правильность индекса, созданного другим пользователем. Соответствующий синтаксис имеет вид: VALIDATE INDEX <имя индекса> [ ON <имя таблицы> ] [ WITH LIST ] где: вариант WITH LIST служит для создания файла прослеживания. Пользоваться им рекомендуется только персоналу поддержки системы Oracle. Если поступает какой-то ответ, отличающийся от подтвер¬ ждения правильности индекса ( INDEX VALIDATED ), то индекс является неправильным. Такая ситуация ненормальна, и следует выдавать сообщение о пей. После отчета о возникшей проблеме вы можете ликвидировать индекс и создать его заново. При проверке правильности индекса можно обнаружить: • Неправильные форматы индексов • Ошибочную структуру индекса • Индексные элементы, не согласованные с данными строк Однако при проверке правильности индекса не обнаружива¬ ются строки данных, для которых нет соответствующих индексных элементов. Заключение В этой главе внимание сосредоточивается на оптимизации обработки и хранения для уравновешивания нагрузки на центральное процессорное устройство и на ввод/вывод. Отме¬ чается воздействие конкретных параметров для INIT.ORA на оптимальное использование памяти для таблиц индексов. Обсуждается создание кластеров для совместного размещения связанных между собой частей информации. Конструкция операторов и запросов на языке SQL может влиять на производительность. Предлагаются рекомендации относительно использования нескольких выражений. Высказываются сообра¬ жения о целесообразности работы с индексами или без индексов в зависимости от желательного эффекта.
11 Память и хранение JD этой главе рассматриватюся управление и изменение структур баз данных для минимизации затрат памяти с повышением производительности. Представлены управление памятью с помощью временных сегментов, вычисление объемов памяти для таблиц, индексов и кластеров, а также добавление, изменение, переименование и ликвидация сегментов обратной прокрутки и табличных пространств. Обсуждается также управ¬ ление файлами операционной системы (файлы базы данных, регистрации действий и управления) и логические структуры баз данных (например, табличные пространства, таблицы и кластеры, индексы и временные сегменты). Поддержание файлов базы данных Ваши табличные пространства будут содержать ваши файлы базы данных. Каждое ваше табличное пространство должно содержать хотя бы один файл и может содержать много файлов. Вы не можете ликвидировать или увеличивать файлы базы данных. Если же вам требуется больше места в файле базы Данных, то вы просто добавляете к одному из табличных пространств еще один файл. Вследствие этой связи между файлами базы данных и табличными пространствами вы будете обеспечивать поддер¬ жание файлов базы данных с помощью операторов языка SQL, относящихся к соответствующему табличному пространству.
218 Поэтому, например, вы можете путем использования оператора CREATE TABLESPACE или ALTER TABLESPACE специфици¬ ровать входящий в табличное пространство файл (файлы) базы данных, добавить файл к конкретному табличному пространству или переименовать файл в табличное пространство. Соответст¬ венно этому вы найдете информацию о поддержании ваших файлов базы данных далее в этой главе под заголовком "Поддержание табличного пространства". Поддержание файлов регистрации действий Как отмечалось в предыдущей главе, вы будете использовать файлы регистрации действий: 1) для записи в блоки базы данных изменений при передаче транзакций и 2) для прямой прокрутки во время восстановления. Ваши возможности поддержания регистрации действий зависят от того, пользуетесь ли вы вариантом ARCHIVELOG или вариантом NOARCHIVELOG. Для выполнения любых действий поддержания файлов регистрации действий должны соблюдаться следующие условия: • вы должны пользоваться сформированной, но закрытой базой данных; • вы должны подключаться к базе данных с помощью ключевого слова INTERNAL; • затем вы должны воспользоваться командой ALTER DATABASE для добавления, ликвидации или переимено¬ вания файлов регистрации. Завершив изменение своей базы данных, вы должны включить экземпляр, а затем осуществить повторный запуск. Добавление новых файлов регистрации действий Если вы хотите добавить файлы регистрации действий, причем имеете оперативно только два файла, то вам необходимо архивизировать один из них. После заполнения другого файла фоновый процесс GWR должен немедленно переключиться на первый файл. Если у вас имеются три или четыре файла, то вы можете упаковать два или три из них вместе и одновременно архивизировать их. Вы могли бы захотеть добавить файлы регистрации действий для увеличения объема памяти оперативной регистрации. А если вы пользуетесь вариантом ARCHIVELOG или архивизи-
219 руете вручную, то у вас может возникнуть желание добавить файлы регистрации действий, чтобы достичь большей гибкости при архивизации оперативных файлов регистрации. Вы также можете пожелать изменить размер оперативного файла, и для этого вам нужно добавить большие или меньшие файлы, а затем ликвидировать текущие файлы регистрации действий. После подключения (с помощью клк? евого слова INTERNAL) вы можете добавить новый файл, введя: ALTER DATABASE <имя> ADD LOGFILE <спецификация файла> [,<спецификация файла>] Каждый добавляемый вами файл регистрации действий должен иметь минимальный размер 50К байт. Число файлов регистрации действий, которые вы можете добавить, определя¬ ется нижними границами либо LOGFILES из INIT.ORA, либо MAXLOGFILES из оператора CREATE DATABASE. Закончив добавление файлов регистрации, выключите экземпляр, а затем осуществите повторный запуск. Ликвидация файлов регистрации действий Предупреждение: не ликвидируйте какие-либо файлы реги¬ страции действий, не убедившись сначала в том, что в данный момент в них не производится текущей записи. Кроме того, если вы пользуетесь вариантом ARCHIVELOG, убедитесь, что файлы регистрации уже были архивизированы. Если вы хотите ликвидировать оперативный файл регистрации, то вам необ¬ ходимо подключится (с помощью ключевого слова INTERNAL), как описано выше, а затем ввести: ALTER DATABASE <имя> DROP LOGFILE сспецификация файла> [,<спецификация файла>] Завершив ликвидацию файлов регистрации действий, вы¬ ключите экземпляр, а затем осуществите повторный запуск. Переименование файлов регистрации действий Вы можете захотеть переименовать файл регистрации дей¬ ствий, чтобы отличать его от другого файла, который больше, меньше или находится в другом месте. После подключения (с помощью слова INTERNAL), как описано выше, переименуйте Файл регистрации действий, введя:
220 ALTER DATABASE <имя> RENAME FILE < спецификация файла> [,<спецификация файла>] ТО < спецификация файла > [,< спецификация файла >] Кроме того, вы можете использовать такой оператор для переименования файлов базы данных при условии, что осте¬ режетесь от дублирования уже существующего имени файла. Когда вы выполняете приведенную выше команду, она влияет только на информацию, хранимую внутри базы данных. Это отличается от переименования файла с помощью команды операционной системы. Поддержание сегмента обратной прокрутки Исходный сегмент обратной прокрутки называется SYSTEM. Он автоматически создается в процессе выполнения оператора CREATE DATABASE в табличном пространстве SYSTEM. В большинстве случаев база данных обладает несколькими сегментами обратной прокрутки. Разделяемым дисковым сег¬ ментам требуется по крайней мере по одному сегменту обратной прокрутки на экземпляр с доступом к базе данных, помимо сегмента обратной прокрутки SYSTEM. Если у вас имеется несколько табличных пространств, то в вашем распоряжении должен находиться хотя бы один сегмент обратной прокрутки, кроме сегмента SYSTEM. Создание нового сегмента обратной прокрутки Вы (как администратор базы данных) можете задавать новые сегменты обратной прокрутки в табличных пространствах, которые будут оставаться оперативными. Вы не можете иметь дело с табличным пространством в автономном режиме, если оно содержит активный сегмент обратной прокрутки. Сегмент обратной прокрутки используется, только если он получен при запуске экземпляра. Поэтому сегмент обратной прокрутки, который только что был создан, не может быть использован, пока экземпляр не будет выключен и запущен заново, получив этот сегмент либо как общий сегмент, либо назвав его в своем файле из LNIT.ORA. Администратор базы данных может создать новый сегмент обратной прокрутки, введя:
221 CREATE [PUBLIC] ROLLBACK SEGMENT <имя> [TABLESPACE стабличное пространство>] STORAGE ([INITIAL n] [NEXT n] [MINEXTENTS n] [MAXEXTENTS {n/NULL}][PCTINCREASE n]) Общие/частные сегменты обратной прокрутки Общие сегменты обратной прокрутки доступны любому экземпляру, нуждающемуся в дополнительном сегменте обрат¬ ной прокрутки. С другой стороны, частные сегменты обратной прокрутки обычно связываются только с одним экземпляром. Сегмент обратной прокрутки (за исключением сегмента SYSTEM) по умолчанию является частным и может использоваться только экземпляром, названным в параметре ROLLBACK SEGMENT. Если вы хотите создать общий сегмент обратной прокрутки, воспользуйтесь для этого ключевым словом PUBLIC, как показано в синтаксисе из предыдущего раздела. Вы не специфицируете общие сегменты в INIT.ORA для какого-либо конкретного экземпляра, потому что они должны быть доступны для любого нуждающегося в них экземпляра. Однако вы можете назвать общий сегмент в INIT.ORA для параметра ROLLBACK-SEGMENTS. Если вы желаете создать частный сегмент обратной про¬ крутки, вам нужно только не включать ключевое слово PUBLIC в синтаксис, представленный в предыдущем разделе. Наблюдение сегментов обратной прокрутки Вы можете захотеть узнать, сколько памяти используют сегменты обратной прокрутки. Можно узнать это, запросив представление словаря данных DBA_ROLLBACK_SEGS. Изменение размера сегмента обратной прокрутки Если вы хотите увеличить или уменьшить параметры объема памяти для сегмента обратной прокрутки, можно сделать это с помощью оператора языка SQL: ALTER [PUBLIC] ROLLBACK SEGMENTS <имя> STORAGE ([NEXT n] [MAXEXTENTS {n/NULL}] [PCTINCREASE n]) Этот оператор повлияет только на будущие экстенты, исполь¬ зуемые сегментом обратной прокрутки, но не окажет воздействия на существующие экстенты. Вы должны пользоваться ключевым словом PUBLIC, только если сегмент является общим.
222 Ликвидация сегмента обратной прокрутки Вы можете пожелать ликвидировать сегмент обратной про¬ крутки по любой одной (или нескольким) из следующих причин: • сегмент включает слишком много экстентов и поэтому является слишком фрагментарным; • вы больше не нуждаетесь в сегменте, потому что использовавший его ранее экземпляр более не имеет доступа к базе данных; • вы хотите превратить его из общего в частный или наоборот; • вы хотите поместить его в другое табличное пространство. Для ликвидации сегмента обратной прокрутки выполните следующие действия: 1. Убедитесь, что база данных открыта. 2. Подключите использование имени пользователя АБД. 3. Подключите представление словаря данных DBA_ROLL- BACK_SEGS, чтобы убедиться в том, что подлежащий ликви¬ дации сегмент обратной прокрутки сейчас не используется каким-либо экземпляром. 4. Введите следующий оператор на языке SQL (использовав необязательное ключевое слово PUBLIC, только если сегмент был специфицирован как PUBLIC, т. е. общий): DROP [PUBLIC] ROLLBACK SEGMENT <имя> 5. Если для повторного запуска системы вам нужен сегмент обратной прокрутки, создайте другой такой сегмент. Поддержание табличного пространства Табличное пространство представляет собой первичное ло¬ гическое подразделение базы данных. Оно служит для распре¬ деления памяти, оперативной доступности и восстановления. Вам понадобится обладать привилегией администратора базы данных, чтобы пользоваться упомянутыми в последующих разделах операторами языка SQL: CREATE TABLESPACE, ALTER TABLESPACE и DROP TABLESPACE. Причем некоторые варианты этих операторов могут исполняться, только пока табличное пространство находится в автономной режиме. Создание нового табличного пространства Вы (как администратор базы данных) можете расширить базу данных лишь за счет
223 • добавления нового табличного пространства с помощью оператора CREATE TABLESPACE; • добавления к существующему табличному пространству нового файла посредством оператора ALTER TABLESPACE. Если вы хотите создать новое табличное пространство, то вы должны воспользоваться следующим синтаксисом: CREATE TABLESPACE стабличное пространстве^ DATAFILE <спецификация файла> [,<спецификация файла>]... [DEFAULT STORAGE ( [INITIAL n][NEXT n] [MINEXTENTS n] [MAXEXTENTS {n/NULL}] [PCTINCREASE n]]) [ONLINE/OFFLINE] Вы должны специфицировать хотя бы один файл операци¬ онной системы для согласования с этим табличным простран¬ ством. После своего создания табличное пространство по умолчанию является оперативным. Если сейчас создано первое табличное пространство, добав¬ ляемое после табличного пространство SYSTEM, и у вас имеется только один сегмент обратной прокрутки, то перед созданием нового табличного пространства вам необходимо создать второй сегмент обратной прокрутки для размещения нового табличного пространства. Расширение табличного пространства Единственный способ увеличения размера табличного про¬ странства состоит в добавлении к нему нового файла. Первый файл в табличном пространстве всегда специфицируется в команде CREATE TABLESPACE, и поэтому добавляемый вами файл всегда будет вторым (или последующим). Чтобы добавить новый файл базы данных, поступите следующим образом: 1. Используйте открытую базу данных, табличное простран¬ ство может быть оперативным или автономным. 2. Введите пакет SQL*DBA и подключитесь к базе данных как администратор базы данных. 3. Воспользуйтесь следующим синтаксисом: ALTER TABLESPACE стабличное пространстве^ ADD TABLESPACE < спецификация файла> [,<спецификация файла>]...
224 Синтаксис описания спецификации файла зависит от опе¬ рационной системы. Наблюдение использования памяти Вы можете выяснить, сколько места отведено, используется или свободно в конкретном табличном пространстве, рассмотрев соответствующие представления словаря данных: DBA_USER_SEGMENTS DBA_EXTENTS DBA_FREE_SPACE Установка квот пользователя для хранения таблиц При желании вы можете специфицировать ограничение количества байт, которые пользователь может употребить, когда вы доверяете ему привилегию RESOURCE применительно к некоторому табличному пространству. Наиример, если вы хотите ограничить Джо 1400 байтами в табличном пространстве Три, то напишите так: GRANT RESOURCE (1400) ON TSPACE ТРИ TO ДЖО Вы можете воспользоваться тем же оператором для изме¬ нения квоты. Если Джо уже использовал более чем 1400 байт, то он не может более расходовать память, пока занятое им в памяти место не сократится до менее чем 1400 байт. Установка или изменение параметров храпения по умолчанию Подобная установка или изменение параметров хранения по умолчанию для таблиц или индексов осуществляются в момент создания табличного пространства. Однако вы можеге установить свои собственные значения для параметров хранения, если исполь¬ зуете варианты хранения для оператора CREATE TABLESPACE. Для этого воспользуйтесь параметрами хранения INITIAL, NEXT, MAXEXTENTS, MINEXTENTS и PCTINCREASE. Если вы хотите изменить параметры хранения по умолчанию в некоторый момент уже после того, как было создано табличное пространство, то можете применить следующий оператор на языке SQL: ALTER TABLESPACE стабличное пространство> DEFAULT STORAGE ( [INITIAL <6auiT>][NEXT <байт>] [MINEXTENTS <целое>][MAXEXTENTS <целое>] [PCTINCREASE <проценты>])
225 Переименование файлов в табличном пространстве Если вы хотите переименовать файл в табличном простран¬ стве, то воспользуйтесь следующим оператором на языке SQL: ALTER TABLESPACE <табличное пространство RENAME DATAFILE <текст>[,<текст>]... ТО <текст> [, <текст>]... Перевод табличного пространства в автономный режим Если вы хотите перевести табличное пространство в авто¬ номный режим, чтобы сделать временно недоступными содер¬ жащиеся в нем данные или чтобы освободить место на диске для некоторой другой цели, то поступайте следующим образом: 1. Убедитесь в том, что база данных открыта. 2. Подключитесь к базе данных с помощью ключевого слова INTERNAL. 3. Запросите представление словаря данных DBAJROLL- BACK_SEGS, чтобы убедиться, что в табличном пространстве нет активных сегментов обратной прокрутки. Если же они имеются, то вы можете перевести это табличное пространство в автономный режим. 4. Воспольуйтесь синтаксисом: ALTER TABLESPACE стабличное пространство> OFFLINE [NORMAUIMMEDIATE] Если вы хотите, чтобы табличное пространство находилось в автономном режиме, только когда все пользователи постоянно работают с ним, напишите NORMAL. Если же хотите, чтобы оно находилось в автономном режиме вне зависимости от его использования, то напишите IMMEDIATE. Табличное пространство будет оставаться автономным, пока вы не вернете его в оперативный режим, независимо от запуска и выключения экземпляра. Если автономное табличное про¬ странство содержит индексы для таблиц, находящихся в других оперативных табличных пространствах, то запросы, требующие использования этого индекса, могут не исполняться. Это будет зависеть от выбираемого оптимизатором системы Oracle пути Доступа. Перевод табличного пространства в оперативный режим Табличное пространство должно находиться в оперативном Режиме для того, чтобы вы имели доступ к находящимся в
226 нем данным. Если вы хотите перевести автономную таблицу в оперативный режим, то осуществите следующие операции: 1. Убедитесь в том, что база данных сформирована, но выключена. 2. Подключитесь с помощью ключевого слова INTERNAL. 3. Введите оператор на языке SQL: ALTER TABLESPACE стабличное пространство ONLINE Ликвидация табличного пространства Если вы хотите ликвидировать табличное пространство вне зависимости от того, содержит ли оно табличные данные, воспользуйтесь следующим синтаксисом: DROP TABLESPACE стабличное пространство> [INCLUDING CONTENTS] Вы должны написать INCLUDING CONTENTS, если хотите ликвидировать табличное пространство вместе с содержащими¬ ся в нем данными. Управление хранением таблиц и кластеров В качестве владельца таблицы или кластера базы данных вы обладаете выбором нескольких возможных вариантов хра¬ нения данных, в частности: • в какое табличное пространство поместить таблицу или кластер; • сколько места в памяти следует отводить каждый раз, когда требуется дополнительное место в памяти; • насколько пустыми и/или насколько заполненными могут стать в среднем блоки данных; • сколько всего памяти может быть использовано для таблицы или кластера. Вы можете установить способ хранения с помощью опера¬ торов языка SQL: CREATE TABLE или CREATE CLUSTER ALTER TABLE или ALTER CLUSTER CREATE TABLESPACE (чтобы установить параметры хранения по умолчанию для табличного пространства, которое будет содержать таблицу или кластер) Таблица "унаследует” параметры хранения своего табличного пространства, если оператор CREATE TABLE для этого тэб-
227 личного пространства не специфицировал каждый параметр хранения. Однако любой параметр, специфицированный в CREATE TABLE, подавит тот же параметр из оператора CREATE TABLESPACE. Параметры хранения для кластера будут подав¬ лять параметры хранения для любой конкретной таблицы в кластере. Помещение таблицы в табличное пространство Вы можете поместить таблицу в любое табличное простран¬ ство, для которого обладаете привилегией RESOURCE. Для этого вы специфицируете вариант TABLESPACE, когда поль¬ зуетесь оператором CREATE TABLE. Если вы не специфици¬ руете табличное пространство, то ваша таблица будет помещена в табличное пространство по умолчанию, которое было вам присвоено по команде ALTER USER. Или же если вам не было присвоено другого табличного пространства, то ваша таблица попадет в табличное пространство SYSTEM. Администратор базы данных может распространять хранение и ввод/вывод с переходами между табличными пространствами и устройствами за счет использования множественных таблич¬ ных пространств посредством: • присваивания пользователям табличных пространств по умолчанию; • доверения привилегии RESOURCE по табличным про*- странствам; • передачи пользователям квот места в табличных про¬ странствах, где они обладают привилегией RESOURCE. Вычисление объема памяти, требуемой для таблицы Для приближенного вычисления объема памяти, требую¬ щейся для одиночной некластеризированной таблицы, поль¬ зуйтесь следующей формулой: х строк * (5 байт + у столбцов * (1 байт + 1)) число олоков = (размер блока _ 90 байт) + (1 _ PCTFREE/100) ’ где х = число строк в таблице; У = число столбцов в таблице; 1 = средняя длина столбца;
228 блок требует в среднем 90 избыточных байт; строка требует в среднем 5 избыточных байт, включая информацию в словаре строк блока; столбец требует 1 избыточный байт. Количество байт = (количество блоков) * (размер блока в байтах) Наблюдение среднего объема используемой памяти Если вы хотите выяснить среднее количество байт памяти, используемой для строк определенной таблицы, то можете применить следующий запрос: SELECT COUNT (*) FROM таблица GROUP BY SUBSTR (ROWID, 6, 14); По такому запросу вы узнаете число строк в блоке. Затем вы можете умножить его на среднюю длину строки, чтобы получить среднее количество памяти, требующейся для одного блока. Увеличение параметров хранения таблиц Вы можете изменить параметры хранения любой сущест¬ вующей таблицы, воспользовавшись либо командой ALTER TABLE, либо командой ALTER TABLESPACE. Вам разрешается изменять любые параметры таблицы, кроме параметров INITIAL и MINEXTENTS. Управление хранением индексов Индекс для таблицы создается и хранится независимо от этой таблицы. Вы можете в любой момент создать или ликвидировать индекс. Расположение индексов в табличных пространствах Вы можете создавать индексы в любом табличном простран¬ стве, в котором обладаете привилегией RESOURCE. Это означает, что все индексы для некоторой таблицы могут находиться в различных табличных пространствах и на разных запоминающих устройствах, не на тех, что сама таблица. Однако все табличные пространства, содержащие относящиеся к таблице данные, должны быть в оперативном режиме, чтобы гаранти¬ ровать доступ к этой таблице.
229 Вычисление объема памяти, требуемой для индекса Если вы хотите оценить объем памяти, требующейся для индекса, который создается после загрузки данных, то восполь¬ зуйтесь следующей формулой: #число блоков _ х строк ♦ (11 байт + z + 1) листьев (размер блока - 90) ♦ (1 - PCTFREE/100) ’ где X число строк в таблице; Z = число индексированных столбцов; 1 = средняя длина; неуникальный индекс требует 11 байт строчной избыточности (6 для ROWID, 3 для строки и 2 для словаря строк); количество байт = (число блоков листьев)*(размер блока в байтах); количество байт для всего индекса = (количество байт) *1.1 Эта формула для количества байт является приближенной. Она включает блоки ветвей и основывается на предположении, что для блоков ветвей требуется еще примерно 10% блоков. Увеличение параметров хранения для индексов Вы можете изменить объем памяти, отведенной для индекса, использовав оператор ALTER INDEX языка SQL. Любые изменения, вносимые вами в параметры хранения индексов, повлияют только на будущие, но не на текущие экстенты. Вы можете включать в один индекс до 16 столбцов. Общая ширина ключа индекса не может превосходить 253 байт. Управление кластерами Если вы хотите помещать связанные между собой данные в одни и те же блоки, то можете пользоваться кластерами. Например, если две или более таблиц часто соединяются в запросах, то было бы целесообразно кластеризировать их. Это Ускорит поиск.
230 Создание кластеров Существен тщательный выбор ключа кластера, потому что объем требуемой для кластера памяти зависит от тина имеющихся данных и от выбранного вами ключа кластера. Кластер может состоять только из одной таблицы. Такая ситуация может возникнуть, когда данные в одной таблице включают один или более столбцов с несколькими общими значениями, причем эти столбцы часто перечисляются в одном и том же запросе. Ниже приводятся некоторые советы отно¬ сительно выбора ключей кластеров: • если имеется несколько столбцов, общих для кластери- зированных таблиц, то сделайте ключ кластера сочленен¬ ным ключом; • если вы храните слишком мало данных для каждого ключа (например, несколько строк па ключ кластера), то можете расточительно расходовать память и очень мало выиграете в производительности; • если вы храните слишком много данных для каждого ключа, то можете потерять преимущество кластеров из-за того, что потребуется слишком много преобразований индексов кластеров. Выбор параметра SIZE размера для кластера Хранение кластеризированных данных осуществляется ана¬ логично хранению некластеризированных табличных данных. Параметры хранения в обоих случаях одинаковы, и вы можете устанавливать и изменять их точно так же, как для таблиц. Отличие состоит в параметре SIZE, который для кластеров выглядит иначе. При создании кластера пользуйтесь возможностью SIZE оператора CREATE CLUSTER, чтобы указать объем памяти, требующейся для всех элементов на ключ кластера. Этот параметр не ограничивает число и размер элементов па ключ кластера, а помогает системе Oracle вычислить среднее коли¬ чество ключей кластера (и строк), которые могут храниться для одного блока Oracle. Ниже приводятся указания относи¬ тельно выбора параметра SIZE для кластера: • специфицируйте его в байтах; • он применяется ко всем таблицам в кластере; • предпочтительнее завысить его оценку, чем занизить ее.
231 Наблюдение объема памяти, используемой кластерами Если вы хотите наблюдать объем памяти, используемой кластером, то запросите представления словаря данных pBA-CLUSTERS, DBA_USER_SEGMENTS и DBA.EXTENTS или, если вы не обладаете привилегиями администратора базы данных, то запросите пользовательскую (USER) версию этих представлений. Загрузка и ликвидация кластеров Создав кластер, вы добавляете к нему таблицы с помощью оператора CREATE TABLE. Процедуры кластеризации новых и старых таблиц несколько отличаются друг от друга. Для класте¬ ризации новой таблицы пользуйтесь следующим синтаксисом: CREATE TABLE <новая таблица> (<тип данных столбца 1 >,<тип данных столбца 2 <тип данных столбца N>) CLUSTER <имя кластера> (<столбец таблицы>) Чтобы включить существующую (а не новую) таблицу в кластер, вы можете воспользоваться совокупностью трех опе¬ раторов. Сначала создайте, кластеризируйте и загрузите таблицу с помощью следующего оператора: CREATE TABLE <имя новой таблицы> CLUSTER <имя кластера> (<столбец таблицы>) AS SELECT * FROM <существующая таблица> Ваше предложение SELECT может восстановить все строки (как выше) или только некоторое подмножество. Затем, после проверки правильности выполненного копирования данных, ликвидируйте старую таблицу. DROP TABLE <существующая таблица> После этого вы можете переименовать созданную таблицу в кластер, дав ей при желании имя прежней таблицы: RENAME <имя новой таблицы> ТО <имя прежней таблицы> Вы можете кластеризировать как заполненные, так и пустые таблицы, однако имейте в виду следующие обстоятельства: • добавление пустых таблиц влечет за собой меньше избыточности, потому что для этого изменения требуются только обновления в словаре данных и изменение исходных блоков, присвоенных таблице. Нет надобности,
232 чтобы табличные данные физически перераспределялись в файлах базы данных; • для копирования таблиц с данными требуется больше обработки, потому что все существующие данные должны быть прочитаны и перемещены из блоков таблицы в блоки кластера, а для этого требуется много элементов сегментов обратной прокрутки; • массовая загрузка таблицы в кластер может наложить на систему жесткие требования. До того как у вас появится возможность ликвидировать кластер, вы должны ликвидировать каждую таблицу из этого кластера, если не специфицируете вариант INCLUDING TABLES. Вам потребуется больше времени для ликвидации таблиц из кластера, чем для ликвидации некластеризированных таблиц. Кроме того, пока это происходит, будет невозможно обновлять другие таблицы в кластере. Временные сегменты Пользователь никогда непосредственно не видит, не создает и не применяет временные массивы, но СУРБД Oracle часто нуждается во временных массивах (и создает их) для работы с ними при исполнении операторов пользователя. Дело обстоит так вне зависимости от привилегий в базе данных, которыми может обладать пользователь. Когда база данных создается или запускается, никаких временных массивов не существует. Созданные для пользователя во время сеанса сегменты ликвидируются, когда этот пользо¬ ватель отключается. Если вы хотите узнать, сколько имеется временных сегментов и сколько памяти в них используется, то запросите представления словаря данных USER_TEMP_SEGMENTS или DBA_TEMP_SEGMENTS. Временные сегменты создаются в табличном пространстве SYSTEM. При желании вы можете отказаться от этого для конкретного пользователя, если вос¬ пользуетесь командой языка SQL: ALTER USER <имя пользователя > TEMPORARY TABLESPACE стабличное пространство> Размещение временных сегментов не зависит от квоты пользователя в табличном пространстве. Размер временной
233 сегмента зависит от параметров хранения табличного простран¬ ства, в котором этот сегмент создан. Вы можете создать некоторое табличное пространство иск¬ лючительно для размещения временных сегментов, таким образом вы можете в большей степени управлять параметрами хранения применительно к временным сегментам. Заключение В этой главе рассматривались средства поддержки требова¬ ний хранения для файлов базы данных, файлов регистрации действий (общих и частных), сегментов обратной прокрутки и табличных пространств в терминах создания (CREATE), изме¬ нения (ALTER) и ликвидации (DROP) этих объектов базы данных. Глава содержит формулы вычисления объема памяти, требующейся для объектов базы данных. Объясняется хранение таблиц, индексов и кластеров. Разбираются временные сегмен¬ ты, с помощью которых СУРБД Oracle исполняет операторы пользователя. Несмотря на то что пользователь никогда не работает непосредственно с временными сегментами, ему необходима некоторая информация о занимаемых ими местах в памяти, для того чтобы можно было надлежащим образом установить параметры хранения.
12 Защита ъ системе Oracle имеется много разнообразных средств защиты. Некоторые из них уже представлены в гл. 5, например привилегии доступа к системе и возможность для админист¬ ратора базы данных наблюдать использование базы данных. Кроме того, администратор базы данных может доверять (GRANT) и отменять (REVOKE) конкретные уровни доступа к данным и может изменять пароли пользователя, как и сам пользователь. В системе с несколькими пользователями владельцы (т. е. создатели) объектов базы данных обладают возможностями регулирования доступа к этим объектам со стороны других пользователей. Так, владелец таблицы может предоставить другому пользователю или всем другим пользователям огра¬ ниченные или полные права доступа к этой таблице. Этот вопрос рассматривается в следующем разделе. Администратор базы данных может также установить квоты части табличного пространства, находящейся в распоряжении каждого пользова¬ теля, и может доверять или отменять доступ к указанным табличным пространствам, как объясняется в разд. "Присваи¬ вание табличных пространств по умолчанию" и "Установка квот табличного пространства для пользователей" в этой главе. Администратор базы данных, как и владельцы объектов базы данных, может контролировать попытки доступа к объектам базы данных со стороны других пользователей вне зависимости
235 оТ того, оказались ли эти попытки успешными. Для этого можно ввести режим ревизии посредством соответствующей установки параметра для INIT.ORA, как объясняется в разд. "Ревизия" в этой главе. Кроме того, существуют процедуры запирания, разработан¬ ные специально для защиты, и другие процедуры запирания, предназначенные для того, чтобы предотвратить тупиковые ("дедлоковые") ситуации в интенсивно используемой базе данных, такие процедуры рассматриваются в гл. 13. Доступ к базе данных Регистрировать пользователей может только администратор базы данных, и он делает это с помощью команды языка SQL: GRANT < привилегия (привилегии) > ТО <имя (имена) пользователя > IDENTIFIED BY < пароль (пароли) >; Существуют три типа привилегий. Они перечисляются ниже в порядке возрастания привилегии: CONNECT RESOURCE DBA Новому пользователю одна или несколько привилегий доступа доверяются по команде следующего вида: GRANT CONNECT, RESOURCE ТО <имя пользователя> IDENTIFIED BY <пароль>; Если пользователь допущен к системе в первый раз, то нужно употребить предложение IDENTIFIED BY. С другой стороны, если пользователю уже была доверена привилегия CONNECT, а теперь он получил дополнительную привилегию, например показанную выше привилегию RESOURCE, то предложение IDENTIFIED BY может быть опущено. Тогда команда выглядела бы так: GRANT RESOURCE ТО <имя пользователя>; Привилегия CONNECT Всякий пользователь должен обладать хотя бы привилегией CONNECT, у каждого пользователя должны иметься имя Пользователя и пароль. Они заносятся в словарь данных. При каждой регистрации пользователя производится проверка но
236 словарю его имени и пароля. Пользователи, обладающие только привилегией CONNECT, могут: • получать доступ к системе Oracle; • смотреть данные других пользователей, употребляя ко¬ манду SELECT, если был доверен доступ SELECT; • выполнять операции INSERT, UPDATE, DELETE мани¬ пулирования данными применительно к таблицам других пользователей, если был доверен доступ к этим таблицам; • создавать представления и синонимы; • выполнять операции экспорта для таблиц или пользователей. Пользователи, имеющие только привилегию CONNECT, не могут создавать (CREATE) какие-либо таблицы, кластеры или индексы. Привилегия RESOURCE Пользователь с привилегией RESOURCE обладает всеми привилегиями, доверенными пользователю с характеристикой CONNECT. Кроме того, пользователь RESOURCE может: • создавать таблицы базы данных, индексы и кластеры в любом табличном пространстве; • доверять и отменять привилегии относительно созданных им таблиц, индексов или кластеров; • пользоваться командой AUDIT для контрольной ревизии доступа к созданным им таблицам, индексам или кластерам. (См. разд. ’’Ревизия" из этой главы.) Привилегия АБД Пользователь с привилегией АБД обладает всеми привиле¬ гиями согласно CONNECT И RESOURCE и, кроме того, может: • осуществлять доступ к данным любого пользователя и выполнять над ними любой оператор языка SQL (за исключением пользователя SYS); • доверять и отменять привилегии пользователей в системе базы данных; • создавать общие (COMMON) синонимы (доступные для всех пользователей); • выполнять такие операции поддержания в масштабе базы данных, как добавление табличных пространств или файлов, перев д табличные пространств в оперативный и автономный режимы, резервирование табличных про¬ странств и архивизация файлов регистрации;
237 • контроль ревизии в масштабе системы и ревизии в масштабе таблицы по умолчанию; • выполнение полного и приращенного экспорта для базы данных. Автоматическое начало сеанса Администратор базы данных может также доверять опреде¬ ленным пользователям право автоматического начала сеанса, набирая их идентификаторы в системе Oracle как системные идентификаторы. Зарегистрированным таким образом пользо¬ вателям нет надобности при начале сеанса в системе Oracle печатать имя пользователя в системе Oracle или пароль. Для доверительной передачи автоматических запусков сеан¬ сов применяется такой же синтаксис, что и для доверительной передачи привилегии в базе данных с той разницей, что префикс OPS$ появляется непосредственно перед именем пользователя. Префикс OPS$ указывает системе Oracle, что далее следует имя пользователя с правом автоматического начала сеанса. (По¬ скольку это приложение может не быть одинаковым для всех систем, обратитесь к поставленной корпорацией Oracle доку¬ ментации о специфике для вашего оборудования.) Автомати¬ ческое начало сеанса устанавливается следующим образом: GRANT CONNECT ТО OPS$ < идентификатор> IDENTIFIED BY < пароль >; Например, для регистрации пользователя с системным идентификатором HAGAR администратор базы данных ввел бы GRANT CONNECT ТО OPS$HAGAR IDENTIFIED BY HORRIBLE; После того как введена эта команда GRANT, пользователь, зарегистрированный в операционной системе как HAGAR, может не вводить в систему Oracle имя пользователя и пароль. Вместо этого он может зарегистрироваться как OPS$HAGAR. Именем пользователя является целая строка символов OPS$HAGAR. Поэтому все объекты (таблицы, представления, индексы и т. д.), созданные этим пользователем, снабжаются этим именем в качестве префикса. Другой пользователь, чтобы обратиться к таблице PARIS, принадлежащей OPS$HAGAR, Должен был бы ввести SELECT *FROM OPS$HAGAR.PARIS;
238 Исключение пользователей, изменение привилегий и паролей Только администратор базы данных может исключать пользователей или же изменять привилегии или пароли других пользователей, причем может делать это в любой момент. (Впрочем, и сам пользователь может изменять свой собствен¬ ный пароль.) Командой исключения пользователя является оператор языка SQL REVOKE привилегия FROM, например: REVOKE CONNECT FROM <имя пользователя>; Поскольку CONNECT — эго привилегия самого низкого уровня, подвергнутый процедуре REVOKE пользователь потерял все привилегии подключения к системе Oracle и поэтому исключен. Однако если администратор базы данных желает отменить только часть привилегии пользователя, он может избирательно применить оператор REVOKE. Приводимая ниже команда позволяет пользователю сохранить все привилегии CONNECT, но отменяет его привилегии RESOURCE. REVOKE RESOURCE FROM <имя пользователя>; В случае отмены привилегии пользователя принадлежащие ему таблицы остаются в словаре данных, несмотря на то что там уже нет имени этого пользователя. Администратор базы данных (и все другие пользователи, получавшие доступ к этим таблицам) могуг сохранять доступ к этим таблицам, первона¬ чально являвшимся собственностью (ныне) исключенного пользователя. Администратор базы данных может также усилить приви¬ легии пользователя, употребив оператор GRANT, за которым следует привилегия более высокого ранга, как показано выше. Администратор базы данных может изменить пароль любого пользователя системы Oracle. Всякий пользователь может также изменить свой собственный пароль в любое время. Для этого достаточно просто применить команду GRANT CONNECT и включить новый пароль, как в следующем примере: GRANT CONNECT <пользователь> IDENTIFIED BY < новый пароль >; Пользователь, именуемый PUBLIC При установке системы Oracle она автоматически фиксирует "группового пользователя", называемого PUBLIC. Всякий поль¬
239 зователь, которого впоследствии регистрирует администратор базы данных, становится членом группы PUBLIC. Доверие группе PUBLIC доступа к таблицам и представлениям Когда вы создаете таблицы или представления, которые будут интересны для многих пользователей, то целесообразно не перечислять всех пользователей, которым разрешается доступ к этим таблицам или представлениям, а просто доверить командой GRANT. Синонимы PUBLIC Только администратор базы данных может создавать сино¬ нимы PUBLIC. Такие синонимы могут создаваться по таблицам, представлениям или даже по другим синонимам. Причем все синонимы PUBLIC становятся доступными каждому пользова¬ телю системы Oracle. Синоним служит аббревиатурой опреде¬ ленного набора на клавиатуре, необходимого для выбора таблицы или представления. Например, если пользователям часто требуется доступ к системному файлу расписаний SYSTEM.SYSTSCHEDS, то администратор базы данных может создать для этого файла синоним следующим образом: CREATE PUBLIC SYNONYM SYSTSCHEDS for SYSTEM.SYSTSCHEDS; После этого пользователь может просто набирать SYSTSCHEDS вместо набора SYSTEM.SYSTSCHEDS всякий раз, когда он обращается к файлу, содержащему расписания. Чтобы выяснить существование синонимов PUBLIC, вам нужно ввести команду: SELECT * FROM ALL__SYNONYMS; Доверие ограниченного доступа Администратор базы данных, как и владельцы таблиц, может Доверять (GRANT) доступ ко всем данным в таблице или только к конкретным столбцам. Можно также доверять доступ для определенных операций, не допуская доступа для каких-либо Других целей. Все такие привилегии отменяются с помощью оператора REVOKE. Воспользовавшись командой SELECT, вы можете предоста¬ вить доступ только для чтения. Например, следующий оператор Дзет Михаилу привилегию только чтения в таблице наладчика:
240 GRANT SELECT ON Наладчик TO Михаил Если вы хотите предоставить Михаилу привилегию создания индексов по таблице наладчика, а также обновления этой таблицы и передачи таких привилегий другим пользователям, вам нужно перечислить эти операции и воспользоваться дополнительной фразой WITH GRANT OPTION следующим образом: GRANT SELECT, INDEX, UPDATE ON Наладчик TO Михаил WITH GRANT OPTION; Доверие доступа к представлениям Доверие доступа только к некоторому представлению из базовой таблицы, а не ко всей базовой таблице может играть роль средства защиты, поскольку получатель такого ограничен¬ ного доступа может работать с нужной ему частью (т. е. с представлением), по лишен возможности доступа к остальной части таблицы. Предположим, вы хотите, чтобы Михаил работал с некото¬ рым подмножеством таблицы окладов, а не со всей этой таблицей. Тогда вы можете создать представление по таблице окладов, ограничив Михаила использованием только опреде¬ ленных строк из таблицы окладов или только определенных столбцов из нее. Например, следующее представление специ¬ фицирует только определенные строки: CREATE VIEW Бостон as SELECT * FROM Наладчик WHERE city = ’Бостон’; Затем доверьте Михаилу право читать и обновлять это представление, для этого напишите: GRANT SELECT, UPDATE ON Бостон TO Михаил WITH GRANT OPTION; В этом доверении отсутствуют индексные привилегии.
241 потому 'ito представления не индексируются. В отношении представлений могут быть доверены только привилегии SELECT, UPDATE, INSERT и DELETE. Если вы желаете ограничить Михаила только определенными столбцами таблицы наладчика, то воспользуйтесь таким же процессом для создания представления из этих столбцов, а затем передайте Михаилу доступ к представлению следующим образом: CREATE VIEW as SELECT имя, адрес FROM Наладчик; GRANT SELECT, UPDATE, INSERT, DELETE ON Наладчик TO Михаил WITH GRANT OPTION; Здесь предполагается, что вы либо являетесь администра¬ тором базы данных, либо обладаете полным доступом к таблице наладчика наряду с привилегией передачи этого доступа другим с помощью оператора WITH GRANT OPTION. Присваивание табличных пространств по умолчанию В словаре данных хранится информация о каждом пользо¬ вателе. Например, вы можете посмотреть для каждого пользо¬ вателя: • уровень привилегий (CONNECT, RESOURCE или DBA); • табличное пространство по умолчанию для таблиц, кластеров и индексов; • табличное пространство по умолчанию для временных сегментов. Табличным пространством по умолчанию для создания объектов и временных сегментов является SYSTEM. Чтобы изменить принципы умолчания, вам следует воспользоваться синтаксисом ALTER USER <пользователь^ [IDENTIFIED BY симя пользователя>] [DEFAULT TABLESPACE стабличное пространство>] [TEMPORARYTABLESPACE стабличное пространство>] Если пользователь создает таблицу и не специфицирует табличное пространство (с помощью варианта TABLESPACE),
242 эта таблица будет расположена в табличном пространстве по умолчанию, упомянутом в предыдущей команде. Разумеется, пользователь должен обладать доступом RESOURCE ко всем отведенным табличным пространствам. Установка квот табличного пространства для пользователей Вы можете доверить привилегию RESOURCE для некоторого табличного пространства либо условно, либо безусловно. Если вы хотите доверить ее безусловно, это означает, что пользова¬ телю может быть предоставлено столько места, сколько он пожелает. Соответствующий синтаксис такой: GRANT RESOURCE ON TABLESPACE <табличное пространство ТО <имя пользователя > Если вы хотите установить некоторый предел того объема памяти, с которым разрешается работать пользователю, то вам понадобится такой синтаксис: GRANT RESOURCE (n) ON <табличное пространство> ТО <имя пользователя > где (п) — это количество байт, которое будет квотой для имени пользователя в табличном пространстве. Если вы хотите узнать, каковы текущие квоты и какой объем памяти используется в данный момент, то вам следует запросить представления словаря данных USR_QUOTAS или DBA_QUOTAS. Временные сегменты являются частью квот, и поэтому при установке квот вам нужно предусмотреть резерв для временных сегментов. Если у вас возникло желание изменить квоту, вы должны воспользоваться командой GRANT RESOURCE с другим количеством байт. Отмена доступа к табличному пространству Пожелав отменить доступ пользователя к табличному про¬ странству, вы должны отменить его системную привилегию RESOURCE для данного табличного пространства. Для этого воспользуйтесь синтаксисом REVOKE RESOURCE ON <табличное пространство FROM симя пользователя >
243 Если хотите отменить доступ пользователя ко всем таблич¬ ным пространствам, вы должны полностью отменить его системную привилегию RESOURCE с помощью команды: REVOKE RESOURCE FROM <имя пользователя> Изменение паролей Администратор базы данных может в любой момент изменить свой собственный пароль. Это можно сделать с помощью следующей команды: GRANT CONNECT ТО <имя пользователя > IDENTIFIED BY < новый пароль > Исключение пользователей Если вы администратор базы данных и хотите отменить привилегии доступа к базе данных для некоторого пользователя, то вы должны использовать оператор REVOKE из SQL, указывающий, какие привилегии вы отменяете. Только АБД может изменять привилегию (привилегии) пользователя. Со¬ ответствующий синтаксис таков: REVOKE {CONNECT/RESOURSE/DBA} FROM <имя пользователя > Если вы отменяете привилегию CONNECT, пользователь лишается возможности подключаться к системе Oracle. Суще¬ ствование таблиц, принадлежавших исключенному пользовате¬ лю, сохранится. Администратор базы данных и любые другие пользователи, которым предоставлялся доступ к этим таблицам, смогут по-прежнему работать с ними. Если в некоторый момент нужно ликвидировать эти таблицы, то администратор базы данных может подключиться как пользователь, временно доверить CONNECT для соответствующего имени пользователя, ликвиди¬ ровать объекты, а затем ликвидировать привилегию CONNECT. Ревизия Посредством ревизии администратор базы данных может наблюдать деятельность пользователя в базе данных системы Oracle. Любой пользователь, владеющий таблицей или пред¬ ъявлением, тоже может прибегнуть к ревизии, чтобы наблюдать Успешную или безуспешную работу других пользователей с его объектами базы данных.
244 Разрешение ревизии Ревизия не является автоматической. Она должна быть разрешена. Такое разрешение дается при запуске системы через INIT.ORA следующим образом: 1. Для параметра AUDIT.TRAIL в файле параметров INIT.ORA устанавливается ненулевое значение (нуль отменяет ревизию), затем 2. Система Oracle запускается с использованием отредакти¬ рованного файла INIT.ORA. После этапов 1 и 2 администратор базы данных и другие пользователи, обладающие привилегией RESOURCE для этой базы данных, могут применять операторы SQL AUDIT для выбора подлежащих ревизии действий. Описания ревизуемых операций записываются в таблицу контрольного журнала SYSAUDIT_TRAIL в словаре данных. Этой таблицей можно пользоваться так же, как любой другой таблицей. Она рассмат¬ ривается в разд. "Таблица контрольного журнала". Операторы языка SQL AUDIT во многом похожи на операторы языка SQL GRANT и REVOKE. Например, следую¬ щий оператор будет ревизовать попытки (как удачные, так и неудачные) изменить оператором ALTER таблицу настройщика: AUDIT ALTER ON Настройщик; Наблюдение деятельности После того как ревизия разрешена, любой пользователь, владеющий таблицей или представлением (и поэтому облада¬ ющий привилегией RESOURCE), может: 1) . выбирать варианты ревизии с помощью операторов языка SQL; 2) . ревизовать удачные/неудачные попытки доступа к его таблицам или представлениям; 3) . выбирать для ревизии конкретные виды операций пакета SQL, например только удаление (DELETE), только выбор (SELECT) или только INSERT, UPDATE; 4) . контролировать уровень подробностей, заносимых в таблицу контрольного журнала (SYSAUDITJTRAIL). Администратор базы данных может пользоваться ревизией для всех перечисленных выше целей, а также 5) . наблюдать удачные/неудачные попытки входа или выхода из системы Oracle;
245 6) . наблюдать удачные/неудачные попытки доверять (GRANT) иди отменять (REVOKE) привилегии; 7) . разрешать или запрещать запись таблицы контрольного журнала (SYSAUDIT_TRAIL); 8) . устанавливать варианты ревизии по умолчанию для таблиц базы данных. Таблица контрольного журнала (SYS.AUDIT_TRAIL) Таблица SYSAUDIT_TRAL контрольного журнала содержит описания всех ревизуемых операций. Она находится в словаре данных и может быть запрошена подобно любой другой таблице. Для того чтобы ревизия стала разрешенной, нужно установить для параметра AUDIT_TRAIL в файле параметров INIT.ORA ненулевое целое значение. Затем запустите систему с помощью файла INIT.ORA. Отличие от других словарных таблиц состоит в том, что администратор базы данных может удалять информацию из контрольного журнала. Ревизия таблиц и представлений Применительно к любой заданной таблице, представлению или синониму только владелец этого объекта или администратор базы данных может вводить команду AUDIT. Синтаксис команды AUDIT следующий: AUDIT {<Т_вариант> [,<Т_вариант>] | ALL} ON {< имя таблицы> | DEFAULT} [BY {ACCESS | SESSION}] [WHENEVER [NOT] SUCCESSFUL]; где < Tjeapuawn > — это: ALTER AUDIT COMMENT DELETE GRANT INDEX INSERT LOCK RENAME SELECT UPDATE вариант доверия (GRANT) означает, что для этой таблицы следует ревизовать оба оператора GRANT и REVOKE; таблицы — это имя представления, базовой таблицы или синонима, обозначающего представление или базовую таблицу; ALL означает все варианты, применимые для этого имени таблицы.
246 Например: AUDIT ALTER, RENAME, UPDATE ON ДЖОНС.СЛУЖАЩИЙ WHENEVER SUCCESSFUL; Для базовых таблиц применимы все варианты ревизии. Для представлений применимыми вариантами являются: AUDIT, COMMENT, INSERT, DELETE, GRANT, LOCK, RENAME, SELECT и UPDATE. Предложение BY определяет, как часто (и в каком количестве) строки пишутся в контрольный журнал. Это необходимо, потому что некоторые операции, например команды языка манипули¬ рования данными (ЯМД), появляются гораздо чаще, чем некоторые другие, например GRANT. Для предложения BY существуют следующие варианты: BY SESSION Отсутствие предложения BY эквивалентно варианту BY SESSION BY ACCESS Каждая специфицированная операция ревизуется включением одной или нескольких строк в контрольный журнал. Для операции ЯМД все строки контрольного журнала пишутся или обновляются по завершении этапа грамматического разбора операции WHENEVER SUCCESSFUL означает, что каждую специфицированную операцию следует ревизовать, только когда она успешно завершена WHENEVER NOT SUCCESSFUL означает, что каждую специфицированную команду следует ревизовать, только если она не получает успешного завершения Если вы не включаете предложение WHENEVER, то будут ревизоваться как успешные, так и безуспешные завершения. Оператор NOAUDIT специфицирует, какие варианты для таблицы следует более не ревизовать. Синтаксис этого оператора подобен синтаксису оператора AUDIT с той разницей, что он не содержит предложение BY. Указанная деятельность завер¬ шается вне зависимости от того, выполнялась ли она в варианте BY ACCESS или в варианте BY SESSION. NOAUDIT {<Т_вариант> [,<Т_вариант>]... | ALL} ON {< имя таблицы> | DEFAULT} [WHENEVER [NOT] SUCCESSFUL]
241 Варианты системной ревизии Уровни ревизии могут быть специфицированы также для операций АБД и других операций, не относящихся к таблицам базы данных. Тот же оператор AUDIT служит для спецификации этих вариантов в системной ревизии: AUDIT {<Т_вариант> [,<Т_вариант>]... | ALL} {WHENEVER [NOT] SUCCESSFUL] где <Т_вариант> — это: CONNECT DBA NOT EXISTS RESOURCE Например: AUDIT CONNECT, DBA WHENEVER SUCCESSFUL Основное различие между операторами AUDIT для таблиц и для системы состоит в том, какие операции ревизуются в том и другом случаях. В операторах AUDIT системной ревизии каждый вариант определяет некоторый класс операций базы данных: CONNECT DBA означает вход в систему Oracle и выход из нее. означает операторы масштаба системы GRANT, REVOKE, AUDIT и NOAUDIT; CREATE/ ALTER TABLESPACE; CREATE/DROP [PUBLIC] SYNONYM. NOT EXISTS означает появление сообщения об ошибке "...does not exists" в случае любых ссылок на перечисленные объекты. RESOURCE означает CREATE/DROP TABLE, VIEW, SPACE, SYNONYM CREATE/ALTER/DROP CLUSTER; Оператор NOAUDIT системной ревизии специфицирует, какие именно системные операции более не следует ревизовать. Синтаксис этого оператора такой же, как и у оператора AUDIT. Ревизия словаря данных Словарь данных содержит несколько таблиц, относящихся к ревизии. Для того чтобы посмотреть их, введите SELECT * FROM DTAB WHERE TNAME LIKE ’%AUDIT%’; В результате вы получите список, показанный в табл. 12-1. Таблица AUDIT-ACTIONS перечисляет все возможные дей- ствия, которые могут ревизоваться, а также числовые коды
248 этих действий. В других таблицах, содержащих информацию о ревизии, используется именно код, а не название действия. Чтобы увидеть, каковы ваши текущие установки ревизии, выберите командой SELECT словарную таблицу TABLE_AUD1T, Если хотите посмотреть, какие записи породили ваши установки ревизии, выполните SELECT для таблицы AUDIT_TRAIL. Для того чтобы узнать, какие варианты вы выбрали для своих собственных таблиц, можно воспользоваться запросом такого вида: SELECT * FROM TABLE_AUDIT WHERE CREATOR = ‘мое_имя‘; Таблица 12-1. Таблицы словарных данных, относящихся к ревизии Представления словарных данных, относящихся к ревизии1 USER_TAB_AUDIT_OPTS USER_AUDIT_TRAIL USER_AUDIT_CONNECT USER_AUDIT_RESOURCE USER_AUDIT_DBA ALL_TAB_AUDIT_OPTS ALL_DEF_AUDIT_OPTS DBA_TAB_AUDIT_OPTS DBA_AUDIT_TRAIL DBA_AUDIT_CONNECT DBA_AUDIT_RESOURCE DBA_AUDIT_DBA DBA_AUDIT_EXISTS DBA_SYS_AUDIT_.OPTS Префиксом USER снабжаются те представления, которые с наибольшей вероятностью могут заинтересовать обычного пользователя базы данных. Представления с префиксом ALL возвращают информацию о тех объектах базы данных, к которым пользователь имеет доступ через общие или явные доверения, и об объектах, которыми этот пользователь владеет. Представления с префиксом DBA могут быть запрошены только администраторами базы данных. Чтобы узнать, как действуют варианты системной ревизии, обратитесь (если вы администратор базы данных) к таблице SYSTEM_AUDIT. Функция USERENV Функция USERENV служит для включения записей я контрольный журнал. Это позволяет вам получать информаций о конкретном сеансе работы системы Oracle. Функция USEREN^ получает в качестве параметра литеральную строку и возвращаем в качестве своего значения либо строку, либо число 15
249 зависимости от параметра. Синтаксис вызова функции USERENV следующий: SELECT USERENV(’TERMINAL’), USERENV(’SESSIONID’), USERENV(’ENTRYID’) FROM DUMMY WHERE ROWNUM < 2; где TERMINAL означает идентификатор терминала операционной системы. Он возвращается вне зависимости от того, разрешена ли ревизия через INIT.ORA. Спецификация идентификатора терминала будет' зависеть от операционной системы SESSIONID означает идентификатор сеанса ревизии. Он возвращается, только если ревизия разрешена через INIT.ORA ENTRYID означает номер очередного доступного элемента таблицы AUDIT_TRAIL для текущего сеанса. Он возвращается, только если ревизия разрешена через INIT.ORA Функция UDERENV может использоваться для добавления к контрольному журналу строки комментария. Кроме того, она может служить для конструирования представлений, которые ограничивают доступ для пользователей, входящих в систему через определенные физические терминалы. Заключение В этой главе рассматриваются средства защиты: доступ к базе данных через избирательное доверение (GRANT) приви¬ легий, доступ только через представления, ограничения таб¬ личных пространств, отмена привилегий, а также ревизия успешных или безуспешных обращений к объектам базы Данных.
13 Блокировка Замки имеют особое значение в системах коллективного пользования, поскольку гарантируют правильную последователь¬ ность внесения изменений и препятствуют появлению в данных изменений во время оперативной работы пользователя с этими данными. Совместная работа нескольких пользователей создает предпосылку для возможной неверной последовательности появ¬ ления изменений, которая нарушает целостность базы данных. В системе Oracle замки действуют автоматически, однако в некоторых случаях пользователь может "прорваться" через отдельные замки. Чаще всего такие прорывы происходят, когда пользователь пишет прикладные программы. В системе Oracle существуют три основных типа замков и шесть режимов блокировки в рамках первого типа. Такими типами являются: • замки данных (также называемые замками ЯМД); • замки словаря; • внутренние замки и защелки. Табл. 13-1 объединяет все типы замков системы Oracle и показывает, как они будут перечисляться в изображении MONITOR. Явные и неявные замки Некоторые замки системы Oracle "неявны" в том смысле, что они появляются автоматически, когда поступают опреде¬ ленные команды. Другие замки — "явные", они появляются лишь в том случае, если вы явно запрашиваете их но имени.
251 В любом случае последующий текст укажет, является ли данный замок неявным или явным. Таблица 13-1. Типы замков системы Oracle Тип/имя замка Символ в изобра¬ жении монитора ЗАМКИ ДАННЫХ (или ЗАМКИ ЯМД) Таблица монополия (EXCLUSIVE) обновление с разделением (SHARE UPDATE) монополия с разделением строк (SHARE ROW EXCLUSIVE) разделение строк (ROW SHARE) монополия строк (ROW EXCLUSIVE) разделение (SHARE) Строка (замок транзакции) ЗАМКИ СЛОВАРЯ Замки грамматического разбора Замки ЯОД Временный сегмент ВНУТРЕННИЕ ЗАМКИ ЗАЩЕЛКИ Замки словарных буферов S ТМ X RS SRX RS RX S тх TD(S) TD(X) TT(S или X) Многочисленные X Замки управления файлами и регистрацией Замки табличных пространств и сегментов обратной прокругки
252 Замки данных (замки ЯМД) Замки данных (также называемые замками ЯМД) органи¬ зуются операторами SQL для языка манипулирования данными. В отличие от замков словаря, которые блокируют структуру данных, замки данных предусматривают согласованность самих данных. Поскольку имеются некоторые различия в процедурах и результатах блокировки, блокировка таблиц будет рассмат¬ риваться отдельно от блокировки строк. Описываемая в последующих разделах блокировка по умол¬ чанию относится к версии 6 системы Oracle с подсистемой обработки транзакций. При этом предполагается, что два параметра для INIT.ORA устанавливаются следующим образом: SERIALIZABLE = FALSE TABLE_LOCKING = FALSE Далее в этой главе обсуждаются воздействие других комби¬ наций установок для этих параметров и обстоятельства, при которых у вас могло бы возникнуть желание изменить их установки по умолчанию. Режимы блокировки для замков данных Каждому замку данных соответствует шесть режимов бло¬ кировки. Они показаны в таблице 13-2 вместе с режимами, с которыми они совместимы. Таблица 13-2. Совместимость режимов замков данных Тип режима Аббре¬ виатура Запреты Позволяет Разделение строки RS Монопольный Обновления (или обновление доступ X RS, RX, S, с разделением) SRX Монополия строк RX Монопольный Обновления доступ для чтения/ RX, RS записи S, SRX, X Разделение S Обновления RX, Блокировку SRX, X строк RS, S
253 Таблица 13-2, Продолжение Тип режима Аббре¬ виатура Запреты Позволяет Монополия с разделением строк SRX Чтение всей таблицы RX, S, SRX, X Блокировку строк RS Монополия X Все, кроме RS, RX, S, SRX, X Запросы Режим монополии (X). Замок в режиме монополии EX¬ CLUSIVE является единственным средством гарантировать, что в любой момент только один пользователь обновляет табличные данные. Пользуйтесь таким замком для того, чтобы изменять данные и препятствовать их одновременному изменению кем-либо еще. Этот замок помешает другим пользователям обновлять данные, пока вы читаете их (хотя они и могут все же читать те же данные, что и вы). Кроме того, ваш монопольный замок не позволит кому-либо в режимах SHARE, SHARE UPDATE или EXCLUSIVE налагать замки на таблицу, с которой вы работаете. Другим пользователям разрешается запрашивать данные, пока вы поддерживаете на этих данных монопольный (эксклюзивный) замок. Однако ответы на их запросы не покажут тех изменений, которые вы вносите, пока на этой таблице обладаете замком EXCLUSIVE. Вы можете получить замок в режиме EXCLUSIVE явно по следующей команде: LOCK TABLE <имя таблицы> IN EXCLUSIVE MODE; Или же этот режим будет установлен автоматически, когда вы дадите любую из следующих команд: INSERT INTO <имя таблицы:*... UPDATE <имятаблицы>... DELETE FROM симя таблицы:*... Иначе говоря, замок в режиме EXCLUSIVE препятствует любому другому пользователю получать замок в режиме Разделения (SHARE) или выполнять любые транзакции языка DML (ЯМД), например INSERT, UPDATE или DELETE. Вы Можете снять этот замок посредством команд COMMIT,
254 ROLLBACK, команд выхода из системы или другого заверше¬ ния. (Но замки на уровне строк не снимаются командой ROLLBACK. См. разд, о замках на уровне строк.) Режим обновления с разделением (RS). См. режим обнов¬ ления с разделением (RS) выше. Режим монополии с разделением строк (SRX). Пользуйтесь замками SHARE ROW EXCLUSIVE для рассмотрения всей таблицы, когда вы хотите выполнять избирательные обновления. Вы можете также применять этот режим, когда хотите разрешить другим пользователям смотреть строки в таблице, но не хотите, чтобы они блокировали эту таблицу замком в режиме SHARE или обновляли какие-либо строки. Режим разделения строк (RS). (То же, что SHARE UPDATE в прежних версиях Oracle.) Вы можете пользоваться замком в режиме ROW SHARE для сохранения права на обновление отдельных строк или множества строк. Он позволит другим запрашивать таблицу и/ил и блокировать ее в режиме ROW SHARE, но помешает им изменять те строки, с которыми вы намереваетесь работать, и воспрепятствует кому-либо еще налагать монопольные замки EXCLUSIVE на эту таблицу. Вы можете установить этот режим явно по команде: LOCK TABLE стабличное пространство> IN ROW SHARE MODE; Или получить его неявно по команде: SELECT <строка1>, <строка2>, <строкаЗ>...FOR UPDATE; Вы можете спять режим замка ROW SHARE командами COMMIT, ROLLBACK, выходом из системы или другим завершением. Режим монополии строк (RX). Замки ROW EXCLUSIVE являются такими же, как замки ROW SHARE, с той разницей, что замки ROW EXCLUSIVE также препятствуют блокировке в режиме SHARE. Вы получаете эти замки, когда обновляете, вставляете или исключаете данные. Режим разделения (S). Пользуйтесь режимом SHARE, когда запрашиваете данные. Он воспрепятствует другим пользовате¬ лям налагать на данные монопольные замки. Он не помешает другим выполнять блокировку SHARE UPDATE применительно к читаемым вами данными, но не даст тем, кто налагает замок SHARE UPDATE, возможности фактически выполнять команду обновления UPDATE. Режим SHARE представляет собой явную блокировку. Вы можете получить его по следующей команде:
255 LOCK TABLE <имя таблицы> IN SHARE MODE; Вы можеге снять этот замок командой COMMIT, ROLLBACK, выходом из системы или любым другим завершением. Замки словаря Замки словаря защищают определение объекта базы данных, пока этот объект используется. Вы не можете непосредственно затребовать замок словаря, по вы будете получать его автома¬ тически при любом запросе. Замки словаря активизируются операторами определения данных языка SQL. Они блокируют словарь данных, так что изменения в структурах данных (например, изменения опре¬ делений таблиц, столбцов или кластеров или изменения в привилегиях доступа) не воздействуют на текущую работу. Ни один пользователь, включая и администратора базы данных, не может явно блокировать какую-либо таблицу словаря данных системы Oracle. Существуют три типа замков словаря: замки грамматиче¬ ского разбора, языка DDL (ЯОД) и временных сегментов. Замок грамматического разбора представляет собой замок словаря, действующий в режиме SHARE. Когда некоторый оператор разбирается грамматически со сссылкой на объект, то замок грамматического разбора блокирует этот объект. Когда курсор закрыт или когда в курсоре разбирается другой оператор, блокировка замком грамматического разбора завершается. Если блокирована одна таблица в кластере, то замки грамматического разбора применяются ко всему кластеру. Замок ЯОД — это замок словаря, действующий в режиме EXCLUSIVE. При выполнении оператора SQL, потенциально несовместимого с другими операторами, которые ссылаются на гот же объект, получается блокировка замком ЯОД. Замок ЯОД, наложенный на одну таблицу в кластере, равным образом налагается на все таблицы в этом кластере. Замок EXCLUSIVE требуют все операторы языка ЯОД (например, CREATE, ALTER, DROP) за исключением следующих, которые тем самым Допускают грамматический разбор для курсоров применительно к Упоминаемым в этих операторах объектам: AUDIT и NO AUDIT GRANT
256 COMMENT CREATE SYNONYM CREATE VIEW CREATE TABLE (если таблица не кластеризирована) Внутренние замки и защелки Внутренние замки и защелки защищают внутренние струк¬ туры базы данных и памяти, недоступные для пользователей. Защелки — это механизмы упорядочивания низкого уровня для защиты разделяемых структур данных в общей области системы. Процесс получает защелку на короткое время, пока он обрабатывает или рассматривает одну из таких структур. Внутренние замки относятся к более высокому уровню и более сложны, чем защелки. Они служат весьма разнообразным целям. Существуют три категории внутренних замков: • замки словарных буферов; • замки управления файлами и регистрацией; • замки табличных пространств и сегментов обратной прокрутки. Внутренние замки защищают внутренние структуры системы Oracle, но далее мы не будем их рассматривать, потому что они недоступны для пользователей. Все эти замки неявные. Блокировка таблиц Блокировка таблиц может осуществляться в одном из двух режимов: • монопольный режим; • режим разделения. Монопольная блокировка таблиц может быть получена неявно с помощью любого из операторов INSERT, UPDATE. DELETE языка ЯМД. Ее можно также получить явно путем ввода: LOCK TABLE <имятаблицы> IN EXCLUSIVE MODE [NOWAIT]; Замок в монопольном режиме EXCLUSIVE препятствует другим пользователям получать замок в режиме SHARE или выполнять любые операторы на языке ЯМД, которые могли бы ввести свою монопольную блокировку. Только так можно гарантировать, что в любой момент лишь один пользователь будет изменять данные в таблице. Впрочем, во время блокировки
257 EXCLUSIVE другие пользователи могут запрашивать ту же таблицу, хотя и не могут получать обновленные данные. В некоторых случаях использование такой монопольной блоки¬ ровки позволяет уменьшить вероятность тупиковой ситуации. Блокировка таблиц в режиме SHARE достижима только явно. Соответствующая команда имеет вид LOCK TABLE <имя таблицы> IN SHARE MODE [NOWAIT]; Употребление блокировки в режиме SHARE воспрепятствует другим пользователям обновлять блокированную таблицу, хотя они могут читать ее. Основная цель этой блокировки состоит в защите данных от изменений между двумя запросами. Блокировка таблицы в режиме SHARE снимается командами COMMIT, ROLLBACK, выходом из системы или другим завершением. Блокировка на уровне строк в режиме разделения строк Вся работа проходит более эффективно, когда используются замки на уровне строк, а не замки таблиц. Проблема состоит в том, чтобы гарантировать, что в интенсивно эксплуатируемой системе изменения не происходят между моментом, когда пользователь выбирает строку из внешней памяти, и моментом, когда тот же пользователь обновляет эту строку. Замки строк являются монопольными, но они блокируют таблицу только во время фактического обновления. Для неявного выполнения блокировки строки в режиме ROW SHARE пользуйтесь командой: SELECT <столбец1>, <столбец2>,... FROM <имятаблицы> WHERE... FOR UPDATE OF...; или вы можете выполнить ее явно, установив режим ROW SHARE следующим образом: LOCK <имя таблицы > IN ROW SHARE MODE; Вариант NOWAIT недопустим в режиме ROW SHARE. Блокировка в режиме ROW SHARE снимается командой COMMIT или ROLLBACK. Хотя никогда не возникает необходимости явно блокировать какую-нибудь таблицу, у вас может возникнуть случайное Желание сделать это, чтобы избежать потенциальной тупиковой
258 ситуации, или для проведения экспериментов, или по какой-то другой причине. Вы можете блокировать таблицу, если владеете этой таблицей или обладаете применительно к ней привилегией SELECT, или имеете статус администратора базы данных. Вне зависимости от вашего статуса вы не можете явно блокировать какую-либо таблицу словаря данных системы Oracle. Согласованность чтения Каждый из операторов SELECT, INSERT ... SELECT, UPDATE и DELETE языка SQL включает либо явно, либо неявно запрос для определения того, какие данные подвергнутся воздействию. Система Oracle гарантирует согласованный результат чтения для каждого запроса, т. е. гарантирует согласованность данных, не требуя каких-либо специальных действий со стороны пользователя. Подробности объясняются в последующих раз делах, посвященных блокировке по умолчанию. Однако в некоторых обстоятельствах у вас может возникнуть желание пользоваться блокировкой вручную, которая объясня¬ ется в этой главе в разд. "Пресечение блокировки по умолчанию". Блокировка данных по умолчанию Версия 6 системы Oracle с подсистемой обработки транзак¬ ций (TPS) блокирует таблицы и строки, когда вы вводите определенные операторы языка SQL, не оговаривая каких-либо спецификаций блокировки. Для этого требуется установить два параметра для INIT.ORA следующим образом: SERIALIZABLE = FALSE TABLE_LOCKING = FALSE В табл. 13-3 преодставлены характеристики системы блоки¬ ровки по умолчанию в TPS Oracle. Таблица 13-3. Блокировка по умолчанию в TPS Oracle Оператор языка SQL Блокировка Блокировка строк таблиц SELECT SELECT FOR UPDATE — Нет блокировки — X RS
259 Таблица 13-3. Продолжение Оператор языка SQL Блокировка строк Блокировка таблиц LOCK таблица IN режим MODE: EXCLUSIVE (X) X SHARE UPDATE (RS) RS SHARE ROW EXCLUSIVE (SRX) SRX ROW SHARE RS ROW EXCLUSIVE RX SHARE S INSERT X RX UPDATE X RX DELETE X RX DDL/DCL X Блокировка по умолчанию запросов Если вы не специфицировали никаких блокировок, то система блокировки по умолчанию в TPS Oracle будет блоки¬ ровать таблицы и строки для определенных операторов языка SQL. Иногда у вас может возникнуть желание пресечь эту блокировку по умолчанию. Об этом речь идет в следующем разделе. Поскольку при запросах данные только читаются и не изменяются, они, по-видимому, не будут взаимодействовать с Другими операторами языка SQL. В то же время, когда вы вводите запрос, то хотите, чтобы возвращаемые данные были согласованными. Система Oracle всегда возвращает приспособ¬ ленный для чтения снимок данных на момент выполнения запроса, используя все данные, принятые ко времени запроса, а также принятые или непринятые обновления из транзакции, содержащей этот запрос. Запросы, в которых нет предложения For UPDATE, обладают следующими свойствами: • не требуют замков данных; • никогда не ожидают снятия каких-либо замков данных, всегда могут выполняться;
260 • всегда возвращают или используют приспособленное для чтения представление данных; • разрешают другим транзакциям доступ к запрашиваемой таблице, включая конкретные запрошенные строки; • не требуют замков данных для строк или таблиц. Блокировка по умолчанию для команд UPDATE и DELETE Целостность результатов при выполнении команд UPDATE или DELETE также защищается приспособленными для чтения моментальными снимками состояния памяти. Даже в напря¬ женно загруженных системах, где другие пользователи могут иметь только что принятые новые данные в строках, которые вы намереваетесь обновлять или удалять, Oracle обладает специальными средствами для предотвращения ’’потерянного обновления’’, когда операция завершается на фоне более недавнего (а также согласованного) моментального снимка данных. Для команд UPDATE, DELETE и INSERT верны следующие утверждения: • запрос для команды UPDATE, DELETE или INSERT всегда будет начинаться с приспособленного для чтения представления данных; • операторы получают замки EXCLUSIVE (X) на непос¬ редственно затронутых строках и замки ROW EXCLUSIVE (RX) на таблицах, содержащих эти строки; • другие транзакции могут запрашивать эти строки, но не могут изменять их, пока текущая транзакция не снимет замки строк; • другие транзакции могут производить любые действия над остальными строками в данной таблице, даже в том же блоке, что и затрагиваемые строки, и даже во время функционирования замков; • замки строк и таблиц снимаются, когда транзакция принята; • при обратной прокрутке к контрольной точке снимаются замки, полученные после этой контрольной точки. Пресечение блокировки по умолчанию Вы можете предпочесть блокировку вручную блокировке по умолчанию при некоторых условиях, особенно когда: • хотите посмотреть согласованные данные по множествен¬ ным таблицам. Например, если имеете одну общую и
261 несколько детальных таблиц. Вы можете выполнить это с блокировкой вручную или же с транзакциями только чтения; • хотите в одной транзакции запрашивать повторно одну и ту же таблицу при условии, что никто другой не изменяет данные между вашими запросами. Вы можете делать это и с транзакциями только чтения; • хотите, чтобы данные оставались неизменными, пока вы не примете свою транзакцию; • не хотите, чтобы ваш оператор ожидал завершения какой-либо транзакции. Для этого вы можете затребовать монопольную блокировку. Начинайте транзакции только чтения с операторами на языке SQL: SET TRANSACTION READ ONLY Это он позволит вам пресечь блокировку по умолчанию посредством следующих двух операторов на языке SQL: LOCK TABLE SELECT FOR UPDATE Эти операторы установят только замки данных (вы не можете непосредственно управлять замками словаря, внутренними замками и защелками). Оператор установки транзакций только чтения Если вы хотите выполнять много операторов (а не только один) для некоторого набора данных и иметь гарантию согласованности этих данных или же хотите выполнять запросы Для множественных таблиц (без какого-либо обновления), то У вас может возникнуть желание использовать транзакцию только чтения. Для запуска транзакции только чтения восполь¬ зуйтесь оператором SET TRANSACTION READ ONLY и придерживайтесь следущих рекомендаций: 1) . ваш оператор SET TRANSACTION READ ONLY должен быть первым оператором в транзакции; 2) . вы можете делать в этой транзакции только запросы (кроме оператора завершения транзакции). Другие операторы (например SELECT FOR UPDATE) будут возвращать сообщение об ошибке; 3) . оператор COMMIT, ROLLBACK илц любой другой оператор языка ЯОД завершит транзакцию только чтения (операторы языка ЯОД приводят к явным принятиям);
262 4) . все запросы во время транзакции только чтения должны относиться к одному и тому же моментальному снимку состояния базы данных; 5) . другие пользователи могут продолжать запрашивать или обновлять базу данных, как обычно; 6) . ваша транзакция только чтения будет рассматривать только данные, которые были принятыми, когда она началась, и будет продолжать рассматривать эти данные, пока она не завершится, потому что вы лишены возможности вносить какие-либо изменения во время транзакции; 7) . если ваша транзакция выполняется в течение длительного времени, вы можете получить сообщение об ошибке "момен¬ тальный снимок слишком старый". В таком случае можно завершить эту транзакцию и при необходимости начать новую. Оператор LOCK TABLE блокировки таблицы Вы можете вручную пресечь блокировку по умолчанию, если воспользуетесь оператором LOCK TABLE, который создает замок данных в указанном режиме. Соответствующий синтаксис такой: LOCKTABLE <таблица> [,<таблица>]...1Ы (ROW SHARE/ROW EXCLUSIVE/SHARE UPDATE/SHARE/ SHARE ROW EXCLUSIVE/EXCLUSIVE) MODE [NOWAIT] где: таблица — это имя (имена) таблицы (таблиц) или представления (представлений), которые должны быть блокированы. Для представлений замки фактически налагаются на базовые таблицы. Таблицы данных не могут блокироваться MODE должен быть специфицирован один из шести режимов блокировки. Они объяснялись ранее в этой главе NOWAIT если вы не хотите ждать срабатывания замка, пользуйтесь вариантом NOWAIT. Тогда в случае недостижимости ресурса управление немедленно возвращается к вам и вы можете продолжать другую работу или ждать, прежде чем пытаться снова воспользоваться замком. Блокировка по умолчанию связана с ожиданием замка, если ресурс в данный момент недостижим
263 Пресечение блокировки по умолчанию посредством оператора SELECT FOR UPDATE Вы можете пресечь блокировку по умолчанию и йосредством оператора SELECT FOR UPDATE. Ею можно пользоваться в предвидении выполнения обновлений и срабатывания замков монополии строк. Оператор SELECT FOR UPDATE блокирует строки раньше, чем оператор UPDATE. Сначала он выполняет запрос для идентификации строк, подлежащих обновлению или удалению, а затем блокирует это множество строк. Оператор SELECT FOR UPDATE предпочтительнее, чем оператор UPDATE, когда, например, вы намереваетесь основы¬ вать обновление на существующих значениях в строке, потому что вам нужно гарантировать, что строка не-будет изменена кем-то другим до тех пор, пока вы не выполните свое обновление. При поступлении команды COMMIT или ROLLBACK запрос SELECT FOR UPDATE завершается и соответствующие ему замки снимаются. Наблюдение замков средствами пакета SQL*DBA Если база данных функционирует, администратор базы данных всегда может наблюдать текущие замки или защелки, например, с помощью пакета SQL*DBA. Для этого использу¬ ются следующие этапы: 1) . запустить пакет SQL*DBA; 2) . подключиться командой CONNECT к базе данных с именем пользователя DBA (АБД); 3) . ввести любую из следующих строк: MONITOR LOCKS MONITOR LATCHES Затем администратор базы данных может записать выходные Данные наблюдения на некоторый файл, воспользовавшись командой SPOOL языка SQL*DBA. Если вы ввели команду MONITOR LOCKS, текущие замки будут представляться символами, показанными в табл. 13-4. Отдельные замки строк не будут появляться в изображении Monitor locks, но если ваше изображение показывает замок транзакции (ТХ), это будет свидетельствовать о том, что транзакция поддерживает замки строк.
264 Таблица 13-4. Символы в изображении MONITOR LOCKS Символ Значение ТМ Замок данных на некоторой таблице, Этот замок покажет идентификатор таблицы и может появиться в любом режиме блокировки данных. Он может быть установлен либо неявно, либо явно ТХ Замок транзакции. Этот замок может сработать для любой транзакции, которая установила замок строки. Другие транзакции, требующие замков на блокированных строках, должны ждать исчезновения замка ТХ, прежде чем они будут обрабатываться TD Замок словаря на некоторой таблице. Будет показан идентификатор таблицы. Возможен либо режим S (замок грамматического разбора), либо режим X (замок ЯОД) ТТ Замок словаря на временном сегменте Параметры SERIALIZABLE и TABLE_LOCKING для INIT.ORA Информация из этого раздела представит для вас интерес только в том случае, если вы работаете с более ранней версией системы Oracle, чем версия 6.0, или же если вы должны работать в режиме, совместимом с ANSI. Когда вы запускаете экземпляр, два параметра SERIALIZABLE и TABLE-LOCKING для INIT.ORA определяют, как будет обраба¬ тываться t блокировка. В версии 6 с вариантом TPS обоим этим параметрам устанавливается значение "FALSE" по умолчанию. Почти всегда эти параметры не подлежат изменению, исключения возникают при использовании прикладных про¬ грамм, написанных для работы с прежними версиями системы Oracle. Вам следует изменять установки для этих параметров лишь в том случае, когда экземпляр ликвидируется. Множест¬ венные экземпляры с. доступом к системе разделения диска должны работать с одними и теми же установками для этих параметров. При установке значения TRUE для параметра SERIALIZABLE: 1. Все замки и ресурсы будут поддерживаться на уровне
265 таблиц (т .е., если вы блокируете одну строку в таблице, больше никто не может модифицировать какие-либо строки в этой таблице). 2. Система Oracle планирует такое исполнение всех параллель¬ ных транзакций, как будто каждая транзакция выполняется одна в данное время, т. е. пользователи могут запрашивать одну таблицу повторно ("повторимые чтения") и пребывать в уверенности, что они всегда видят одни и те же данные, но если другие пользователи хотят модифицировать эти данные, то они должны ждать, пока закончится транзакция того пользователя. Если вы хотите получить "повторимые чтения", не устанав¬ ливая значение TRUE для SERIALIZABLE, то вместо этого вы можете выполнить любое из следующих действий: • использовать SERIALIZABLE = FALSE и блокировать таблицу в режиме SHARE; • применить оператор SET TRANSACTION READ ONLY языка SQL; • использовать SELECT FOR UPDATE для всех запросов, чтобы при чтении строк блокировать их в режиме EXCLUSIVE. Когда TABLE-LOCKING устанавливается как TRUE: 1. Пока вы изменяете данные в таблице, другие пользователи не могут изменить какие-либо данные в этой таблице. 2. Другие пользователи могуг запрашивать данные или блоки¬ ровать строки по команде SELECT FOR UPDATE, но они должны ждать, пока ваша транзакция не завершит изменение данных. 3. Каждый пользователь для выполнения команды INSERT, UPDATE или DELETE должен ждать достижения замка таб¬ личной монополии. В табл. 13-5 показано, как следует использовать установки не по умолчанию для параметров SERIALIZABLE и TABLE-LOCKING. Таблица 13-5. Результаты установок для SERIALIZABLE и TABLE_LOCKING Случай 1 II III SERIALIZABLE = FALSE TRUE TRUE TABLE_LOCKING = TRUE FALSE TRUE Случай I: Эквивалентен прежним версиям СУРБД Oracle . (отсутствуют параллельные вставления, обновления или удаления из таблицы) Случай II: Совместим с ANSI
266 Случай III: Совместим с ANSI с блокировкой на уровне таблиц (отсутствуют параллельные вставления в таблицу) Когда и SERIALIZABLE, и TABLE__LOCKING установлены как FALSE, вы имеете дело с версией 6 системы Oracle с подсистемой обработки транзакций (TPS), включающей блокировку на уровне таблиц. Блокировка в пакете SQL*Forms Когда вы пользуетесь пакетом SQL*Forms, действуют спе¬ циальные правила блокировки процедур. Пакет SQL*Forms работает в режиме ROW SHARE. Дело в том, что замки на уровне строк полезны в приложениях, когда может пройти некоторое время после выборки из внешней памяти и обнов¬ ления строки, но до нажатия клавиши COMMIT. Применение замков на уровне строк дает гарантию, что эта строка не изменяется без предупреждающего сообщения, пока вы рабо¬ таете с ней. Если затребованная строка уже блокирована, вы увидите такое сообщение: Attempting to reserve record for update (x to abort) (попытка зарезервировать запись для обновления (х для аварийного завершения)) где: х — это последовательность прерываний вашей операционной системы. После этого пакет SQL*Forms заново запросит для вас замок и будет ждать, пока он не станет доступным. Любые изменения в данных из базовой таблицы не будут писаться, пока вы полностью не специфицируете все изменения и не нажмете клавишу COMMIT. Если происходит обратная прокрутка, то замки не снимаются. Вместо этого пакет SQL*Forms исходит из предположения, что вы измените некоторые значения и снова нажмете клавишу COMMIT. Пакет SQL*Forms не выполняет операторы LOCK для триггеров1. Если триггер находится у базовой таблицы для 1 Здесь триггер — это присоединенная процедура для действия, автомати¬ чески осуществляемого при выполнении заданных условий. — Прим, перев.
267 текущего блока и если строки были обновлены или удалены, то эта таблица уже блокирована. Однако если триггер находится не У базовой таблицы, то ваш триггер должен состоять по меньшей мере из двух операторов языка SQL, причем первый оператор должен блокировать эту небазовую таблицу в режиме ROW SHARE разделения строк. Это поможет избежать дли¬ тельных ожиданий. Если пользователи пакета SQL*Plus желают обновлять таблицы, с которыми работают пользователи пакета SQL*Forms, то им тоже следует применять режим ROW SHARE. Чтобы избежать тупиковых ситуаций, когда два пользователя одно¬ временно пытаются обратиться к одной и той же таблице: • блокируйте таблицы только при необходимости и только в необходимой степени, т. е. не пользуйтесь замком EXCLUSIVE там, где годится блокировка в режиме ROW SHARE; • всегда блокируйте таблицы в одной и той же последова¬ тельности: если одна форма или один триггер блокирует таблицу А и затем таблицу Б, а другая блокировка производится в обратном порядке, это увеличивает риск тупиковой ситуации. Координируйте последовательность блокировки таблиц со всеми разработчиками форм; • советуйте пользователям форм чаще передавать свою работу в базу данных. Обнаружение тупиков Проблема обнаружения тупиков возникает, когда один пользователь блокировал таблицу, а каждый другой пользователь из группы ждет, чтобы блокировать ту же таблицу. В результате работа всех других пользователей останавливается и возникает тупиковая ситуация. Система Oracle обнаруживает эту ситуацию и прокручивает работу обратно через наименьшее количество завершенных блоков базы данных, так чтобы можно было продолжить работу. Поскольку тупиковые ситуации вредоносны, следует проекти¬ ровать прикладные программы таким образом, чтобы избегать этой проблемы, например обеспечивая при всякой возможности всем пользователям таблицы доступ к ней в режиме ROW SHARE. Кроме того, для достижения максимальной эффектив¬ ности в системах коллективного пользования следует проекти¬
268 ровать прикладные программы так, чтобы все пользователи имели доступ к таблицам в режиме ROW SHARE. Изображение замков в системе ODS Вы можете воспользоваться вариантом изображения замков на странице ODS по всем вашим замкам и увидеть количество и тип используемых замков, обратившись к изображению с аргументом нуль следующим образом: L0 Каждый замок в изображении представляет один элемент в общей области системы. Это изображение покажет вам: • любой монопольный замок, поддерживаемый некоторым процессом в настоящее время; • любой процесс, ожидающий монопольного замка; • любой разделяемый замок, поддерживаемый процессом в настоящее время; • любой процесс, ожидающий сейчас разделяемого замка; • количество поддерживаемых замков CTL; • количество поддерживаемых замков словаря/граммати¬ ческого разбора; • количество поддерживаемых замков данных. Общие рекомендации относительно блокировки Основная цель блокировки состоит в сокращении заторов и максимизации поступления на выход. Для достижения этого важно минимизировать время между первым обновлением и командой COMMIT или ROLLBACK. Такой минимизации способствуют следущие общие рекомендации относительно блокировки. 1. Для операций UPDATE и DELETE, при которых пройдет некоторое время, прежде чем от вас поступит команда COMMIT, блокируйте те записи, которые собираетесь использовать, так чтобы они не изменялись, пока вы не внесете свои модифи¬ кации. 2. Для операций UPDATE и DELETE отсрочьте изменения до момента, непосредственно предшествующего вашей команде COMMIT. 3. Если другие пользователи занимаются обновлением в режиме ROW SHARE (как в пакете SQL*Forms), употребляйте
269 режим ROW SHARE, а не режим SHARE и не неявную блокировку. 4. При всякой возможности проектируйте ваши прикладные программы таким образом, чтобы все пользователи той или иной таблицы имели доступ к ней в режиме ROW SHARE. Это упростит способность вашей системы поддерживать парал¬ лельную работу многих пользователей. 5. Избегайте модификации таких базовых структур, как таблицы, столбцы, индексы, кластеры, представления и сино¬ нимы в течение периодов времени, когда ваши прикладные программы интенсивно используются. Заключение В этой главе объясняются неявные и явные замки и режимы блокировки. Подробно разбираются методы пресечения блоки¬ ровки по умолчанию и наблюдение используемых замков. Перечисляются некоторые общие рекомендации для предотв¬ ращения тупиковых ситуаций.
14 Язык PL/SQL JTL/SQL — это процедурный язык программирования, пред¬ назначенный для использования с СУРБД Oracle. Он содержит в качестве подъязыка версию языка SQL из системы Oracle. Если вы знакомы с языком программирования Паскаль, то заметите, что PL/SQL похож на язык Паскаль, потому что он блочно структурирован, как и Паскаль, и в нем блоки ограничиваются такими же командами BEGIN и END. Если вы знаете язык программирования Си, который тоже блочно структурирован, то увидите много сходств между Си и PL/SQL. Если вы никогда не работали с языками программирования, то знайте, что блок — это совокупность команд, некоторым образом ограниченная в начале и в конце. В языке Си для этого служат скобки { и }. В языке Паскаль используются слова BEGIN и END. В PL/SQL тоже используются BEGIN и END. Слово DECLARE служит в языке PL/SQL для указания тех переменных, которые вы собираетесь описать. Если слово DECLARE непосредственно предшествует слову BEGIN, то считается, что описываемые переменные находятся внутри блока, который начинается с данного оператора BEGIN. В языке PL/SQL вы можете описать исключение EXCEPTION для обработки ошибок, возникающих во время выполнения блока. Исключения описываются в блоке в части DECLARE, в конце блока вы помещаете ключевое слово EXCEPTION, за
271 которым следуют "обработчики исключений". Итак, ваш блок выглядит следующим образом: DECLARE <описания> BEGIN < строки кода> EXCEPTION < обработчики исключений> END; Подблоки, если они имеются, включаются между словами BEGIN и EXCEPTION. Подробно исключения разбираются в разделе "Исключения" в этой главе. Блоки могут быть вложены в другие блоки. Если внутри блока описана некоторая переменная, то она не распознается вне блока. Однако внутренние блоки распознают переменные, описанные в объемлющих блоках. Описанная в блоке перемен¬ ная является локальной относительно этого блока и глобальной относительно вложенных в него блоков. Существуют четыре способа использования языка PL/SQL. Вы можете: 1. вставлять блоки на языке PL/SQL в программы на языках Pro* системы Oracle; 2. использовать блоки PL/SQL в языке SQL*Forms; 3. запускать блоки на языке PL/SQL из пакета SQL*Plus; 4. запускать блоки PL/SQL из SQL*DBA. В этой главе мы рассматриваем команды управления из языка PL/SQL в разд. "Поток управления в языке PL/SQL". В разд. "Курсоры", а также в следующих двух разделах рассмат¬ ривается подмножество SQL в PL/SQL, включая использование курсоров. Обработка транзакций представлена в разд. "Транзак¬ ции", а функции языка SQL обсуждаются в следующем за ним разделе. Ограничители и идентификаторы в языке PL/SQL Язык PL/SQL содержит следующие разделители: + > *, / Плюс, минус, умножить, разделить, S >, = меньше чем, больше чем и равно * * Экспонента
272 ; Завершает операторы языка PL/SQL Служит для ссылки на значение из столбца с переменными типа запись Указывает использование главной переменной , Отделяет строку символов " Позволяет использовать строку символов как идентификатор | Употребляется для обозначения в обработчиках исключений := Служит для присваивания значений переменным Используется в циклах for | | Служит для сочленения строк < < > > Отделяет имя цикла или метку для оператора GOTO В языке PL/SQL идентификаторы должны содержать не более чем тридцать символов, начинаются с буквы и могут содержать до 29 других букв, цифр или любых символов $_#. Поток управления в языке PL/SQL В языке PL/SQL существуют четыре вида операторов управления: 1. IF...THEN, ELSEIF...THEN, ELSE, END IF 2. LOOPS A. LOOP, ENDLOOP Б. FOR...LOOP, ENDLOOP B. WHILE...LOOP, ENDLOOP 3. GOTO 4. RAISE Первые три вида операторов рассматриваются в последую¬ щих разделах. Оператор RAISE рассматривается в разд. "Иск¬ лючения". Операторы IF Простейшая форма оператора IF следующая: IF <условие> THEN < строки кода> END IF;
273 Если условие вычисляется как TRUE, то выполняются строки кода и управление передается на первый оператор после END IF;, если условие вычисляется как FALSE, то управление передается на первый оператор после END IF; без выполнения строк кода. ELSE IF...THEN может служить для проверки других условий, a ELSE может служить для выполнения некоторого другого кода в случае, если ни одно из условий не истинно. Например: IF <условие 1 > THEN < строки кода 1 > ELSEIF <условие 2> THEN < строки кода 2> ELSEIF <условиеЗ> THEN < строки кода 3> ELSE < строки кода 4> END IF; Если условие 1 оказывается истинным, то будут выполнены строки кода 1. Если условие 1 не истинно, а условие 2 истинно, то выполняются строки кода 2. Если условия 1 и 2 не истинны, а условие 3 истинно, то будут выполнены строки кода 3. Если условия 1, 2 и 3 ложны, то выполнятся строки кода 4. Циклы Циклы служат для повторяемого выполнения указанного кода. Например: LOOP < строки кода> END LOOP; приведет к бесконечному повторению строк кода из цикла. Поскольку такое положение дел нежелательно, должен иметься способ выхода из цикла. Язык PL/SQL предоставляет команду EXIT, осуществляющую выход из цикла. Например: LOOP < строки кода> IF <условие> THEN EXIT; END LOOP; приведет к выходу из цикла после выполнения кода, как только условие является истиной. Операторы GOTO и RAISE тоже выводят из цикла.
274 Один из способов управления циклом состоит в том, чтобы иметь целую величину, ограниченную некоторым множеством значений. Эта величина возрастает при каждом выполнении цикла. Когда она достигает значения, выходящего из указанного множества, цикл заканчивается и управление передается пер¬ вому оператору после цикла. Язык PL/SQL обеспечивает для этой цели команду FOR <переменная> IN <начало диапазонам. < конец диапазона> LOOP Например: FOR i IN 1..10 LOOP < строки кода> END LOOP; будет повторять строки кода десять раз. В первый раз переменная i получит значение 1, а в последний раз i примет значение 10. При каждом прохождении через цикл значение переменной i будет увеличиваться на единицу. Предусмотрено ключевое слово REVERSE для выполнения цикла с убыванием значения переменной. Например: FOR i IN REVERSE 1..10 LOOP <строки кода> END LOOP; будет повторять строки кода десять раз. В первый раз переменная i примет значение 10, а в последний раз значением i будет единица. При каждом выполнения цикла значение переменной i будет уменьшаться на единицу. Циклы WHILE предназначаются для повторяемого выпол¬ нения кода, пока условие остается истинным. Формат цикла WHILE такой: WHILE <условие> LOOP < строки кода> END LOOP; Операторы GOTO позволяют осуществлять переходы в блоке. Вы помещаете где-то в блоке метку, и тогда ключевое слово GOTO, за которым следует эта метка, приводит к передаче управления на первую команду после данной метки. Например: WHILE <условие> LOOP < строки кода 1 >
275 IF <условие> GOTO gronk; END IF; END LOOP; << gronk >> < строки кода 2 > Если вы находитесь в цикле WHILE и условие справедливо, когда вы достигаете оператор IF, то управление будет передано на первый оператор из строк кода 2. Метки должны ограни¬ чиваться знаками << и >>. Вы не имеете возможности передавать управление внутрь цикла посредством оператора GOTO. Употребление операторов GOTO является скверной практикой программирования и может в высшей степени затруднить отладку. Хуже всего, когда метка предшествует оператору GOTO. Обычно вы можете выходить из цикла, пользуясь другими средствами, например оператором EXIT, а затем сопровождать цикл оператором IF для определения, что делать дальше. Обсуждение принципов хорошей практики программирования выходит за рамки этой книги, но мы надеемся, что вы никогда не будете употреблять операторы GOTO, если сможете другим способом выразить выполнение нужной вам процедуры. Курсоры Используемый в этом разделе термин курсор не имеет отношения к курсору на вашем экране. Курсор — это структура данных, позволяющая процедурно работать с таблицей, явля¬ ющейся результатом выполнения оператора SELECT на языке SQL. С помощью курсора вы получаете доступ к строкам таблицы — результата в последовательном порядке и можете Делать со значениями в столбцах все, что пожелаете. В языке PL/SQL существуют курсоры двух видов: явные и неявные. Если вы намереваетесь использовать явный курсор, то должны создать его, описав в разделе DECLARE некоторого блока. Для этого применяется следующий формат: CURSOR <имя курсорах:имя параметра> <тип параметрах. IS соператор выбора> FOR UPDATE OF <имя столбцах.; где
276 <имя курсора > <имя параметра > <тип параметра > — это имя, по которому вы ссылаетесь на курсор. Оно должно удовлетворять требованиям к идентификаторам необязательное, причем может иметься более чем один параметр. Параметры используются в предложении WHERE в операторе SELECT. Имя параметра может содержаться только в операторе SELECT в описании курсора. Параметрам присваиваются значения в операторе OPEN (См. ниже.) — это либо CHAR, либо NUMBER, либо DATE, либо BOOLEAN. К типу не добавляется никаких ограничений. Например, вы можете употребить только тип CHAR, но не CHAR(IO) FOR UPDATE OF используется, только если вы намереваетесь обновить столбец или столбцы после FOR UPDATE OF, разделив их запятыми. Чтобы воспользоваться курсором, вы должны открыть его командой OPEN. Эта команда интерпретирует оператор SELECT в описании курсора, используя значения параметров, поступа¬ ющие от оператора OPEN. Значения для параметров могут быть представлены с помощью либо позиционной ассоциации, либо именной ассоциации. Результатом является таблица, которую вы можете циклически обрабатывать строка за строкой. При использовании позиционной ассоциации формат оператора OPEN такой: OPEN <имя курсора>(<значение параметра>,...); где <имя курсора > должно быть именем, присвоенным курсору в операторе CURSOR < значение параметра > — это значение, которое должно быть присвоено параметру, появляющемуся в той же позиции в операторе CURSOR При использовании именной ассоциации формат оператора OPEN имеет следующий вид:
277 OPEN <имя курсора>(<имя параметра> = <значение параметра>,...); где <имя курсора > должно быть именем, данным курсору в операторе CURSOR <имя параметра > — это имя параметра, появляющегося в операторе CURSOR < значение параметра > — это значение, которое должно быть присвоено этому параметру Можно заново открыть курсор, перед этим не закрывая его. У вас может возникнуть желание поступить так, чтобы изменить значения параметров. После того как вы открыли курсор, существуют два способа перебора строк из курсора. Один способ состоит в использовании курсора для цикла, который будет описан ниже. При другом способе применяется команда FETCH. Команда FETCH имеет следующий формат: FETCH <имя курсора> INTO <имя переменной 1 >,...,<имя переменной п>; где <имя курсора > — это имя, данное курсору в операторе CURSOR <имя переменной 1> — это имя переменной, описанной в части DECLARE. Должно иметься столько же имен переменных, сколько существует столбцов в результирующей таблице оператора CURSOR SELECT. Значение в текущей строке первого столбца будет введено в переменной 1 и так далее Оператор FETCH может использоваться также с типом переменной записи. Чтобы описать переменную запись для курсора, вы должны описать имя переменной, которое следует за оператором CURSOR, сопровождаемым именем курсора и выражением %ROWTYPE. Например: DECLARE CURSOR gronk IS...; gronkrecord gronk%ROWTYPE;
278 описывает gronk_record как переменную запись для резуль¬ тирующей таблицы оператора SELECT для курсора gronk. Тогда вы можете употребить переменную gronk__record в операторе FETCH следующим образом: FETCH gronk INTO gronk_record; Значение для данного столбца из строки, выбранной оператором FETCH в переменную типа запись, может быть получено указанием имени переменной типа запись, за которым следует точка, а потом имя столбца, к которому вы хотите получить доступ. Например, если вам нужен доступ к id, то напишите gronk_record.id. Если вы используете в операторе FETCH обыкновенные параметры, то они должны быть описаны в части DECLARE блока. Система Oracle предоставляет вам атрибут %TYPE, позволяющий гарантировать, что эти переменные относятся к тому же типу данных, что и столбцы, привязанные оператором FETCH к данным переменным. Чтобы использовать этот атрибут, нужно написать имя переменной, сопровождаемое именем столбца, за которым сразу же следует атрибут %TYPE, Например: DECLARE служащий_первый_имя служ.первый_имя %TYPE даст гарантию, что переменная служащий_первый_имя имеет такой же тип данных, как и столбец первый_имя в таблице служ. Когда курсор открыт, указатель курсора направлен на позицию, предшествующую первой строке результирующей таблицы. Каждый оператор FETCH продвигает указатель курсора на одну строку вперед в результирующей таблице. Если FETCH выполняется, когда указатель курсора направлен на последнюю строку, то этот указатель продвинется за конец результирующей таблицы. Если вы желаете снова установить указатель курсора перед началом результирующей таблицы, то можете заново открыть курсор, не закрывая его предварительно, и использовать те же значения параметров. Когда вы закончили работу с открытым курсором, можете закрыть курсор командой CLOSE. Для этого воспользуйтесь следующим форматом: CLOSE <имя курсора>;
279 Команда CLOSE освобождает все ресурсы, которые поддер¬ живались открытым курсором. Обычно вы будете пользоваться оператором FETCH в цикле для продвижения указателя курсора по строкам результирующей таблицы. Если в команде CURSOR SELECT нет параметров, то система Oracle обеспечивает ’’курсор для цикла”, чтобы дать вам возможность продвигаться по строкам результирующей таблицы без открывания курсора и без команды FETCH. Для этого применяется такой формат: FOR <имя переменной записи> IN <имя курсора> LOOP <строки кода с использованием имени переменной записи и через точку имен столбцов > END LOOP; где <имя переменной записи > — это имя переменной записи, описанной в силу появления в цикле FOR, причем IN сопровождается именем курсора. Эта переменная запись не описывается в разделе DECLARE блока. При первом прохождении цикла курсор будет открыт и переменная запись будет хранить значения в первой строке результирующей таблицы. При дальнейших прохождениях цикла переменная запись будет хранить значения в последующих строках. Когда цикл завершит последнюю строку в результирующей таблице, произойдет выход из цикла и курсор будет закрыт командой CLOSE <имя курсора > — это имя курсора, ранее описанного в блоке Если ваше описание курсора содержит предложение FOR UPDATE OF, то вы можете обновить столбцы, которые названы после предложения FOR UPDATE OF, в текущей строке курсора, воспользовавшись оператором UPDATE языка SQL с ключе¬
280 выми словами WHERE CURRENT OF. Для этого применяется такой формат: UPDATE <имя таблицы> SET <имя столбца> = <выражение на SQL>,... WHERE CURRENT OF <имя курсора>; Аналогично вы можете употребить оператор DELETE языка SQL с предложением WHERE CURRENT OF при условии, что описание курсора содержит слова FOR UPDATE OF. В команде UPDATE вы можете заменить < выражение на SQL> на команду SELECT языка SQL при условии, что возвращается только одно значение, причем.того же типа, что и обновляемый столбец. Для всякой команды на языке SQL, не связанной с описанным в DECLARE курсором (’’явным курсором"), система Oracle открывает курсор ("неявный курсор"). На открытый позже всех других неявный курсор можно ссылаться по курсорному имени SQL%. Атрибуты курсора Существуют четыре типа переменных (в документации по системе Oracle они называются атрибутами курсора) %NOTFOUND, %FOUND, %ROWCOUNT и %ISOPEN, связанные с операторами CURSOR SQL. Для переменных %NOTFOUND и %FOUND система Oracle устанавливает логические значения TRUE, FALSE и NULL. Переменная %FOUND принимает значение NULL до выполнения первого оператора FETCH. После каждого оператора FETCH переменная %FOUND получает значение TRUE, если строка была возвращена, или FALSE в противном случае. Если %FOUND принимает значение NULL, то такое же значение принимает %NOTFOUND. Если %FOUND равняется TRUE, то %NOTFOUND - это FALSE, а если %FOUND = FALSE, то %NOTFOUND есть TRUE. %ROWCOUNT содержит число строк, подвергнутых обработке оператором FETCH от курсора. До применения FETCH к первой строке переменная FETCH содержит нуль. Переменная %ISOPEN равняется TRUE, если курсор открыт, или FALSE в противном случае. Для ссылки на эти переменные вы должны указать имя курсора, за которым сразу следуют знак % и имя переменной.
281 В случае неявного курсора вы пользуетесь именем SQL для явного курсора. Переменная SQL %FOUND принимает значение TRUE, если команда INSERT, UPDATE или DELETE воздействовала на одну или на несколько строк или если команда SELECT для одной строки возвратила некоторую строку. В противном случае она принимает значение FALSE. Переменная SQL %ROWCOUNT содержит значение, равное числу строк, на которые воздействует последний оператор языка SQL. Поскольку неявный курсор всегда закрывается сразу после выполнения соответствующего оператора SQL, при ссылке на переменную SQL %ISOPEN она всегда оказывается равной FALSE. Команды языка SQL, которые не требуют явного курсора Если вы хотите осуществлять выбор командой SELECT в случае, когда результирующая таблица содержит только одну строку, то можете воспользоваться формой SELECT...INTO оператора SELECT. Формат для SELECT...INTO следующий: SELECT <столбец 1,...,столбец n> INTO спеременные или переменная запись > FROM < остальная часть SELECT>; где <столбец 1,...,столбец п> — это список столбцов < переменные или переменная запись > — это либо список переменных, которым должны быть присвоены восстанавливаемые значения, либо одиночная переменная запись < остальная часть SELECT > — это оставшаяся часть обычного оператора SELECT Если возвращается нуль Строк или более чем одна строка, то появится ошибка. Если возьращается нуль строк, то • SQLCODE возвращает — 1403; • SQLERRM возвращает ”no_data__found" (данных не обна¬ ружено);
282 • Возбуждается исключение no_data-found; • SQL%NOTFOUND принимает значение TRUE; • SQL%FOUND равняется FALSE; • SQL%ROWCOUNT принимает значение нуль. Если возвращается более ?гем одна строка, то • SQLCODE возвращает - 2112; • SQLERRM возвращает "too_many_rows" (слишком много строк); • Возбуждается исключение too_many_rows; • SQL%NOTFOUND принимает значение FALSE; • SQL%FOUND равняется TRUE; • SQL%ROWCOUNT принимает значение 2. Относительно формата для команд DELETE, UPDATE и INSERT см. гл. 7. Если ни одна строка не затронута, то • SQL%NOTFOUND равняется TRUE; • SQL%FOUND равняется FALSE; • SQL%ROWCOUNT равняется нулю. Если затронуты несколько строк, то • SQL%NOTFOUND принимает значение FALSE; • SQL%FOUND равняется TRUE; • SQL%ROWCOUNT равняется числу затронутых строк. Исключения В языке PL/SQL исключения используются для обработки любых ошибок, которые возникают во время выполнения блока. Существуют исключения двух типов: определенные изнутри и определенные пользователем. Исключения, определенные пользователем Исключения, определенные пользователем, должны быть описаны в разделе DECLARE блока. Для этого используется следующий формат: DECLARE <имя исключения> EXCEPTION; BEGIN Во время выполнения блока (между ключевыми словами BEGIN и EXCEPTION) вы должны проверять (посредством
283 оператора IF) наличие вашего исключения, определенного пользователем. Если такое исключение встретилось, то вы выполняете оператор RAISE для передачи управления обработ¬ чику исключения в разделе EXCEPTION блока. Схематически эта ситуация выглядит следующим образом: DECLARE симя исключения> EXCEPTION; BEGIN IF сусловие искпючения> RAISE симя исключения>; END IF; EXCEPTION WHEN симя исключения> = > с строки кода для обработки исключения > OTHERS = > с строки кода для обработки любого исключения, не упомянутого явно после WHEN> END; Несколько исключений могут обрабатываться теми же строками кода. Для этого напишите следующее: WHEN симя исключения 11...|имя исключения п> = > Знак | читается как "или". После обработки исключения управление передается на первый оператор после конца блока. Оператор RAISE может появиться также в пределеах обра¬ ботки исключения без имени исключения. В результате пакет PL/SQL ищет обработчика с тем же именем в объемлющем блоке. Если в объемлющем блоке такого обработчика исключе¬ ния не обнаружено, то поиск повторяется в блоке, объемлющем тот объемлющий блок. Наконец, если нигде обработчика Исключения не обнаружено, то PL/SQL останавливает выпол¬ нение с необработанным исключением ошибки. Исключения, определенные изнутри Помимо определенных пользователем исключений, система Oracle включает тринадцать исключений, определенных изнутри:
284 • DUP_VAL_ON_INDEX Для индекса, который был специфицирован как уникальный, существуют дублирующие ключи. (Номер ошибки в системе Oracle -0001) • INVALID-CURSOR Операция с курсором незаконная. Например, закрытие неоткрытого курсора. (Номер ошибки в системе Oracle -1001) • INVALID-NUMBER Отказ преобразования строки символов в число. (Номер ошибки в системе Oracle -1722) • LOGIN-DENIED Неправильное имя пользователя/пароль. (Номер ошибки в системе Oracle -1017) • NO_DATA_FOUND Оператор SELECT возвращает нуль строк. (Номер ошибки в системе Oracle +100) • NOT-LOGGED-ON Пакет PL/SQL выдает вызов Oracle, не войдя в систему. (Номер ошибки в системе Oracle -1012) • PROGRAM-ERROR В пакете PL/SQL возникла внутренняя проблема. (Номер ошибки в системе Oracle -6501) • STORAGE-ERROR Пакет PL/SQL вышел из пределов отведенной памяти, или содержимое памяти испорчено. (Номер ошибки в системе Oracle -6500) • TIMEOUT-ON-RESOURCE Истекло время ожидания ресурса для Oracle. (Номер ошибки в системе Oracle -0051) • TOO-MANY-ROWS Оператор SELECT возвращает более чем одну строк (Номер ошибки в системе Oracle -2112) • TRANSACTION-BACKED_OUT Система Oracle отменяет транзакцию вследствие ошибки обработки. (Номер ошибки в системе Oracle -0061) • VALUE-ERROR Ошибки преобоазований и ограничений. (Номер ошибки в системе Oracle -6502)
285 • ZERO_DIVIDE Вы пытаетесь делить на нуль. (Номер ошибки в системе Oracle -1476) Для использования этих внутренних исключений по имени вы должны описать имя для исключения в разделе DECLARE блока. Затем вы должны привязать это имя к номеру ошибки в системе Oracle. Формат для этого следующий: DECLARE <имя внутреннего исключения> EXCEPTION; PRAGMA EXCEPTIONJNIT (<имя внутреннего исключения>, < код ошибки>); BEGIN EXCEPTION WHEN <имя внутреннего исключения> = > < строки кода обработки ошибки > END; Далее приводится пример частного случая. DECLARE TOO_MANY_EXCEPTION; PRAGMA EXCEPTION_INIT(TOO_MANY_ROWS,-2112); BEGIN SELECT... EXCEPTION WHEN TOO_MANY_ROWS = > <забота об ошибке> END; Выше ключевое слово PRAGMA означает, что оператор передает информацию компилятору PL/SQL (а не обрабатывает ее). Транзакции Чтобы избежать порчи вашей базы данных, вы должны '*асто производить ряд изменений одновременно. Например, если вы совершаете продажу, то вы должны ввести информацию 0 Ней в таблицу продаж и обновить таблицу запасов. Если вы вЫполняете только одно из этих действий и воздерживаетесь 014 Другого, ваша база данных потеряет синхронность, т. е. Испортится.
286 Во избежание порчи базы данных было разработано понятие транзакции. Например, транзакция может включать как ввод информации о продаже, так и обновление информации 0 запасах. Не допустить порчу своей базы данных вам помогут команды COMMIT, ROLLBACK и SAVEPOINT системы Oracle. В промежутках между командами COMMIT не производится никаких фактических изменений в базе данных. Когда вы выполняете COMMIT, реализуются все изменения, поступившие после последней предыдущей команды COMMIT. При возникновении ошибок вы можете "прокрутить" базу данных обратной командой ROLLBACK до состояния, в котором она находилась после предыдущей команды COMMIT. Команда SAVEPOINT предусмотрена для того, чтобы вам не требовалось прокручивать обратно весь путь до предыдущей команды COMMIT. Формат команды SAVEPOINT такой: SAVEPOINT < идентификатор контрольной точки> где < идентификатор контрольной точки > — это идентификатор, который вы выбираете для реализации команды SAVEPOINT. Формат команды следующий: ROLLBACK [WORK] [ТО] [SAVEPOINT][<идентификатор контрольной точки>]; где [WORK] [ТО] [SAVEPOINT] — это необязательное ключевое слово — необязательное ключевое слово, которое должно употребляться, только если вы хотите специфицировать обратную прокрутку к контрольной точке. Любые промежу¬ точные контрольные точки будут стираться — это необязательное ключевое слово
287 ^идентификатор контрольной точки> — это идентификатор, прежде использованный в команде SAVEPOINT. Формат команды COMMIT имеет вид COMMIT [WORK]; где [WORK] — необязательное ключевое слово. Команда COMMIT реализует изменения, которые были внесены в базу данных. До выполнения COMMIT любые ваши запросы к базе данных будут показывать внесенные изменения, но запросы от других пользователей не будут показывать этих изменений. Кроме того, команда COMMIT снимает любые замки, внесенные вами в базу данных. О замках см. гл. 13. Команда SET TRANSACTION дает вам возможность установить транзакцию только чтения. Для этого служит следующий формат: SET TRANSACTION [READ ONLY]; где [READ ONLY] — необязательная часть. Дальнейшие подробности о команде SET TRANSACTION см. в SQL Language Reference Manual (руководство no языку SQL), Функции языка PL/SQL В языке PL/SQL существуют функции шести типов. Это выдачи сообщений об ошибках, символьные, числовые, календарные Функции, преобразование данных и смешанные функции. Эти Функции можно использовать со знаком := (присваивание), чтобы помещать результат в некоторую переменную. Функции сообщений об ошибках Для сообщения об ошибках служат функции SQLCODE и SQLERRM. Функция SQLCODE возвращает номер ошибки в системе Oracle для последней появившейся ошибки. Формат Функции SQLERRM такой: SQLERRM [<код ошибки>] где (^код ошибки >) является необязательным и может быть любым кодом ошибки в системе Oracle.
288 Если параметр (<код ошибки >) опущсц то результат получается такой же, как если бы была применена функция SQLERRM (SQLCODE). Символьные функции ASCII(cTpoKa символов) CHR(HOMep) Ш1ТСАР(строка) LENGTH(cTpoKa) LOWER(cTpoKa) Возвращает код ASCII для первого символа из строки Возвращает символ, соответствующий данному коду ASCII Делает прописной первую букву строки Возвращает длину строки символов Делает все символы в строке строчными Дополняет строку слева символами- LTRIM@CTpoKa, подмножество) LPAD(cTpoKa, длина [,символ заполнения]) заполнителями до предписанной длины. Если использована необязательная часть [,символ заполнения], то этот символ служит для заполнения строки Удаляет все символы множества слева из строки до появления первого символа не из множества То же, что LPAD, но справа То же, что LTRIM, но справа RPAD RTRIM SUBSTR(crpoKa, позиция Возвращает ту подстроку строк, [Jen]) UPPER(cTpoKa) Числовые функции ABS() CEIL(n) FLOOR(n) MOD(m,n) POWER (m,n) ROUND(m,n) которая начинается с указанной позиции и имеет длину 1еп. Если параметр 1еп опущен, то возвращаемая подстрока продолжается до конца строки Преобразует все буквы в прописные абсолютная величина наименьшее целое > п наибольшее целое < п остаток от деления ш на п m в степени п ш округляется до п десятичных позиций. Если параметр п опущен,
289 SlGN(n) TRUNC(m,n) SQRT(n) Календарные функции ADD_MONTHS(^aTa,n) LAST_D AY (дата) MONTHS_BETWEEN (дата 1, дата 2) 1ЧЕХУ_Т1МЕ(дата 1, часовой пояс 1, часовой пояс 2) to m округляется до нуля десятичных позиций Возвращает знак числа п m усекается до п десятичных позиций или до нуля десятичных позиций, если параметр п опущен Квадратный корень, если значение п положительное, или NULL в противном случае п месяцев добавляются к дате, дата и п могут быть указаны в обратном порядке последний день месяца число месяцев между датой 1 и датой 2 получив дату и время из часового пояса 1, возвращает дату и время из часового пояса 2 Возможны следующие часовые пояса: AST Атлантическое стандарное время ADT Атлантическое дневное время BST Берингово стандарное время BDT Берингово дневное время CST Центральное стандартное время CDT Центральное дневное время EST Восточное стандартное время EDT Восточное дневное время HST Стандартное время Аляски—Гаваев HDT Дневное время Аляски—Гаваев MST Стандартное время Монтаны MDT Дневное время Монтаны NST Стандартное время Ньюфаундленда NDT Дневное время Ньюфаундленда PST Тихоокеанское стандартное время PDT Тихоокеанское дневное время YST Стандартное время Юкона YDT Дневное время Юкона NEXT^D AY (дата, первая дата с заданным названием название дня недели) дня недели после указанной даты
290 ROUND^aia, формат) округляет дату в зависимости от формата. Если формат опущен, то по умолчанию формат DD Возможные форматы: СС, SCC SYYY, YYYY, year SYEAR, YYY, YY, YQ MONTH, MON, ММ WW W DDD, DD, J DAY, DY, D НН, HH12, HH24 MI Столетие Год (округление до 1 июля) Квартал (округляется до 16-го числа второго месяца) Месяц (округляется до 16-го числа) Начало недели года Начало недели месяца День Ближайшее воскресенье Час Минута Функции преобразования ТО_СНАИ(дата, формат) преобразует дату в строку символов. О форматах см. разд. "Format Models" (модели форматов) в "SQL Language Reference Manual" (руководство по языку SQL) TO_CHAR(n) преобразует п в строку символов ТО_БАТЕ(строка, формат) преобразует строку символов в дату TO_NUMBER(cTpoKa) преобразует строку символов в номер Смешанные функции NVL(arg 1, arg 2) (NVL = пустое значение) берет два аргумента одинакового типа и возвращает arg 1, если это не NULL. Если arg 1 — это NULL, то возвращается arg 2. Заключение Язык PL/SQL представляет собой язык программирования для написания прикладных программ в системе Oracle, версия 6. Помимо средств SQL и курсоров он содержит процедурные команды, и поэтому его можно использовать самостоятельно, а не встраивать в какой-то включающий язык.
15 SQL*Forms ОQL*Forms представляет собой интерактивную программу для создания заказных форм, модификации существующих форм, удаления определений форм из базы данных и запуска форм. SQL*Forms направляет работу проектировщика форм через ряд окон (меньших, чем полноэкранные изображения), которые "всплывают" над частью содержимого экрана, определяя форму, блоки в форме и поля в блоке. Программа SQL*Forms обеспечивает две основные возможности: 1. Средство создания и модификации форм, которое назы¬ вается экранной живописью и используется исключительно проектировщиками при разработке форм. Оно позволяет про¬ ектировщику "рисовать" форму на экране и специфицировать определенные функции формы посредством окон. 2. Средство запуска форм, предназначенное для конечных пользователей. Оно проектируется с максимальным возможным учетом имеющегося опыта заполнения бумажных форм. SQL*Forms состоит из следущих программных компонентов: IAG, IAC, IAP, файла FSP и IAD. Все эти компоненты кратко описаны в гл. 2. Определения Для целей этой главы понадобятся следующие определения: Форма. Порядок заполнения бланков, облегчающих ввод, обновление и запрос данных.
292 Страница. Раздел в форме. В каждый момент на вашем экране можно увидеть лишь одну страницу. Блок. Информация из одной таблицы в базе данных, содержит одну или несколько записей из этой таблицы. На одной странице формы могут появиться много блоков, или же один блок может распределиться по многим страницам. Запись. Одна строка из базы данных (В том же смысле, что и в других главах этой книги.) Поле. Особая часть формы, служащая для ввода и/или изображения одного элемента. Иногда, но не всегда поля представляют столбцы из таблицы базы данных. Окно. Появляющаяся на вашем экране рамка, которая покрывает часть содержимого экрана. Окно содержит ряд элементов, которые вы можете выбирать и обрабатывать посредством функциональных ключей. Триггер. Последовательность команд языка SQL и команд SQL*Forms, которые выполняются, когда происходит опреде¬ ленное событие. С помощью программы SQL*Forms вы "рисуете" форму на экране с применением экранной живописи. Когда вы вводите команды, их воздействие на текущую страницу формы сразу же показывается на экране. Таким образом, вы специфицируете внешний вид формы, те поля и постоянный текст, которые представлены в форме, и места их расположения. Из программы экранной живописи вы можете обращаться к окнам, которые специфицируют функцию формы. Например, можно узнать, какой столбец таблицы будет соответствовать каждому полю, каковы характеристики каждого поля и какие триггеры ассоциируются с каждым полем и блоком. Запуск SQL*Forms Запуск программы SQL*Forms осуществляется следующей командой: SQL*FORMS После нажатия вами [ACCEPT] (ввод с клавиатуры) про¬ грамма SQL*Forms пригласит вас ввести ваше имя пользователя и пароль. После их проверки вы увидите основное меню SQL*Forms.
293 Создание формы Существуют два типа таких форм, которые вы можете создавать с помощью программы SQL*Forms: • по умолчанию форму, которая уже существует в базе данных и которую вы модифицируете по варианту MODIFY основного меню; • заказную форму, начинающуюся с временной структуры данных. Создавать и модифицировать форму по умолчанию обычно бывает легче, чем создавать заказную форму. Замечание. При установке SQL*Forms определенным клавишам присваиваются конкретные функции. Для каждой системы они свои, не такие, как для других систем. "Схема вспомогательной клавиатуры" покажет вам присвоение клавиш для вашей системы. Получите ее от вашего администратора базы данных, перед тем как начинать работу с программой SQL*Forms. В дальнейшем тексте называется только функция (например [SELECT]), а не конкретная клавиша, которую вы должны нажать в вашей операционной системе, чтобы активизировать эту функцию. Создание формы по умолчанию Когда вы выдаете запрос формы по умолчанию, SQL*Forms запрашивает информацию о желаемой вами форме, а затем создает форму по умолчанию. Потом управление передается в основное меню. Выполняются следующие этапы: 1. В окне CHOOSE FORM введите имя, которое вы намереваетесь дать форме. Максимальное число букв, которые может содержать такое имя, изменяется от 8 до 30 в зависимости от операционной системы. 2. Наведите курсор на CREATE в окне CHOOSE FORM и нажмите [SELECT]. 3. Появится окно CHOOSE BLOCK (выбор блока). Наведите курсор на DEFAULT (по умолчанию) и нажмите [SELECT]. 4. SQL*Forms изобразит окно DEFAULT BLOCK. Специфи¬ цированное вами на этапе 1 имя блока появится в позиции name этого окна, если это правильное имя блока. Если такое Имя блока сейчас не существует, то вам понадобится специ¬ фицировать правильное имя в этом окне DEFAULT BLOCK. Затем это правильное имя относится к "базовой таблице". 5. Окно DEFAULT BLOCK покажет 1 рядом с числом строк,
294 которые должны быть изображены. Вы можете заменить его на любое желаемое вами число. Кроме того, будет показана единица рядом с базовой линией, этим указывается, что первая строка блока будет начинаться вверху экрана. SQL*Forms автоматически поместит следующий создаваемый вами блок под этим блоком, оставив между блоками некоторое пустое пространство, если вы не специфицируете другой вариант. 6. По умолчанию все столбцы из базовой таблицы будут отнесены к создаваемой вами форме. а. Если вы хотите поддерживать все столбцы в этой форме, то: 1) Нажмите [ACCEPT], и окно CHOOSE BLOCK будет показано заново. 2) Нажмите [ACCEPT] снова, чтобы вернуться в окно CHOOSE FORM. 3) Перейдите к этапу 7. (Форма должна быть сгенери¬ рована командой GENERATE, прежде чем ее можно будет запускать в работу командой RUN.) б. Если вы не хотите, чтобы все столбцы относились к форме, то вы должны специфицировать, какие столбцы следует исключить. Для этого: 1) Направьте курсор на COLUMNS в окне DEFAULT BLOCK и нажмите [SELECT]. SQL*Forms покажет окно SELECT COLUMNS, причем все столбцы базовой таблицы перечисляются с высвечиванием для включения в форму. 2) Нажимайте [NEXT FIELD] (следующее поле) до тех пор, пока курсор не окажется наведенным на имя столбца, который вы хотите исключить. Затем нажмите [SELECT], чтобы отменить высвечивание этого имени столбца. 3) Продолжайте отменять высвечивание имен столбцов, которые хотите исключить из формы. Закончив исключенье имен столбцов, нажмите [ACCEPT]. Затем снова нажмите [ACCEPT], чтобы вернуться в окно CHOOSE FORM. 7. Выберите элемент GENERATE из окна CHOOSE FORM и нажмите [ACCEPT]. Теперь вы можете запустить эту форму, специфицировав ее имя в окне CHOOSE FORM и выбрав вариант RUN. Содержание блоков. Первый блок начинается вверху стра- ницы 1. Каждый последующий блок располагается над пре¬ дыдущим. Если блок не поместится целиком на текущей странице, он начинается на следующей странице. Каждый блок включает три строки, содержащие некоторый стандартный текст
295 и имя блока, за которым следуег переменное количество строк, содержащих поля. Вы можете назвать блок любым именем по своему желанию, оно может отличаться от имени основной таблицы. Если блок показывает только одну запись, его поля упорядочиваются по английскому алфавиту, причем в каждую строку помещаются два поля, начиная со столбцов 20 и 60. Любое поле длиной более чем в 20 символов располагается со столбца 20 некоторой строки. Заголовок каждого поля появля¬ ется слева от этого поля. Поля размещаются в чередующихся строках, между которыми находятся пустые строки. Если блок показывает две или более записей, то поля каждой записи упорядочиваются слева направо в одной строке с двумя пустыми позициями между полями. Последовательные записи появляются в последовательных строках. Заголовок для каждого поля появляется перед этим полем. Если поля не могут поместиться в одной строке, то пакет SQL*Forms покажет только одну запись в блоке. Заголовком для всякого поля является имя соответствующего столбца в таблице. Поля. Информация из таблиц базы данных представляется в полях формы. Каждое поле — это окно на одном столбце базы данных или же на другой информации, например на расчетах из других полей. Существуют следующие типы полей, которыми вы можете пользоваться в блоке: • Поле базовой таблицы соответствует столбцу в базовой таблице для блока. Через это поле вы можете обновлять, включать и удалять данные в столбце таблицы. • Поле справочной таблицы соответствует столбцу некоторой таблицы, которая не является базовой таблицей для этого блока. Вы можете воспользоваться триггером для чтения данных из той таблицы в поле справочной таблицы. Однако вы не можете запрашивать, обновлять, вставлять или исключать данные в столбце таблицы из блока. Поля справочных таблиц обычно служат для изображения информации, относящейся к форме. • Поле временной информации не соответствует какому-либо отдельному столбцу таблицы. Вы можете воспользоваться триггером для вычисления и изображения информации в поле временных данных, основываясь на табличных значениях, других полях из формы или данных, вводимых оператором с пульта. Поля временных данных обычно служат для вычислений, сообщений или выбора из меню.
296 Ширина поля CHAR такая же, как ширина соответствующего столбца таблицы. Изображение поля имеет ширину 60. Если ширина ваших данных поля CHAR больше чем 60, то нужно переместить поле горизонтально для рассмотрения всего значения. Ширина данных и ширина изображения для поля DATE равняются девяти. Ширина JDATE и EDATE равна восьми. Ширина данных в числовом поле на две позиции больше, чем ширина соответствующего столбца таблицы. Это позволяет отвести место для десятичной точки и знака минус. Если ширина столбца явно не указана, то ширина данных в поле равняется 14 позициям. Ширина данных в поле данных равна 10. Если ширина данных в вашем числовом поле больше чем 10, то это поле следует переместить для показа всею значения. Относительно применения команд CREATE и DEFINE для поля см. соответствующий раздел в этой главе. Создание заказной формы Для создания заказной формы (после того как вы обратились с клавиатуры к программе SQL*Forms, задав свой идентифи¬ катор пользователя и пароль, и нажали [ACCEPT]) выполняются следующие этапы: 1. Появится меню CHOOSE FORM. Направьте курсор на CREATE и нажмите [SELECT]. 2. Появится окно CHOOSE BLOCK. Введите то имя, которое хотите присвоить новому блоку. Теперь вы можете: а) получить от программы SQL*Forms один или несколько сгенерированных блоков DEFAULT (по умолчанию), которые вы можете потом модифицировать (см. предыдущий раздел); б) спроектировать новую заказную форму, построив каждый блок с самого начала. Направьте курсор на CREATE и нажмите [SELECT]. 3. Если вы выбрали CREATE из окна CHOOSE BLOCK, управление будет передано программе экранной живописи. Она покажет вам первую страницу формы. Теперь вы можете воспользоваться функцией экранной живописи, чтобы: а) "рисовать” постоянный текст на экране; б) определять свойства блоков; в) изменять текущий блок; г) создавать поля и определять их свойства; д) изменять текущую изображаемую страницу; е) специфицировать такие свойства блоков и полей, как триггеры и характеристики полей.
297 4. Завершив этот блок формы, нажмите [ACCEPT]. SQL*Forms :уществит возврат в окно CHOOSE BLOCK. Для создания эугого блока заполните то имя, которое хотите присвоить юку, выберите вариант CREATE и возвратитесь к этапу 3. 5. Для сохранения завершенной формы вы должны: а) нажать [ACCEPT] для возврата в окно CHOOSE FORM; б) выбрать FILE, нажать [ACCEPT]; в) по достижении окна FILE выберите SAVE и нажмите [ACCEPT]. 6. Теперь вы должны сгенерировать форму, прежде чем ее ожно будет запускать в работу. Для этого: а) вернитесь в окно CHOOSE FORM; б) выберите GENERATE. (Вы должны генерировать форму всякий раз, когда вносите в нее изменения.) Имя генери¬ руемого файла будет находиться в блоке имени файла; в) нажмите [ACCEPT]. Когда исчезает имя файла, форма уже сгенерирована. 7. Теперь вы можете запустить новую форму командой RUN з меню CHOOSE FORM. SQL*Forms занесет вашу новую форму, создаст файлы INP FRM и возвратит вас в основное меню. 1одификация формы Модификация формы или блока похожа на создание заказной ормы. Выполняются следующие этапы: 1. Специфицируйте имя формы или блока в области имени окне CHOOSE FORM. (Или выберите вариант LIST для фечисления имен форм. Затем наведите курсор на имя елаемой формы и выберите эту форму нажатием [SELECT]). 2. SQL*Forms покажет окно CHOOSE BLOCK. 3. Наведите курсор на MODIFY и нажмите [SELECT]. В □ультате вы попадете в программу экранной живописи, где южете заново спроектировать свою форму или блок. опирование, переименование или ликвидация формы Вы можете копировать, переименовывать или ликвидировать зрму с помощью варианта FILE в окне CHOOSE FORM едующим образом: 1. Заполните имя формы или блока, который хотите опировать или ликвидировать в меню CHOOSE FORM.
298 2. Выберите FILE для изображения окна FILE. 3. Выберите • подходящее действие в окне FILE: а) для кеширования формы выберите SAVE AS. Затем наберите имя для кони?! а чоявльющемся заполненном поле и /••з.жмите [ACCEPT], б) ччсбы нереимсгюн.чп, форму, выберите RENAME. Набе¬ рите новое имя для копии в появляющемся заполненном поле и нажмите [ACCEPT]; в) для ликвидации формы выберите DROP. 4. Чтобы вернуться в окно CHOOSE FORM, нажмите [EX1T/CANCEL].' Указанные выше действия FILE применимы только к форме в том виде, в котором она определена в базе данных. Они никак не влияют на рабочие файлы для этой формы. Поэтому если вы копируете или переименовываете форму, то должны генерировать рабочие файлы для новой формы. В случае переименования вы должны воспользоваться командами опера¬ ционкой системы для удаления рабочих файлов старой формы. При переименовании формы ее имя изменяется только в базе данных. SQL*Forms нс генерирует новые файлы INP и FRM для переименованной формы и не удаляет файлы INP и FRM, ассоциирующиеся с прежним именем формы. Если вы хотите удалить прежние формы, то должны употребить команду DELETE вашей главной операционной системы. Удаление формы Вместо того чтобы пользоваться описанной в предыдущем разделе процедурой, вы можете удалить форму посредством окна EXIT BLOCK, однако вариант DROP более предпочтителен. Процедура EXIT BLOCK удаляет форму только из базы данных. Она не удаляет соответствующие файлы INP и FRM. Чтобы удалить файлы INP и FRM для этой формы, пользуйтесь командой DELETE вашей главной операционной системы. Восстановление после ошибки Всякий раз, когда внизу экрана появляется сообщение об ошибке, первая же нажатая вами клавиша сотрет это сообщение, а затем выполнит обычную функцию данной клавиши.
299 Выход из программы экранной живописи Чтобы выйти из программы экранной живописи, нажмите [ACCEPT] или [EXIT] и вы вернетесь в окно CHOOSE BLOCK. Нажатие [EXIT] не приведет к отбрасыванию программой SQL*Forms тех изменений, которые вы вносили посредством экранной живописи через окна. Для отбрасывания одиночного изменения воспользуйтесь [UNDO]. Для отбрасывания всех изменений, внесенных вами в форму, выйдите из программы экранной живописи, покиньте окно CHOOSE BLOCK и выберите вариант QUIT из окна EXIT FORM. Отмена функции Чтобы отменить самую последнюю функцию экранной живописи, нажмите [UNDO]. Если вы продолжите нажимать [UNDO], то будут последовательно удаляться более ранние операции. Нажатие [UNDO] не воздействует на набор вариантов в окнах или на постоянный текст, который вводился на экран. Однако оно может повлиять на текст функции, например MOVE или DELETE. Перемещение курсора Сразу же после того, как вы ввели программу экранной живописи, функция NEXT FIELD наводит курсор на первое поле с экрана в порядке английского алфавита. Если вы продолжите перемещение курсора, он будет проходить после¬ довательные поля в том же порядке, а в конце возвратится с последнего поля опять на первое. Таким же образом функция PREVIOUS FIELD перемещает курсор на первое предыдущее поле, затем на предшествующее ему и, наконец, с циклическим переходом от первого поля к последнему. Изменение текущего блока Большинство функций экранной живописи воздействуют на текущий блок. Вы выбираете текущий блок в окне CHOOSE BLOCK, когда вводите программу экранной живописи. Вы Можете изменить текущий блок, выйдя из программы экранной Живописи, настроившись на другой блок в окне CHOOSE BLOCK и заново войдя в программу экранной живописи.
300 Создание блока В программе SQL*Forms термины “создать" и "определить" означают разные действия. Создать объект означает сделать его существующим. Например, вы создаете блок через окно CHOOSE BLOCK, выбирая вариант CREATE. Создание блока будет описано в этом разделе. Определить объект означает специфицировать его свойства. Например, вы создаете блок, объявляя его текущим блоком, потом нажимая [SELECT BLOCK], а затем [DEFINE]. Опреде¬ ление блока будет описано в следующем разделе. Чтобы создать новый блок и сделать его текущим, необ¬ ходимо: 1) . выйти из программы экранной живописи; 2) . ввести имя блока в поле "Name" окна CHOOSE BLOCK; 3) . когда экранная живопись покажет страницу, ввести в се поле "Page#” номер страницы. 4) . выбрать вариант CREATE: SQL*Forms создаст новый блок, сделает его текущим и заново войдет в программу экранной живописи. Определение блока Чтобы определить блок, войдите в программу экранной живописи, специфицировав имя блока и номер страницы, потом нажмите [SELECT BLOCK], затем нажмите. [DEFINE]. В результате вы получите окно DEFINE BLOCK. Теперь вы можете определить или изменить: • Порядковый номер блока. Речь идет о порядке, в котором блоки появляются, когда вы нажимаете [NEXT BLOCK] или [PREVIOUS BLOCK], запуская форму в работу. • Имя блока. Однако если вы изменяете имя блока, то при этом не изменяются какие-либо триггеры, ссылающиеся на имя этого блока. Вы должны найти такие триггеры и самостоятельно изменить в них ссылки. • Описание блока. Это краткое предложение о содержимом блока. Оно изображается, когда вы нажимаете [MENU], Если первым символом описания является знак "*", то этот блок не будет представлен в меню. • Имя таблицы или представления, ассоциирующегося с блоком. Если вы оставляете эту графу пустой, то блок станет блоком управления.
301 • Триггеры блока. Выберите вариант TRIGGER, который активизирует окно DEFINE TRIGGER. • Порядок, в котором SQL*Forms будет изображать записи, выбранные по запросу. Выберите ORDERING, чтобы активизировать окно SPECIFY DEFAULT ORDERING. • Изображение и проверка записи. Выберите OPTIONS, чтобы активизировать окно SPECIFY BLOCK OPTIONS. Нажмите [ACCEPT], чтобы сохранить ваши изменения и возвратиться в программу экранной живописи. Другой вариант состоит в ликвидации ваших изменений посредством нажатия [EXIT/CANCEL]. Триггеры на уровне блока Триггер исполняется как последовательность этапов по одной команде на каждом этапе. В пакете SQL*Forms предусмотрено несколько типов триггеров на уровне блока. (Имеются также триггеры на уровне поля. Они описываются далее в разд. "Триггеры на уровне поля”.) Триггеры на уровне блока могут: • устанавливать в некотором поле значения по умолчанию; • выполнять проверку согласованности, проверку правиль¬ ности данных, требующую сравнения значений в различ¬ ных полях; • выполнять вычисления и запоминание результатов в текущей записи, в других блоках или в таблицах. Существуют двенадцать типов независимых триггеров на уровне блоков. Они сведены в табл. 15-1. В любом блоке вы можете определить любые из них, в частности все или ни одного. Два триггера запросов, Предзапрос и Постзапрос, выполня¬ ются, когда вы нажимаете [EXECUTE QUERY] (исполнить запрос). Триггеры шести других типов выполняются, когда вы (или триггер) передаете изменения в базу данных. Существуют еЩе два типа триггеров записей и два триггера перемещений по блоку. Таблица 15-1. Типы триггеров на уровне блока Тип триггера Запрос Предзапрос Описание Выполняется один раз при нажатии EXECUTE QUERY или COUNT QUERY
302 Таблица 15-1. Продолжение Тип триггера Описание HITS до исполнения самого запроса. Команды имеют доступ к значениям полей, вводимым оператором с пульта, но не к значениям полей, выбираемым по запросу Постзапрос Выполняется по одному разу для каждой записи, выбранной по запросу, сразу же после выборки этой записи и ее первого изображения на экране. Команды имеют доступ ко всем значениям полей из выбранной записи (Одновременно используются также триггеры на уровне полей.) ПЕРЕДАЧА Предудаление Выполняется по одному разу для каждой удаленной записи непосредственно перед тем, как соответствующая строка удаляется из таблицы. Команды имеют доступ ко всем значениям полей из строки и из записи Постудаление Выполняется по одному разу для каждой удаленной записи сразу же после удаления соответствующей строки из таблицы. Команды не имеют доступа к значениям полей в строке Предвставление Выполняется по одному разу для каждой вставленной записи непосредственно перед тем, как соответствующая строка встав¬ ляется в таблицу. Команды имеют доступ ко всем 245 значениям полей из записи Поствставление Выполняется по одному разу для каждой вставленной записи сразу же после вставления соответствующей строки в таблицу. Команды имеют доступ ко всем значениям полей из записи
303 Таблица 15-1, Продолжение Тип триггера Описание Предобновление Выполняется по одному разу для каждой обновленной записи непосредственно перед тем, как соответствующая строка обновляется в таблице. Команды имеют доступ ко всем значениям полей из записи (которая еще не обновлена) Постобновление Выполняется по одному разу для каждой обновленной записи сразу же после обновления соответствующей строки в таблице. Команды имеют доступ ко всем значениям полей из обновленной строки и обновленной записи ЗАПИСЬ Предзапись Выполняется перед наведением курсора на запись в блоке, после триггера предблока, но перед триггером предполя для текущего поля Постзапись Выполняется перед отводом курсора от записи, после триггера постполя для текущего поля, но до триггера постблока ПЕРЕМЕЩЕНИЯ ПО БЛОКУ Предблок Выполняется перед наведением курсора на блок Постблок Выполняется перед отводом курсора от блока, после триггеров постполя и постзаписи для текущих поля и записи Работа с триггерами на уровне блока Триггеры предзапроса используются для ограничения до¬ ступа к таблицам для определенных пользователей, определен¬ ных сроков, определенных дней и/или определенных типов Опросов. (Для обеспечения эффективности такие ограничения
304 следует реализовывать также и в триггерах предвставления и предобновления.) Триггеры постзапроса служат для обновления статистических данных, восстанавливаемых по запросу. Примером может служить средняя цена, уплачиваемая за продукцию определен - ного типа. (Такие статистические данные обычно изображаются в блоке управления и должны инициализироваться триггером предзапроса.) Триггеры предвставления, предобновления и предудаления применяются для: • Проверки данных перед включением их в таблицу, в частности: 1) получение гарантии, что полезное значение существует в некоторой другой таблице, например, проверка, что некий помер социальной страховки включен в список получателей добавочного вознаграждения в таблице служа¬ щих; 2) получение гарантии, что значения в двух разных таблицах согласуются между собой, например, проверка, что надбавка к окладу не превышает сам оклад. • Внесения изменений для вставления или обновления строк (которое должно быть незаметным для пользова¬ теля), например: 1) присваивание уникального последо¬ вательного порядкового номера строке, вставленной в таблицу; 2) обновление столбца "последней даты моди¬ фикации" в таблице; изменение формата даты при вставлении в таблицу. Триггеры поствставления, постобновления и постудаления могут служить для обеспечения согласованности внутри таб¬ лицы или между таблицами за счет внесения подходящих изменений. Примером может служить обновление оклада служащего в списке менеджеров, когда оклад обновляется в таблице служащих. Определение триггера на уровне блока Чтобы определить триггер на уровне блока, вы активизируете окно DEFINE BLOCK и выбираете вариант TRIGGERS. После этого программа SQL*Forms покажет окно CHOOSE TRIGGER. Воспользуйтесь этим окном для выбора типа триггера, который вы хотите определить. Выберите тип, либо введя его, либо использовав вариант LIST TYPES. Выберите CHOOSE для изображения окна этапа триггера. (См. разд. "Спецификация окна операторов языка SQL" об операторах SQL в триггерах.)
305 Окно SPECIFY DEFAULT ORDERING Когда вы выбираете вариант ORDERING из окна DEFINE BLOCK, то будет изображено окно SPECIFY DEFAULT ORDERING (специфицировать упорядочение по умолчанию). Пользуйтесь этим окном для определения по умолчанию предложения WHERE и/или предложения ORDER BY, которое вы хотите включить в оператор SELECT, который должен быть построен для каждого запроса в блоке. Предложения WHERE и/йли ORDER BY начинаются со второй строки окна. При вводе предложений следуйте таким правилам: • При наличии обоих предложений WHERE и ORDER BY предложение WHERE должно быть первым. • При наличии предложения WHERE оно должно начинаться со слова WHERE. Предложение ORDER BY (если оно есть) должно начинаться со слов ORDER BY. Если имеется только предложение ORDER BY, то оно должно начинаться без слов ORDER BY. Иначе говоря, следует ввести только предложение (предложения), определяющие порядок. • Если имеется предложение WHERE при наличии или отсутствии предложения ORDER BY, то это предложение (предложения) может быть введено в любое количество строк. Если предложения являются слишком длинными и не умещаются в окне, их изображения можно прокру¬ чивать через окно. Если имеется только предложение ORDER BY, оно должно вводиться в одну строку. Для окна SPECIFY DEFAULT ORDERING существуют следующие варианты: • Указания FORWARD и BACKWARD обеспечат прокрутку изображений предложений WHERE и ORDER BY вверх и вниз. Вы можете пользоваться этими указаниями для показа различных частей предложений, которые слишком велики и поэтому не умещаются в окне. • Команда DELETE удалит предложения WHERE и ORDER BY. Чтобы покинуть окно SPECIFY DEFAULT ORDERING, нажмите [accept] для сохранения тех изменений, которые вы внесли через окно, или нажмите [exit/cancei] для их отмены. Окно SPECIFY BLOCK OPTIONS Когда вы выбираете OPTIONS из окна DEFINE BLOCK, Программа SQL*Forms покажет окно SPECIFY BLOCK OPTIONS
306 (специфицировать блочные варианты). Пользуйтесь этим окном для определения других свойств блока следующим образом: Проверка уникальности ключа. Если имеется возможность, программа SQL*Forms обеспечит уникальное множество зна¬ чений в полях первичных ключей для любой записи, вставля¬ емой в блок. Эта проверка выполняется, когда вы производите согласование, если (а) запись вставляется или (6) запись обнов¬ ляется, причем было изменено значение в поле первичного ключа. Этот вариант предоставляет удобный способ обеспечения уникальности в данных полях каждой записи, вставляемой в соответствующую таблицу. Однако гораздо более эффективно уникальность гарантируется приданием таблице индекса со свойством UNIQUE (уникальный). Кроме того, определение нескольких уникальных индексов позволит вам осуществлять проверку на уникальность в нескольких отдельных полях, тогда как поля первичных ключей позволяют проводить проверку уникальности только по одному первичному ключу. Изображение в меню блока. При этом описание блока показывается по умолчанию в окне DEFINE BLOCK, когда вы нажимаете [menu]. Вы можете спрятать блок посредством отмены выделения. Число изображаемых строк. Здесь определяется количество строк, которые будут’ одновременно показываться в блоке. Число буферизируемых строк. Здесь определяется количе¬ ство строк, которые будут одновременно храниться в основной памяти компьютера. Программа SQL*Forms резервирует доста¬ точное количество места в памяти для буферизации по меньшей мере трехсот строк для формы. Блоки в форме конкурируют из-за этого буферного пространства. Свойство NUMBER OF ROWS BUFFERED (число буферизируемых строк) гарантирует, что конкретный блок получит пространство для буферизации по крайней мере указанного количества записей. В результате может быть зарезервировано место более чем для 300 записей. Число строк развертки на строку матрицы. Здесь опреде¬ ляется, сколько строк развертки изображения будет занято каждой записью в блоке. Если их количество больше, чем число нужных в действительности строк развертки, то между строками матрицы появятся пустые строки развертки. Чтобы покинуть окно SPECIFY BLOCK OPTIONS (специфицировать варианты для блоков), нажмите [accept] для сохранения уже внесенных вами изменений или же нажмите [exit/cancel] для их отмены.
307 Как создать и определить поле Когда вы создаете поле, автоматически активизируется окно DEFINE FIELD (определить поле). Для изменения атрибутов поля, наведите курсор на это поле, а затем нажмите DEFINE. Окно DEFINE FIELD позволяет вам определить или изменить: • Последовательный номер поля, т. е. порядок, в котором оно появится, когда вы нажмете [next field] (следующее поле) или [previous field] (предыдущее поле) при запуске формы в работу. • Имя столбца таблицы, который соответствует этому полю. Имя столбца становится и именем поля. Команды языка SQL в триггерах будут ссылаться на поле по этому имени. Для полей, которые не относятся к базе данных, в том числе для любого поля из блока управления, вы можете употребить любое корректное имя. Однако имейте в виду, что при изменении вами поля триггеры, ссылающиеся на это поле, не изменяются. Вы должны отыскать их и самостоятельно изменить ссылку. • Тип данных для поля. • Триггер поля. Для этого выберите вариант SQL из окна DEFINE FIELD. • Атрибуты поля. Для этого выберите вариант ATTRIBUTES из окна DEFINE FIELD. (Дальнейшие подробности об атрибутах поля см. в разд. "Атрибуты поля".) • Проверку свойств поля. Для этого выберите вариант VALIDATION из окна DEFINE FIELD. Проверка правильности поля Предусмотрены некоторые свойства проверки правильности значений, вводимых в поля, до того как эти значения передаются в базу данных. Ими являются: 1. Тип поля по окну DEFINE FIELD. Тем самым предот¬ вращается ввод неправильных символов или последовательно¬ стей, например букв в поле типа NUMBER (число). 2. Атрибут поля по окну SPECIFY ATTRIBUTES: • разрешенное обновление и обновление в случае NULL: препятствует изменению существующих значений; • фиксированная длина: устраняет непустые значения, не заполняющие поле; • обязательно: устраняет пустые значения.
308 3. Триггеры на уровне поля по окну CHOOSE TRIGGER. Они могут служить для многих других видов про верки правильности. Если проверка правильности поля оказывается неудачной для какого-либо поля, то весь процесс согласования с базой данных останавливается. Уже переданные в базу данных изменения прокручиваются назад. Если такое случилось, то вы должны откорректировать неправильное поле и заново запустить процесс согласования COMMIT. Программа SOL*Forms выпол¬ няет эту проверку правильности и полей в следующих ситуациях, когда • некоторое поле перестает быть текущим полем; • текущая запись изменяется, проверяется правильность полей в прежней текущей записи; • текущий блок заменяется, проверяется правильность полей в текущей записи прежнего текущего блока; • рабочее пространство передается в базу данных, прове¬ ряется правильность полей в каждой записи из всякого блока, не являющегося блоком управления. Некоторые виды проверки правильности данных в поле (например, этапы триггера на уровне поля, содержащие команды языка SQL или завершения работы пользователя) могут изменять значение поля в какой-то форме. Когда такое изменение происходит, триггер поля выполняется не сразу, он выполняется, когда поле в очередной раз проверяется при естественном порядке работы. Тем самым обеспечивается эффективная проверка пра¬ вильности значений полей, однако при этом вы можете попасть в затруднительное положение, когда триггер обнаруживает ошибку в поле, которое вы не изменяли непосредственно. Учтите это, когда определяете этапы триггера. Триггеры на уровне поля Триггер — это последовательность операций, которая выпол¬ няется, когда имеет место определенное событие. Каждое поле в форме может обладать триггером на уровне поля, который исполняется в процессе проверки правильности поля, а также в случае изменений значения поля. Если для проверки правильности данных требуется сравнение значений из двух или более полей, то, как правило, такая проверка выполняется в триггере на уровне блока, потому что нет оснований предполагать, что сравнение полей окажется
309 осмысленным, когда подвергались изменению одно, или два, или более взаимосвязанных полей. Однако триггеры на уровне поля используются для проверки правильности значения поля в ситуациях, которые невозможны при окнах SPECIFY ATTRIBUTES и VALIDATION. Триггер выполняется как последовательность этапов. Каждый этап триггера сводится к выполнению одной из команд следующих типов: • Команда языка SQL. SELECT — это единственная ко¬ манда языка, которая может использоваться на этапах триггера на уровне поля. Напротив, в триггерах на уровне блока допустима любая команда языка SQL. • Команда SQL* Forms.. Это специальная команда, пред¬ назначенная только для использования на этапах триггеров. • Выход пользователя. Это написанная пользователем про¬ цедура на таком языке программирования, как Си или Кобол. Вызов триггеров на уровне поля Триггеры могут исполняться посредством: • Ввода. Когда вы впервые запускаете форму в работу, или курсор вводит новый блок, запись или поле. • Запроса. До или после восстановления записей. • Изменения. После того как вы изменили значение, или же до или после передачи в базу данных для согласования инфор¬ мации о вставленных, обновленных или удаленных записях. • Выхода. Когда вы покидаете форму или когда курсор оставляет блок, запись или поле. • Нажатий клавиш. Когда вы нажимаете функциональную клавишу. • Названных пользователем триггеров. Общие триггеры, или “подтриггеры”, которые вы хотите повторно исполь¬ зовать или вызывать из других триггеров. Окно SPECIFY ATTRIBUTES Когда вы выбираете вариант ATTRIBUTES из окна DEFINE FIELD, то появляется окно SPECIFY ATTRIBUTES. Пользуйтесь этим окном для определения атрибутов поля. Варианты для этого окна перечисляют атрибуты, которые могут быть применены к некоторому полю. Чтобы реализовать один из них, выберите соответствующий вариант, как показано в следующем разделе.
310 Атрибуты поля Некоторые атрибуты поля являются независимыми в том смысле, что наличие или отсутствие одного атрибута не влияет на наличие или отсутствие какого-либо другого. Однако из дальнейших объяснений станет очевидно, что в некоторых случаях допущение одного атрибута может потребовать допу- щения или запрета другого атрибута. Эти взаимозависимости устанавливаются автоматически. Всякое поле в форме обладает некоторым сочетанием следующих атрибутов (иногда называемых характеристиками). Выберите ATTRIBUTES из окна DEFINE FIELD (определить поле), чтобы увидеть следующее: Поле базы данных. Если поле обладает атрибутом Database, оно представляет некоторый столбец в базовой таблице, соответствующей этому блоку из формы. Поэтому значение, изображаемое в поле для заданной записи, выбирается из соответствующего поля строки таблицы (и/или может быть запомнено в таком поле). Если поле не обладает этим атрибутом, то оно не представляет какой-либо столбец таблицы. Однако в зависимости от проекта формы такое поле может быть вычислено по значениям из одного или более столбцов в одном или более таблиц (и/или может служить для вычисления таких значений). Первичный ключ. Если поле обладает этим атрибутом, то оно является частью первичного ключа блока, причем оно должно иметь также атрибут базы данных. Вы можете пользо¬ ваться первичным ключом для обеспечения уникальности записей в форме. Например, чтобы гарантировать, что никакие две записи в форме информации о служащих не содержат одинаковые идентификаторы служащих, вы можете присвоить полю идентификатора служащего атрибут первичного ключа. Уникальность обеспечивается по всем полям, которые являются частью первичного ключа, т. е. уникальность не нарушается, если только в каждом поле первичного ключа в определенной записи не содержится такое же значение, как в соответствующем поле другой записи. Хотя бы одно поле в каждом блоке должно получить атрибут первичного ключа вне зависимости от того, обеспечиваете ли вы уникальность первичного ключа. Если вы этого не обеспечиваете, то атрибут первичного ключа не¬ существен.
311 Изображаемое поле. Если поле обладает этим атрибутом, то его значение показывается в форме. Если же у поля нет этого атрибута, то значение данного поля не показывается. Если поле не снабжено таким атрибутом, оно может исполь¬ зоваться некоторым триггером для выполнения вычислений и все же быть невидимым для пользователя. Однако если в поле появляется ошибка, то информацию об этом поле можно показать, нажав [display error] (показ ошибки). Пользователь не будет осознавать существование поля, если оно обладает атрибутом Displayed. Разрешенный ввод. Если поле обладает этим атрибутом, то пользователь может вводить или изменять значение этого поля. Если у поля нет такого атрибута, то программа SQL*Forms может показать его, но пользователь лишен возможности вводить или изменять его значение. Если поле снабжено этим атрибутом, оно должно обладать и атрибутом Displayed. Разрешенный запрос. Если поле обладает этим атрибутом, то оператор может ввести с пульта в это поле условие запроса. Разрешенное обновление и обновление, если пусто. Эти атрибуты названы вместе, потому что они очень похожи и потому что поле может обладать любым из них, но не обоими вместе. Если поле обладает атрибутом разрешенного обновления, то пользователь мо'жет изменять его значение в записи, выбираемой из внешней памяти по запросу. Если же поле снабжено атрибутом ’’обновления, если пусто”, то пользователю разрешается изменять его значение в записи, выбираемой из внешней памяти по запросу, лишь в том случае, если это значение пусто. Если поле не обладает ни тем, ни другим атрибутом, то пользователь ни при каких условиях не может изменять его значение в записи, выбираемой из внешней памяти по запросу. Если пользователь обладает любым из этих атрибутов, оно должно иметь также атрибут Displayed. Фиксированная длина. Если поле обладает этим атрибутом, его значение должно иметь точно такую же дайну, как само поле. Если же у поля нет этого атрибута, то его значение может быть меньше, чем поле. Если поле снабжено этим атрибутом, то оно должно иметь также атрибуты Input Allowed и Displayed. Обязательно. Если поле обладает этим атрибутом, то его значение не может быть пустым. Если же у поля нет этого атрибута, его значение может оказаться пустым. Заметим, что атрибуты обязательности и фиксированной длины взаимно
312 независимы: если поле имеет атрибут Fixed Length, но не атрибут Mandatory, то это значение может отсутствовать, но, если присутствует, должно иметь точно такую же длину, как само поле. Если поле снабжено этим атрибутом, оно должно иметь также атрибуты Input Allowed и Displayed. Прописное. Если поле обладает этим атрибутом, строчные буквы преобразуются в прописные по мере того, как они вводятся. Если же поле не снабжено этим атрибутом, то разрешаются строчные буквы. Этот атрибут воздействует на информацию только тогда, когда она вводится в поле через форму. Строчная информация может по-прежнему вводиться в соответствующий столбец таблицы через другую форму или через программу, отличную от программы SQL*Forms. Если поле снабжено этим атрибутом, оно должно иметь также атрибуты Input Allowed и Displayed. Этот атрибут имеет смысл, только если поле относится к типу CHAR или ALPHA и снабжено атрибутами Input Allowed и Displayed. Автоматический прогон. Если поле обладает этим атрибу¬ том, то программа SQL*Forrns автоматически осуществляет прогон следующего поля, когда некоторый символ вводится в последнюю позицию этого поля. Если отсутствует атрибут фиксированной длины, то вы можете реализовать прогон до следующего поля прежде достижения последней позиции, если нажмете Next Field. Если у поля нет этого атрибута, то программа SQL*Forms никогда не выполнит прогон до следующего поля, пока вы не нажмете Next Field. Если поле обладает этим атрибутом, оно должно иметь также атрибуты Input Allowed и Displayed. Автоматическая помощь. Если поле обладает атрибутом автоматической помощи, то соответствующее сообщение о помощи будет изображаться всякий раз, когда курсор наведен на это поле (за исключением случая, когда изображается сообщение об ошибке). Чтобы извлечь пользу из наличия этого атрибута, вы должны определить сообщение о помощи в описываемом ниже окне SPECIFY VALIDATION (специфици¬ ровать проверку правильности Данных). Поле с автоматической помощью должно также обладать атрибутами изображаемое™ и разрешенного ввода. Отсутствие эха. Если поле обладает атрибутом отсутствия эха, то его значение всегда будет изображаться как пустые позиции, даже если само поле является видимым. Вы можете
313 выбрать этот атрибут для того, чтобы скрывать пароли и другую информацию. Если в поле с отсутствием эха появляется серьезная ошибка, то его значение может быть изображено, когда оператор нажимает [display error]. Для настоящей защиты значения поместите поле в страницу 0 формы, а также определите его с атрибутом отсутствия эха. Поле с отсутствием эха должно также обладать атрибутом Displayed. Окно SPECIFY SQL STATEMENT Окно SPECIFY SQL STATEMENT (в прежних версиях SQL*Forms называвшееся "pop_up", т. е. ’’всплывающим”) более не существует в версии 2.0. Теперь операторы языка SQL определяются в триггере. См. разд. "Как работает триггер" в этой главе. Окно SPECIFY VALIDATION Когда вы выбираете вариант VALIDATION из окна DEFINE FIELD, появляется окно SPECIFY VALIDATION. Пользуйтесь им для определения или изменения тех свойств поля, которые повлияют на способ ввода данных и проверки их правильности в поле. В этом окне присутствуют следующие поля: • Длина поля. Число символов, которые могут быть введены для поля. Это поле окна относится по умолчанию к изображаемой длине поля. При установке на большее значение программа SQL*Forms прокрутит поле горизон¬ тально, чтобы показать все его значение. (Горизонтальная прокрутка не поддерживается на дисплей¬ ных устройствах IBM 3270, на персональных компьютерах, которые эмулируют 3270, или же на асинхронных дисплейных Устройствах, которые подключаются к синхронным линиям связи через преобразователи протоколов.) • Длина запроса. Число символов, которые могут быть введены на поле в течение запроса. Это поле окна по умолчанию равно изображенной длине поля. Если уста¬ навливается большее значение, то SQL*Forms прокручи¬ вает поле горизонтально, чтобы показать все значение. • Копирование значения поля. В этих элементах заполнения наберите на клавиатуре указание блока и поля, из которых хотите копировать данное значение.
314 • По умолчанию. Фиксированное значение для использо¬ вания в качестве значения поля по умолчанию при создании записи. • Диапазон. Минимальное и максимальное корректное значение для поля. • Список значений. Элементы заполнения. Наберите таблицу или столбец, содержащий список корректных значений для поля. Нажмите [LIST FIELD VALUES] (список значений поля), чтобы показывать значения по одному в порядке возрастания. Если специфицированы таблица и столбец LIST, то игнорируется поле-RANGE (если оно имеется). • Помощь. Пояснительное сообщение для поля, показы¬ ваемое, когда вы нажимаете [HELP]. Триггеры клавиш Вы можете пользоваться триггерами клавиш для того, чтобы переопределять, что случится при нажатии некоторой функци¬ ональной клавиши. Они могут быть определены на любом уровне посредством выбора варианта TRIGGER из окна DEFINE FROM, DEFINE BLOCK или DEFINE FIELD. Затем вы можете заполнить окно CHOOSE TRIGGER. Как только оно определено, станет действовать новое определение клавиши вне. зависимости от того, находится ли курсор в форме, блоке или поле, соответствующем триггеру (если он не подавлен каким-то триггером того же типа на более низком уровне). Некоторые функциональные клавиши не поддаются переоп ¬ ределению. Ваша система Oracle уже оснащена примерно 30 функциональными клавишами, не все из которых могут быть переопределены. Поскольку эта ситуация время от времени изменяется и различна для разных систем, то проверьте инструкцию по установке и руководство пользователя для вашей системы, чтобы выяснить, что вы можете переопределить. Названные пользователем триггеры Названные пользователем триггеры не выступают в роли триггеров вследствие некоторого события, но выполняются внутри другого триггера. Их назначение состоит в создании модулей кода, которые в противном случае должны были повторяться в нескольких разных триггерах.
315 Не предусмотрено каких-либо множественных типов назван¬ ных пользователем триггеров. Вы присваиваете каждому из них свое имя (следуя правилам именования), а затем используете это имя для ссылок на данный триггер. Вы можете использовать функцию EXETRG из списка кодов функции в разд. ’’Команда #EXEMACRO” для вызова названного пользователем триггера из другого триггера. Хотя вы и можете определить названный пользователем триггер на любом уровне, а затем вызвать его из другого триггера на том же или более низком уровне, наиболее удобно определить его на уровне формы, так чтобы им можно было пользоваться на любом уровне. Триггер нижнего уровня будет подавлять триггеры более высокого уровня с тем же именем. Как работают триггеры Триггер состоит из "этапов” для каждой исполняемой команды. На этапе триггера могут выполняться команды трех типов: 1. Команды языка SQL. Они могут запрашивать или модифицировать любую таблицу, которую вы авторизировали для запросов или модификации. Команды языка SQL могут также использовать и изменять содержимое полей во всех блоках текущей формы. 2. Команды языка SQL*Forms. Они выполняют такие опе¬ рации, как активизирование ряда функций языка SQL*Forms. Обычно вы активизируете эти функции нажатием функцио¬ нальной клавиши. 3. Команды выходов пользователя. Ими активизируются выходы пользователя, написанные на таком языке программи¬ рования, как Си или Кобол. Выходы пользователя могут выполнять любые виды вычислений на полях формы, они имеют доступ к полям в таблицах базы данных, и в них могут использоваться определенные сервисные средства, обеспечива¬ емые системой Oracle и SQL*Forms. Этапы из триггера выполняются по одному. Если некоторый этап модифицирует содержимое поля, эта модификация явля¬ ется видимой для последующих этапов. Обычно этапы триггера выполняются последовательно, но выбор зависит от результатов очередного этапа.
316 Результаты этапа При выполнении триггера возможны три результата. Оц может: • оказаться успешным; • оказаться неудачным; ® вызвать фатальный исход. (Синтаксическая ошибка в команде на языке SQL или команда SQL, ссылающаяся на несуществующую таблицу, приведет к фатальному исходу. Однако синтаксические ошибки в командах языка SQL*Forms или командах выхода пользователя могут и не приводить к фатальным исходам.) Программа SQL*Forms не проверяет синтаксис команды, вводимой в процессе определения этапа триггера. Если эта команда содержит синтаксическую ошибку (например, ключевое слово с орфографической ошибкой или неправильный код функции), то результат этапа зависит от типа команды следующим образом: • Команда SELECT, INSERT UPDATE или DELETE ока¬ зывается успешной, если она восстанавливает, включает, обновляет или удаляет хотя бы одну строку, в противном случае дает отказ. (Однако см. разд. ’’Режим запроса’’ в этой главе относительно ситуации, когда команда SELECT дает другой результат.) Другие команды языка SQL не могут привести к отказу. Если команда SQL содержит синтаксическую ошибку, она вызывает фатальный исход. • Команда языка SQL*Forms чревата фатальным исходом, если приводит к выходу программы SQL*Forms за пределы отведенной памяти. Она даст только отказ, если не может быть выполнена по какой-либо другой причине, в частности из-за некорректного синтаксиса. • Команда выхода пользователя может оказаться успешной, привести к отказу или к фатальному исходу в зависимости от ее внутренней логики. Если программа SQL*Forms пытается выполнить несуществующий выход пользовате¬ ля, то результатом будет фатальный исход. Если команда выхода пользователя содержит синтаксическую ошибку, то она приведет к отказу. Следствия этапа Обычно если эт л оказывается успешным, то после него выполняется следующий этап последовательности. Если же
317 едующего этапа нет, то триггер сработал успешно. Обычным едствием отказа или фатального исхода этапа является отказ иггера. Он будет выполнять какой-либо дальнейший этап. Следствия успеха и отказа (но не фатального исхода) двержены воздействию установок атрибутов триггера, соот- гствующих каждому этапу. Эти атрибуты обсуждаются ниже. зультаты триггера При выполнении триггера возможны два результата: успех отказ. Следствия каждого из них зависят от типа триггера едующим образом: • В триггерах пред- и поствключения, обновления или удаления успех позволяет программе SQL*Forms продол¬ жать передачу изменений в рабочем пространстве для согласования в базу данных. Отказ останавливает согла¬ сование, причем уже приспособленные к базе данных изменения прокручиваются назад. • В триггере предзапроса успех позволяет продолжать исполнение запроса. Отказ аварийно завершает запрос. • В триггере постзапроса успех позволяет сохранить вы¬ бранную из внешней памяти запись в рабочем простран¬ стве. Отказ приводит к замене этой записи на запись, в которой все поля пустые. • В триггере поля, выполняемом в процессе исполнения запроса (в режиме запроса), и успех, и отказ позволяют продолжать исполнение запроса. • Если триггер поля выполнен во время проверки правиль¬ ности поля, значение которого было изменено, то успех позволяет продолжать затребованную операцию (передачу с согласованием, изменение текущего поля, записи или блока и т. д.). Отказ означает некорректность поля. В таком случае затребованная операция отменяется, вы должны исправить значения поля и попробовать снова. ■рибуты этапа триггера Когда вы выбираете ATTRIBUTES из окна TRIGGER STEP, появляется информация TRIGGER STEP ATTRIBUTES грибуты этапа триггера). Эти атрибуты определяют, что учится при успехе или отказе этапа и сколько памяти водится для этого этапа. Программа SQL*Forms присваивает эибутам значения по умолчанию. Вам нужно определить
318 атрибуты только в том случае, если вы хотите изменить присваивания по умолчанию. В этом разделе представлено назначение каждого атрибута. В следующем разделе полностью описывается воздействие всех этих атрибутов. Аварийное завершение триггера при отказе этапа. Если выбран этот переключатель (и не специфицирована одна из описываемых ниже меток отказа), то отказ этого этапа останавливает исполнение триггера. Успех или отказ триггера зависит от переключателя "успешный возврат при аварийном завершении триггера" (описываемого ниже). Этот переключатель выбирается по умолчанию, поскольку отказ этапа триггера обычно означает, что что-то происходит неверно и вы хотите остановить обработку. Заметим, что переключатель "код возврата с обращением" (тоже описываемый ниже) повлияет на то, как определяется отказ этапа. Код возврата с обращением. Если выбирается этот пере¬ ключатель, то обычные критерии успеха и отказа меняются местами (обращаются). Он особенно часто используется для (1) получения гарантии, что соответствующая запись не существует (т. е. оператор SELECT дает отказ) до выполнения действия и (2) показа сообщения об ошибке, когда оператор нажимает запрещенную вами клавишу, даже если сам триггер срабатывает успешно. Успешный возврат при аварийном завершении триггера. Этот переключатель имеет смысл только в том случае, если выбрано "аварийное завершение триггера при отказе этапа". Если выбраны оба переключателя, то сам триггер сработает успешно, даже если откажет этап и будет остановлено испол¬ нение. Этот переключатель особенно часто используется в триггерах, которые не нужно исполнять при соблюдении определенных условий. Отдельная область памяти курсора. Обычно каждому этапу триггера присваивается его собственный курсор (место в памяти) для проведения обработки. Однако если память недостаточна, вы можете сохранить его (замедлив обработку) посредством отмены выбора переключателя "оптимизировать обработку SQL" по окну SPECIFY OPTIMISATION. Если вы поступаете так, то можете выбрать этот переключатель, чтобы сберечь место в памяти для тех этапов триггеров SQL, который исполняются наиболее часто (и ускорить их обработку). Этот
319 переключатель применяется только к командам языка SQL в этапах триггера. Он не воздействует на команды языка SQL* Forms или на выходы пользователя, вызываемые из триггеров. Метка уснеха/метка отказа. Они являются заполнителями ц специфицируют следующий этап для исполнения в случае успеха или отказа текущего этапа. Как программа SQL*Forms обрабатывает этапы триггера Данная программа обрабатывает этапы триггера следующим образом: 1. Если триггер исполняется в режиме запроса, причем этап содержит команду SELECT без предложения INTO или же с предложениями INTO, которые ссылаются только на поля базы данных в текущем блоке, то этап не исполняется. Программа SQL*Forms переходит к этапу 8 (как будто команда исполнялась и завершилась успехом). 2. Исполняется команда на этапе. 3. Если команда на этапе — это LOCK TABLE и этап оказался успешным, то SQL*Forms переходит к этапу 8. Если ка таблице установлен несовместимый замок, то команда LOCK TABLE налагает блокировку WAIT LOCK по таблице, если вы не специфицировали NOWAIT, а если специфицировали, то успешно срабатывает без блокировки. Команда LOCK TABLE не может кончиться отказом, но приведет к фатальному исходу, если содержит синтаксическую ошибку или если таблица не существует. 4. Если этап успешен, то значения, возвращаемые командами SELECT...INTO или поступающие от операторов EXEC LAF PUT в выходах пользователей, перемещаются па отведенные Для них поля. В случае отказа этапа никакие значения полей не изменяются. ж 5. Если этап приводит к фатальному исходу, то изображается сообщение, описывающее ошибку. Это сообщение программы SQL*Forms или системы Oracle, но не сообщение, специфици¬ рованное по окну TRIGGER STEP. Вы можете получить больше Информации, нажав клавишу [display error]. Отменяются любые Функции языка SQL*Forms, ожидающие выполнения в резуль¬ тате команды с клавиатуры или прежних макрокоманд из этого Диггера или из какого-то другого. Более не исполняются Никакие этапы триггера. Триггер дает отказ.
320 6. Программа SQL*Forms в соответствии с установкой (код возврата с сообщением) принимает решение, завершается ли этот этап успехом или отказом. В случае отказа осуществляется переход к этапу 7 для продолжения. В случае успеха программа SQL*Forms переходит к этапу 8. 7. Выполняется обработка отказа. Изображается сообщение об отказе. Если имеется метка отказа, то SQL*Forms переходит к этому этапу. Переключатели "Abort query when trigger fails" и "Return success when aborting trigger" не имеют смысла. Если нет этапа с такой меткой, то никаких дальнейших этапов триггера не исполняется и триггер заканчивается успехом. Если нет метки отказа, то: • Если отменен выбор "Abort trigger when step fails", то программа SQL*Forms переходит к этапу 8 (как будто данный этап успешный). Если выбран вариант "Abort trigger when step fails", но не "Return success when aborting trigger", то никакие дальней¬ шие этапы триггера не исполняются. Триггер дает отказ. • Если одновременно разрешены "Abort trigger when step fails" и "Return success when aborting trigger", то никаких дальнейших этапов триггера не исполняется. Триггер оказывается успешным. 8. Выполняется обработка успеха. Если имеется метка успеха, то программа SQL*Forms переходит к тому этапу. Если же нет этапа с такой меткой, то никаких дальнейших этапов не исполняется. Триггер заканчивается успехом. Если нет метки успеха, то программа SQL*Forms переходит к следующему этапу, если он существует. Если же следующего этапа нет, то триггер оказывается успешным. Замечание. Переключатель "Reverse return code" вычисляется на этапе 6. Это значит, что этапы 1 — 5 не затрагиваются этим переключателем. Режим запроса Триггеры постизменения на уровне поля в текущем блоке исполняются до триггера постзапроса (если такой имеется), когда запись выбирается из внешней памяти в процессе выполнения запроса. В такой ситуации триггеры исполняются в режиме очереди. Триггеры постзапроса исполняются в этом контексте, чтобы прикладная программа получила возможность
321 инициализировать такие функции, как поля, не относящиеся к базе данных. Обработка триггера в режиме запроса отличается от обычной обработки триггеров на уровне поля следующим образом: • Триггеры постизменения исполняются только в полях базы данных. • Поле в текущем блоке, обладающем атрибутом базы данных, не может быть изменено на некотором этапе триггера. Любая попытка изменить таким образом поле будет проигнорирована (и не вызовет фатального исхода). • Если в команде SELECT нет предложения INTO или если такая команда пытается выбирать значения только в поля базы данных в текущем блоке, она вовсе не исполняется. Обработка триггера продолжается, как если бы команда закончилась успехом. • Команды выхода пользователя обрабатываются в режиме запроса таким же образом, как и в других контекстах с той разницей, что они не могут изменять значения полей, как указывалось выше. Однако программа SQL*Forms передаст флажок "Режим запроса" выходу пользователя. Выход пользователя может выполнять различные функ¬ ции в зависимости от того, установлен ли флажок. • Этап триггера, содержащий команду, которая отличается от команды SELECT, приведет к фатальному исходу. • Этап триггера, содержащий команду на языке SQL*Forms, игнорируется. Обработка триггера происходит так, как будто эта команда закончилась успехом. (Будет исполнена команда COPY копирования в поле, не относящееся к базе данных.) Метки успеха и отказа Обычно этапы триггера исполняются в их естественном порядке. Вы можете изменить этот порядок, воспользовавшись метками этапов (определяемыми по окну TRIGGER STEP). Любому этапу в триггере вы можете поставить в соответствие метку. После этого вы можете получить ответвление от другого этапа на помеченный этап, если введете эту метку в поле SUCCESS или FAIL другого этапа. Например, у вас может возникнуть желание, чтобы триггер исполнил этап 1, а затем Исполнил этапы 2 и 4, если этап 1 успешный, или же этапы
322 3 и 4, если этап 1 дает отказ. Вы заполнили бы поля LABEL (метка), SUCCESS (успех) и FAIL (отказ) для четырех этапов следующим образом: Этап LABEL SUCCESS FAIL 1 ЭТАП В 2 ЭТАП А 3 ЭТАП В 4 ЭТАП А Метки ЭТАП А и ЭТАП В произвольные. Вы может пользоваться любым корректным именем, согласно языку SQL*Forms, но каждая определенная метка должна быт;, уникальной в пределах триггера. В приведенном выше примере для этапа 1 не нужна метка успеха, потому что вы просто хотите в случае успеха перейти к следующему этапу. Переключатель '’Reverse return code” будет влиять на выбор метки для продолжения работы и на то, будет ли изображаться; сообщение об отказе. Однако если вы вводите метки успеха и отказа, то игнорируются оба переключателя "Abort trigger when step fails” и "Return success when aborting trigger". Команды языка SQL в триггерах Вы можете пользоваться командами SQL в триггерах для: • помещения данных в поля формы; • выполнения вычислений над данными в форме; » переформатирования данных в форме; • проверки, существуют ли данные в форме; • сравнения данных в полях формы. Введите команду языка SQL непосредственно по окну TRIGGER STEP. Всякий оператор языка SQL (команда вместе с любыми вспомогательными предложениями) образует один этап триггера. В командах SQL в триггере используется почти такой же синтаксис, как и в командах языка SQL в других программных продуктах системы Oracle (однако см. исключения ниже). Одно существенное различие состоит в том, что команды SQL в триггерах не заканчиваются точкой с запятой (;), Отметим также следующие ограничения и предостережения, относящиеся к употреблению в триггере команд языка SQL: • вы можете использовать команды SELECT только в триггере постизменения;
323 • вы можете пользоваться командами манипулирования данными (INSERT, UPDATE и DELETE) только в триггерах передачи с согласованием (пред- и поствстав¬ ление, обновление и удаление); • если вы используете команды INSERT, UPDATE или DELETE для модификации базовой таблицы для блока в текущей форме, то вы должны обновить любые данные, относящиеся к этой форме. В триггерах могут использоваться лишь команды языка SQL, а не команды SQL*Plus. (Команды языка SQL гораздо легче отлаживаются, если вы тестируете каждую из них, пропуская ее через SQL*Plus до того, как поместите ее в триггер.) Как команды языка SQL действуют в триггерах Команды языка SQL в триггерах применяются к таблицам базы данных, как и в других программных продуктах корпо¬ рации Oracle. Например: SELECT * FROM ORDERS WHERE ORDERID = 210 (Заметим, что в конце нет точки с запятой) Однако при исполнении этой команды результаты запроса не будут изображаться на экране. Единственным следствием запроса является успех, если возвращается хотя бы одна строка из таблицы или отказ в противном случае, а также при фатальном исходе. Вы можете воспользоваться командой этого типа, например, для выяснения, существуют ли данные в некоторой таблице. Изображение результатов запроса Если вы хотите изобразить результаты запроса на экране, то должны воспользоваться принятыми в SQL*Forms двумя расширениями возможностей языка SQL для ссылок па поля формы, как показано ниже: 1. Для ссылок на поле в форме пользуйтесь синтаксисом :[блок] поле. Двоеточие (:) идентифицирует ссылку как поле формы, а не столбец таблицы. Применяйте этот синтаксис в любом месте, где может быть использован столбец таблицы или значение константы. Опускайте ссылку на блок, только если специфицируемое вами имя поля существует только в
324 одном блоке формы. Для совместимости с прежними формами вы можете употреблять знак & вместо двоеточия, но двоеточие предпочтительнее. 2. В операторе SELECT вы можете включить предложение INTO вместо искомых значений в полях формы. Вы должны поместить его непосредственно после команды SELECT и до предложения FROM. Пользуйтесь предложением INTO только для выбора данных в поля формы. Вам не нужно помещать двоеточие (:) перед полем формы в предложении INTO, но вы можете и поместить его для придания тексту наглядности. Расширенный синтаксис предложения SELECT такой: SELECT {[ <таблица>]. [ < список столбцов > ]/ : [ < блок >. ] < поле]/*} [INTO FROM [WHERE [HAVING [<,блок>.]<поле>] <список таблиц> < предложение > ] < предложение >] [GROUP BY < предложение>] Выбор данных в поле Вы можете выбирать данные в любое поле в блоке. Это поле может соответствовать столбцу базовой таблицы для блока (поле базы данных) или же нет. Это может быть видимое поле (изображаемое поле) или нет. Если оно изображаемое, оно может быть или не быть модифицируемым (разрешенный ввод и/или разрешенное обновление). Если вы выбираете имя поля, используемое более чем в одном блоке, то должны квалифицировать это имя именем блока. В противном случае результатом будет появление ошибки. Оператор SELECT с предложением INTO выбирает только одну строку. Если команда SELECT в противном случае выбирает более чем одну строку, то оператор SELECT с INTO выберет только первую строку. Для выбора нескольких строк для блока многих записей пользуйтесь функцией EXEQRY языка SQL*Forms, чтобы установить запрос для этого блока. Столбцу таблицы могут соответствовать много значений — по одному для каждой строки, выбранной из таблицы, но поле SQL*Forms принимает только одно значение, в контекстной записи своего блока. Поэтому невозможно выбрать записи из блока так, как если бы это были строки в таблице.
325 Текущий и контекстный блоки, запись и поле Текущий блок, запись и поле определяются как элементы, на которые наведен курсор. Это те объекты, на которые могут воздействовать операции пользователя. Текущей записью дру¬ гого блока является запись, на которую был наведен курсор, когда этот блок рассматривался как текущий. Для блока, который никогда не был текущим, текущей записью является первая запись. В триггерах используются сходные понятия: контекстный блок и контекстная запись. Контекстный блок триггера — это блок, который соответствует триггеру. Контекстная запись — это запись в блоке, к которой обращаются посредством ссылок полей. Для любого триггера, исполняемого в процессе реализации запроса, контекстный блок — это тот блок, в котором осуществляется запрос. Контекстная запись контекстного блока для триггера предзапроса — это "запись”, содержащая критерии поиска. Контекстная запись контекстного блока для триггера постзапроса или триггера на уровне поля, который исполняется в режиме запроса, — это запись, выбираемая из внешней памяти в рабочее пространство. Во время выполнения команды COMMIT контекстная запись — это запись, передаваемая с согласованием в базу данных. Таким образом, все блоки по очереди становятся контекстными блоками. Каждая добавляемая, обновляемая или удаляемая запись в очередном блоке становится контекстной записью. Этим правилом определяется контекстная запись для триггеров пред- и поствставления, обновления и удаления, а также для триггеров на уровне поля, исполняемых в процессе передачи с согласованием (COMMIT). Контекстная запись в блоке, отличном от контекстного блока, — это та самая запись, которая является текущей записью того блока. Блокировка таблиц и записей Читатель должен осознать, как программа SQL* Forms обрабатывает блокировку таблиц и записей при модификации таблиц на том или ином этапе триггера. В противном случае вы могли бы конструировать формы, приводящие к тупиковым ситуациям, при которых два пользователя пытаются одновре¬ менно работать с одной и той же таблицей.
326 Подробно блокировка в SQL*Forms рассматривается в гл. 13 вместе со всеми другими видами блокировки в системе Oracle. Как правило, триггер, модифицирующий базовую таблицу формы, должен включать в качестве первого этапа команду LOCK TABLE IN SHARE UPDATE MODE языка SQL. Использование столбца ROWID Всякая таблица в базе данных содержит столбец, называемый ROWID. В течение транзакции каждой строке в таблице соответствует единственное и уникальное значение ROWID. Каждый блок в форме содержит невидимое необновляемое поле с именем ROWID. Когда некоторая запись выбирается из внешней памяти в рабочее пространство, вместе с ней выби¬ рается значение ROWID. Это позволяет некоторым видам триггеров идентифицировать строку таблицы, соответствующую всякой записи в табличном пространстве. (Вновь вставленные записи не соответствуют какой-либо строке, и поэтому им соответствует пустой ROWID.) Вы можете использовать ROWID для триггеров предобнов- ления, предудаления, поствставления, постобновления и пост¬ запроса, но не для триггеров предвставления и прсдзапроса, потому что записи в блоке не обладают осмысленными значениями ROWID для этих триггеров. Не используйте ROWID и в триггерах постудаления, потому что данная строка уже не существует в таблице. Чтобы изобразить ROWID для целей отладки, воспользуйтесь триггером постзапроса, чтобы выбрать ROWID в изображаемое поле. Если вы хотите изображать все значение, то должны обладать полем ROWID по крайней мере из 26 символов. Ни при каких операциях оператор за пультом или триггер не должен изменять ROWID. SQL*Forms требует корректного значения ROWID, когда работа передается с согласованием в базу данных. Поэтому обновление ROWID в форме могло бы помешать процессу обновления. Команды языка SQL*Forms в триггерах Вы можете пользоваться командами SQL*Forms только в этапах триггера. Можно употреблять их в этапах триггера для: • переопределения функциональных клавиш;
327 • выполнения ряда действий над формой, как если бы оператор нажимал функциональные клавиши; • исполнения названных пользователем триггеров; • вызова других форм; • манипулирования переменными; ® выполнения команд операционной системы. Вы можете ввести команду языка SQL*Forms непосредст¬ венно по окну TRIGGER STEP. Всякий оператор SQL*Forms (команда плюс аргументы или коды функций) заключает в себе один этап некоторого триггера. Вы должны начать свою команду SQL*Forms со знака номера #. Существуют четыре команды языка SQL*Forms, которые могут использоваться в этапах триггера: #EXEMACRO Исполняет последовательность действий #COPY #ERASE #HOST над формой Копирует константы значений полей или же глобальные и системные переменные из источника в место назначения Стирает глобальные переменные. Выполняет команды операционной системы. Когда вы пишете команды языка SQL*Forms в триггеры, то можете пользоваться в любых комбинациях любым количеством позиций, символов табуляции и новых строк для разделения индивидуальных элементов (которые называются лексемами). Однако вы должны использовать пробел для разделения двух лексем, когда в противном случае они не были бы распознаны по отдельности. Вы не можете пользоваться пробелом для разделения компонентов переменной (GLOBAL.nep-Имя) или ссылки на поле ([блок].поле). Константа или строка команды представляет строку сим¬ волов любой длины, заключенную в одинарные кавычки. Если вам нужно включать в качестве части строки слово, которое обычно содержит знак одинарной кавычки, введите в этом месте два знака кавычки, например так: ’Don”t forget to put in two quotation marks.’ He предваряйте ссылку [блок].поле в команде языка SQL*Forms двоеточием (:). (Поскольку команды языка SQL*Forms не могут ссылаться на таблицы и столбцы базы данных, ссылка будет
328 очевидной.) Вы можете опустить ссылку на блок лишь в том случае, когда специфицируете имя поля, которое существует только в одном блоке формы. Команда #EXEMACRO Макрос представляет собой последовательность действий, которые должна выполнить программа SQL*Forms. Сюда могут включаться функции операций (как если бы операция была вызвана нажатием функциональной клавиши) или специальные функции SQL*Forms, которые могут выполняться только в триггерах. Вы можете использовать макросы, чтобы: • Сокращать количество повторяемого или сложного набора с клавиатуры. • Управлять прохождением прикладной программы (на¬ пример связыванием записей в два или более блоков в форме). • Обеспечивать выполнение определенных действий всегда в правильной последовательности. • Обеспечивать помощь (например посредством вызова другой формы, по которой оператор может запрашивать с пульта нужную информацию). Макросы могут исполняться условно, причем вы можете вкладывать условия в другие условия. Вы можете определить макрос в команде #EXEMACRO. Следуя этой команде, вы должны ввести код функции каждого действия, а затем ее аргумент (если он имеется) и, наконец, точку с запятой (;). Вы можете добавлять столько кодов функций, сколько пожелаете. Когда исполняется этап триггера, содержащий # EXEMACRO, будут исполнены все введенные вами коды функций. Существуют некоторые ограничения, налагаемые на коды функций, которыми вы можете пользоваться в пред- и посттриггерах, такие ограничения подробно разбираются далее в этом разделе. Поэтому макросы преимущественно использу¬ ются в триггерах клавиш. Кроме того, триггеры клавиш изменяют воздействие физической функциональной клавиши, яо не самой функции, обычно ассоциирующейся с этой клавишей. Например, триггер KEY NXTFIELD предопределяет, что происходит, когда оператор нажимает [next field] (следующее поле), но триггер, включающей функцию NXTFLD, будет по-прежнему перемещать курсор на следующее поле.
329 Программа SQL*Forms распознает коды функций, представ¬ ленные в табл. 15-2. Таблица 15-2. Функции кодов макросов языка SQL*Forms Код Функция ABTQRY CALL Аварийно прекращает выполнение запроса Прерывает обработку текущей формы и изображает специфицированную форму. При завершении по коду EXIT или по клавише [Exit/Cancel] возобновляет исходную форму в точке прерывания CALLINPUT Прерывает обработку текущего макроса для принятия и выполнения входных данных от оператора с пульта. При завершении по коду EXIT или по клавише [Exit/Cancel] возобновляет макрос в точке прерывания CALLQRY Прерывает обработку текущей формы и изображает специфицированную форму, по которой могут выполняться только запросы. При завершении по коду EXIT или по клавише [Exit/Cancel] возобновляет исходную форму в точке прерывания CHRMODE CLRBLK CLRFLD CLRFRM CLRREC COMMIT delback delchr delrec derror DKEYS dupfld Вставление/замена Очистка блока Очистка поля Очистка формы Очистка записи Передача с согласованием Удаление в обратном порядке Удаление символа Удаление записи Изображение ошибки Изображение функциональных клавиш Дублирование поля
330 Таблица 15-2. Продолжение Код Функция DUPREC ENTQRY EXEQRY EXETRG Дублирование записи Ввод запроса Исполнение запроса Исполнение названного пользователем триггера EXIT GOBLK Выход в главное меню Перемещение курсора на блок, указанный в текущей форме GOFLD Перемещение курсора на поле, указанное в текущей форме HELP LISTVAL MENU MOVLEFT MOVRIGHT NEWFRM Помощь Перечисление значений полей Меню Влево (♦-) Вправо (-*) Замена текущей формы в памяти на указанную форму NOOP Отсутствие действия, изображается только в сообщение об отказе (в случае отказа этапа). Используется только в триггере KEY NULL Отсутствие действия, не изображается сообщение об ошибке. Служит для спецификации отсутствия действия в ситуациях, когда требуется хотя бы один код функции NXTBLK NXTFLD NXTKEY NXTREC NXTSET Следующий блок Следующее поле Следующее поле первичного ключа Следующая запись Следующее множество записей
331 Таблица 15-2. Продолжение Код Функция PAUSE Прерывание обработки текущего макроса и изображение сообщения Tress any function key to continue” в строке состояния. (Для продолжения нажмите любую функциональную клавишу, восстанавливается строка состояния, и макрос возобновляется в точке прерывания) PRINT Печать формы PRVBLK Предыдущий блок PRVFLD Предыдущее поле PRVREC Предыдущая запись REDISP Восстановление изображения на экране Разделяйте коды функций пробелом или пробелами точно так же, как вы разделяете предложения для команды языка SQL. Вы можете ввести их во столько строк, сколько пожелаете. В следующем примере макрокоманды имитируется нажатие клавиш NEXT BLOCK, NEXT RECORD и PREVIOUS BLOCK в следующем порядке: #EXEMACRO NXTBLK;NXTREC;PRVBLK; Коды функции в макросе применяются последовательно вне зависимости от результатов предыдущих кодов. Например, рассмотрим команду: #EXEMACRO NXTFLD;NXTFLD;NXTFLD; Эта команда в обычном случае переместила бы курсор на три поля вперед. Однако если первое поле содержит некоррек¬ тные данные, то первая функция NXTFLD прогенерирует сообщение об ошибке и не сдвинет курсор. Три функции NXTFLD могли бы прогенерировать три сообщения об ошибке. Это показывает, что при написании макроса из нескольких функций вам следует учитывать эффекты функций при всех предсказуемых условиях. Функции NOOP и NULL не делают ничего. Например, если вы хотите вывести из действия клавишу [delete record] (удалить запись), то можете определить триггер KEYDELREC следующим образом:
332 #EXEMACRO NOOP; Тогда при нажатии оператором клавиши [delete record] ничего не случится. Однако если вы выберете переключатель ’’Reverse return code” (код возврата с обращением) и введете сообщение об ошибке вида "Can’t delete permanent records" (нет возможности удалить постояные записи), то этот этап приведет к отказу и будет изображено сообщение об ошибке. (Если вы используете функцию NULL вместо NOOP, то результаты получатся такие же, но вы не получите какого-либо сообщения об отказе.) Команда #EXEMACRO всегда приводит к успеху, если нс содержит ошибки кодирования. (Команда языка SQL*Forms, содержащая ошибку кодирования, всегда дает отказ.) Вложенные макрокоманды Когда триггер активизирует некоторую команду, эта команда может выполнять функцию, вызывающую исполнение другого триггера, который в свою очередь может активизировать другую команду. Она называется вложенной макрокомандой. В такой ситуации обработка первого (внешнего) макроса прерывается в точке, где исполняется второй (внутренний) триггер. Обра¬ ботка внешнего макроса возобновляется, когда внутренний триггер полностью исполнен. Избегайте вложенных макросов, которые вызывают активи¬ зирование макроса из самого себя. Такое расположение приведет к тому, что команда будет бесконечно активизировать саму себя. Ограничения, налагаемые на употребление кодов функций Существуют ограничения, налагаемые на коды функции, которые вы можете использовать в определенных триггерах в зависимости от того, является ли триггер "триггером програм¬ мы" или "триггером события" относительно основных функций языка SQL*Forms вида [next field] (следующее поле) или [execute query] (исполнить запрос). Триггер программы явным образом активизируется по функциональной клавише, для которой определен триггер клавиши. Триггеры программы синхронны в том смысле, что они активизируются между исполнением основных функций SQL*Forms, К их чунлу
333 • все триггеры клавиш; • названные пользователем триггеры, активизируемые триг¬ герами программы. Триггер события активизируется соответствующим событи¬ ем, например перемещением курсора, проверкой правильности данных в Йоле и попыткой внести транзакцию с согласованием. Они асинхронны в том смысле, что активизируются внутри исполнения основной функции языка SQL*Forms. Например, триггер постизменения может быть активизирован во время исполнения функции [next field]. К триггерам событий относятся: • все предтриггеры; • все посттриггеры; • названные пользователем триггеры, активизируемые триг¬ герами событий. В триггере события только разрешенные коды функций макроса не являются помехой для основных функций SQL*Forms в программах. К их числу относятся: CALL CALLQRY NULL Вы можете использовать функции CASE и EXETRG при условии, что только перечисленные выше три кода функции фактически исполняются в пределах оператора CASE или названного пользователем триггера. Вызов одной формы из другой Вы можете комбинировать множественные формы в полную модульную прикладную программу посредством вызова одной формы во время обработки другой. Вызов формы может присоединять формы, сконструированные двумя или более разработчиками. Тем самым исключается разработка и под¬ держание избыточных форм. Вы можете пользоваться вызовами форм для: • меню, представляющих наборы вариантов, из которых оператор за пультом может производить выбор; • экранов подсказок; • запросов информации, нужной оператору; • разделения блоков и таблиц между несколькими при¬ кладными программами. Существуют функции макросов, которые вызывают другую форму: и CALL, и CALLQRY временно прерывают обработку
334 текущей формы, пока обрабатывается другая форма. Программа SQL*Forms пытается ввести вызываемую форму, пока нс получит код функции EXIT (или пока не будет нажата клавиша [Exit/Cancel]. Затем SQL*Forms возвращается к исходной форме и возобновляет обработку прерванного макроса. И CALL, и CALLQRY могут использоваться как в триггере программы, так и в триггере события. Однако отсутствует непосредственный доступ из одной формы в другую. Вы должны пользоваться глобальными переменными для передачи инфор¬ мации туда и обратно. Если на экране показывается сообщение об ошибке в процессе обработки CALL и CALLQRY, то оператор за пультом должен подтвердить прием этого сообщения, прежде чем будет изображена вызванная форма. Сообщение пройдет при возоб¬ новлении вызывающей формы. Функции CALL и CALLQRY несколько отличаются и требуют различного согласования. CALL позволяет обрабатывать вы¬ званную форму обычным образом. Если имеются несогласо ванные изменения в вызывающей форме, то программа SQL*Forms попросит оператора согласовать их сначала с базой данных. Ответ Y (Yes, т. е. да) согласует изменения и позволяет продолжать вызов. N (No, т. е. нет) прекращает вызов и приводил к отказу этапа триггера. Однако изменения не могут быть согласованы в триггере события. Поэтому если CALL исполь¬ зуется в триггере события и имеются несогласованные изме¬ нения, то предложение согласовать не будет изображено, вызов будет прекращен и триггер даст отказ. CALLQRY не требует согласованности изменений в вызы вающей форме и не просит об этом оператора. Изменения остаются несогласованными, пока форма не будет возобновлена. Однако операции над вызываемой формой преимущественно ограничиваются запросами следующим образом: • Вызванная форма не может вносить изменения в базу данных. Любая такая попытка приведет к сообщению об ошибке. Поэтому только поля не базы данных и поля в блоках управления могут модифицироваться по вызван¬ ной форме. • SELECT — это единственная команда языка SQL, которую вам разрешается использовать в триггере. Всякая другая команда SQL приведет к сообщению об ошибке и завершит триггер фатальным исходом.
335 • Вы не можете пользоваться нажатием [Commit] или функцией COMMIT передачи с согласованием. Иначе возникает сообщение об ошибке. • Вам разрешается использовать [Clear Form/Rollback] (очист¬ ка формы/обратная прокрутка) или функцию CLRFRM, но такое использование не даст никакого эффекта. • Вы не можете употреблять выход пользователя для выполнения команды COMMIT WORK или ROLLBACK WORK. Однако SQL*Forms не реализует это ограничение, и результаты этих команд не определены. Команда #СОР¥ Команда #COPY на этапе триггера будет копировать константы, значения полей, глобальные переменные или сис¬ темные переменные из источника в место назначения. Поме¬ стите имя источника и места назначения справа после ключевого слова #СОР¥. Только таким образом вы можете присваивать значение глобальной переменной. Вы не можете пользоваться константами или системными переменными как местами назначения. Следующая команда присваивает содер¬ жимое поля SUPPLIERS.SUPPLIERID переменной GLOBAL.ID: #COPY SUPPLIERS.SUPPLIERID GLOBALID Команда #ERASE Команда #ERASE только стирает значение глобальной переменной, имя которой следует за ключевым словом #ERASE. Сразу же после стирания имя переменной перестает быть определенным и занятая ею память освобождается. Следующая команда стирает переменную GLOBAL.ID, для которой присва¬ ивание было выполнено выше: #ERASE GLOBALID Если для переменной не было присваивания (или прежде она была стерта), то команда #ERASE игнорируется. Команда #HOST Команда #HOST в этапе триггера будет исполнять команду операционной системы. За командой #HOST должна следовать Либо закавыченная командная строка, либо имя поля или
336 переменной, содержащей командную строку. Выполнение сис¬ темной команды прерывает обработку текущей формы. Следу¬ ющая команда запустит пакет SQL*Plus и выполнит командный сценарий, называемый CUSTRPT: #HOST ’SQLPLUS ©CUSTRPT’ Если задана команда #HOST, работающая с одной опера¬ ционной системой, то она может и не работать с другой, но такие команды системы Oracle, как "SQL*Plus", переносимы и должны работать с любой операционной системой, в которой функционирует Oracle. Этап триггера, содержащий команду #HOST: • успешен, если системная команда возвращает состояние ’’успеха" или "предупреждения"; • дает отказ, если системная команда возвращает состояние "серьезной ошибки"; • приведет к фатальному исходу (и аварийно прекратит выполнение триггера), если система не может исполнить команду #HOST или если она возвращает состояние "серьезного фатального исхода". Команды выхода пользователя в триггерах Выход пользователя представляет собой функцию, написан¬ ную на таком языке программирования, как Си, и активизи¬ руемую командой выхода пользователя. В этапе триггера выход пользователя может изображать сообщения и выполнять обра¬ ботку за рамками команд языка SQL. Кроме того, он может выполнять вычисления и просмотры таблиц гораздо быстрее, чем команда SQL. Вообще говоря, выходы пользователя служат только для выполнения действий, с которыми не могут справиться другие команды триггеров, например, выполшот • сложную проверку правильности данных в поле; • сложные вычисления; • обновления, инициируемые значениями по некоторой форме. Выходы пользователя могут приводить к успеху, давать отказ или вызывать фатальный исход. Программа выхода пользова¬ теля должна возвращать значение по адресу, указанному средствами SQL*Forms.
337 Написание выхода пользователя В настоящее время выходы пользователя поддерживаются в системах программирования на языках Си, Кобол, Фортран, PL/1 и Паскаль. Но не все они могут использоваться с любыми операционными системами. См. инструкцию по установке и руководство пользователю для вашей системы. Включающий язык, применяемый вами для написания выхода пользователя, может активизировать операции системы Oracle со встроенными командами, написанными на версии языка SQL для Oracle. Однако в случае включения встроенных команд выход пользователя до его компиляции должен быть обработан предкомпилятором РСС, который транслирует ко¬ манды языка SQL в вызовы функции, выраженные на вклю¬ чающем языке. Затем стандартный компилятор включающего языка может использоваться для компиляции результатов работы РСС. Когда требуется модифицировать программу, то модификации вносятся во входные данные для РСС и пред- компилятор РСС запускает на счет заново. Вам не нужно использовать РСС, если в выходе пользователя отсутствуют встроенные команды языка SQL. Предкомпилятор РСС может вызываться с подходящим параметром командной строки для поддержки каждого вклю¬ чающего языка. Включающие языки называются Рго*С для использования с языком программирования Си, Pro*Cobol для Кобола, Pro*Fortran, Pro*PL/1 и Pro*Pascal для каждого из этих языков. Корпорация Oracle публикует руководства пользователей для всех перечисленных включающих языков. Для запуска в работу формы с применением входа пользо¬ вателя вы должны также: • использовать утилиту GENXTB для добавления выхода пользователя к таблице программ в IAPXIT; • создавать новую версию IAP, связывая вместе IAP, IAPXIT и новую программу. Вызов выхода пользователя из триггера Как только вы уже написали, отладили, предкомпилировали, Компилировали и повторно компоновали программу выхода Пользователя, вы можете обращаться к ней из этапа триггера. Включите в этап триггера ее имя, заключенное между знаком
338 # и любыми параметрами, которые принимаются программой, например: "<имя выходах параметры > Например, этап триггера "VALIDATE 10 24 А активизирует выход пользователя, называемый VALIDATE, с тремя параметрами. Вы должны также специфицировать сооб¬ щение об отказе по окну TRIGGER STEP. Заключение В этой главе описывается утилита SQL*Forms системы Oracle, состоящая из программы экранной живописи для проектирования форм и средства запуска в работу форм, используемых конечными пользователями. Определяются спе¬ циальные термины, применяемые в SQL*Forms. Включены подробные инструкции относительно проектирования и исполь¬ зования форм.
16 SQL*Report Программа SQL*Report служит для генерации отчетов. В ней средства форматирования текстов сочетаются с возможностями запросов языка SQL. Опа может использоваться для подготовки весьма разнообразных документов от простых писем до бюджетных отчетов. Во все такие документы вы можете включать информацию из базы данных. Эта программа может служить также для заполнения подготовленных к печати форм. SQL*Report состоит из двух утилит: • Генератор отчетов (RPT), который позволяет вам ис¬ пользовать в ваших письмах и отчетах информацию из базы данных Oracle, извлекая информацию из базы данных посредством операторов языка SQL. • Форматер текстов отчетов (RPF), который позволяет вам управлять окончательной формой ваших форматов отчетов. Замечание. Термины ’’таблица” и ’’столбец" определяются в SQL*Report не совсем так, как в других главах этой книги. Они будут определяться конкретно для SQL*Report по мере того, как будут встречаться ниже. Упомянутые две утилиты будут объясняться по отдельности в последующих двух разделах. Их комбинированное использование будет иллюстрироваться в последующей части главы. Форматер текстов (RPF) Вам необходимо познакомиться с RPF до того, как пытаться работать с генератором отчетов (RPT). Утилита RPF представ-
340 ляет собой форматер текстов для приложений обработки вербальной информации. Вы должны включить команды RPF в текст своего документа, чтобы управлять форматированием информации. Команды RPF специфицируют: • горизонтальную и вертикальную границы; • центрирование и подчеркивание; • табуляцию; • нумерацию страниц; • разметку и размещение текста; • выходные данные, направляемые на строчный принтер, печатающий терминал или на электронно-лучевую трубку. Вы можете пользоваться утилитой RPF независимо от RPT, но обратное утверждение не верно: RPT не может использоваться без RPF или некоторого другого средства форматирования текстов. Вы должны помещать свои форматирующие команды RPF непосредственно в предназначенный для форматирования файл. Можно сделать это вручную или с помощью текстового редактора. Если файл конструируется программой, то можно включить команды RPF в программу. Команды RPF Всякая команда RPF начинается либо с точки (.), либо со знака фунта (#). Слова, которые начинаются со знака фунта или точки не являются корректными командами и будут интерпретироваться как текст. Если вы хотите представить как текст корректную команду, то должны поставить перед ней обратную косую черту (\), в противном случае она будет исполняться как команда и не будет напечатана в тексте. Например, #В является корректной командой для включения в пустую строку, но \#В интерпре¬ тируется как текст и будет печататься как #В. Вы можете писать команды как прописными, так и строчными буквами. За каждой командой должны следовать один или несколько параметров. Отделяйте команду и пара¬ метры друг от друга хотя бы одним пробелом, символом табуляции или символом подачи формы. Пользуйтесь одиноч¬ ной точкой или знаком фунта для завершения команд с несколькими параметрами или же команд, оперирующих группой слов (например, при центрировании или подчеркивании). Утилита RPF представляет текст как последовательность слов. Она определяет слово как последовательность символов, завер¬
341 шающуюся по крайней мере одним пробелом или символом конца строки. RPF вставляет символ конца строки в текст всякий раз, когда вы вводите возврат каретки. Вне зависимости от тЪго, сколько пробелов вы помещаете между словами, утилита RPF будет разделять слова на выходе одним пробелом. Пробелы, символы табуляции, возвраты каретки, подачи форм и символы новой строки не воздействуют на размещение слов в результате, выдаваемом утилитой RPF. По умолчанию текст выравнивается справа. Иначе говоря, концы слов будут выравниваться утилитой RPF по правой границе точно так же, как и по левому краю. Это обеспечивается изменением интервалов между словами в строке таким образом, чтобы правые края образовали прямую линию, а не зигзаги. Если вы не хотите получающихся при этом неравномерных строчных интервалов, то отменяйте выравнивание справа, так чтобы правые края шли зигзагами, а интервалы между словами в строке были одинаковыми. Никогда не разделяйте на части слова между соседними строками. Утилита RPF будет продолжать обработку, пока не достигнет конца входного файла. Та область строки, где размещается текст, называется столбцом. Если вам не удается специфицировать границы столбца, то RPF поместит текст в столбец по умолчанию с левой границей в позиции 1 и правой границей в позиции 132. Максимальная ширина строки отчета составляет 254 символа. Использование RPF Чтобы воспользоваться форматером RPF, вы должны ввести текст в "таблицы” из одного или более столбцов. Заметим, что таблица RPF отличается от таблицы СУРБД Oracle. Таблица RPF представляет собой просто прямоугольную область. На¬ пример, отдельное деловое письмо явилось бы "таблицей" для RPF с шириной, определяемой вашей командой DT (см. ниже), и длиной, определяемой количеством информации и текста, помещаемого вами в это письмо. Таблица по умолчанию Таблица включает в себя от 1 до 20 столбцов и определяет границы для размещения слов в текущей строке. Таблица по умолчанию состоит из одного столбца и служит в роли Начального описания таблицы. Границы распространяются от
342 позиции 1 до позиции 132. В таблице по умолчанию выровнены справа все строки за исключением последней. Другие таблицы определяются в этих пределах с указанием конкретных границ и количества столбцов. Форматирование таблицы Для форматирования таблицы необходимы четыре этапа: 1. Определение таблицы. Оно включает в себя: • точку или знак фунта в начале; • команду DT определения таблицы; • идентифицирующее таблицу число от 1 до 19; • число, указывающее, где начинается левая граница; • по крайней мере один пробел между DT и каждым из упомянутых чисел; • точка или знак фунта в конце. Например: #DT 4 10 70 # определяет таблицу № 4 с границами в позициях 10 и 70. 2. Активизирование таблицы. Воспользуйтесь командой Т активизирования и идентификатором таблицы. Например: # Т4 активизирует определенную выше таблицу. 3. Ввод текста и команды форматирования. Теперь вы можете ввести свой текст и, если значения по умолчанию годятся для этого, то вам нет надобности выполнять какое-либо дальнейшее форматирование. Однако может ока¬ заться не так: по умолчанию получается сплошной столбец, простирающийся от позиции 1 до позиции 132 без дальнейшего разбиения. Поэтому у вас может возникнуть желание воспользо ваться некоторыми из следующих возможностей форматирования: • Длина. Команда PAGE определяет верхнюю и нижнюю границы страницы. RPF начнет размещать текст с шестой строки от верха каждой страницы и автоматически перейдет к следующей странице после заполнения строки 58. Предполагается, что все страницы имеют длину в 66 строк. При размещении шести строк в одном дюйме этим покрывается стандартная страница длиной в 11 дюймов (28 см). Команда #PAGE 6 58 начнет текст шестью строками ниже верха страницы и распространит его до строки 58. • Интервал между строками. По умолчанию состоит из одного пробела. Для его изменения воспользуйтесь
343 командой SP и укажите, сколько строк интервала утилита RPF должна оставлять под каждой строкой текста. Принято вызывать текст без пропусков между текстовыми строками (один интервал), текст с одним пробелом между строками (два интервала) и т. д. Итак, если вы хотите пропускать одну строку между каждыми соседними строками текста, то соответствующая команда пишется так: #SP2 • Управление новыми строками. Поскольку интервалы в ваших командах не сказываются на интервалах в выда¬ ваемых результатах, вы должны сообщать утилите RPF, когда ей начинать новую строку. Для этого вводите букву N там, где хотите иметь в окончательном результате конец строки. • Определение абзацев. Команда Р абзаца приведет к тому, что последующий за нею текст будет печататься со следующей строки с отступом в пять позиций. При этом тело текста будет напечатано в пределах границ столбца. • Завершение таблицы. Последним этапом является вы¬ дача команды ТЕ окончания таблицы. В этот момент утилита RPF вернется к значениям по умолчанию. Если вы не завершаете таблицу, то при работе утилиты RPF получите сообщение об ошибке "unexpected end of column" (неожиданное окончание столбца). Работа с RPF Установив таблицу, вы можете запустить ее в работу, введя команду с таким форматом: rpf <имя файла>[<имя файла для вывода>] [ < имя устройства> [-переключатели > ] На рис. 16-1 приведен пример файла вывода для RPF, демонстрирующий употребление объясненных в предыдущем разделе команд при сопоставлении делового письма. Номера строк добавляются только для удобства восприятия этого текста, вам не потребовалось бы указывать номера строк при состав¬ лении реального письма. Чтобы организовать отчет с несколькими столбцами, вам понадобятся также следующие команды:
344 • определения столбцов; • центрирование и подчеркивание; • вложенные таблицы; • ввод данных в столбцы; • выравнивание текста в пределах столбца; • переход к следующей строке; • автоматическое присоединение тексту столбца; • определение таблицы из двух столбцов. 1. DCT 1 13 73# 2. # страница 6 58 3. #SP 1 4. #Т 1 5. #S 3 6. 7 апреля 1987 г. 7. #S3 8. М-ру Дж. Б. Джонсу#М 9. 483 Norwood St.#N Seabreeze, СТ, 33234 10. #S4 11. Дорогой мистер Джонс! 12. #S 4 #Р 13. Мы получили сегодня Ваше отправление 14. #S 1 15. #Р В отдельном конверте мы возвращаем все отправление, 16. потому что оно получено слишком поздно для целей 17. заключения нашей сделки. Поскольку согласно нашему 18. заказу мы должны получить продукцию не позднее 19. 15 марта, мы возвращаем также Вашу накладную. 20. #В #Р 21. Возможно, нам удастся поддерживать деловые отношения 22. когда-нибудь в будущем. 23. #S 2 24. С искренними чувствами 25. #S 4 26. Джон Грин 27. #ТЕ Рисунок 16-1. Пример входного файла для форматера отчетов с встроенными командами и порождаемое им деловое письмо
345 Приведенные выше команды форматирования приведут к появлению такого письма: 7 апреля 1987 г. М-ру Дж. Б. Джонсу 483 Norwood St. Seabreeze, СТ 33234 Дорогой мистер Джонс! Мы получили сегодня Ваше отправление. В отдельном конверте мы отправляем все отправление, потому что оно получено слишком поздно для целей заключения нашей сделки. Поскольку согласно нашему заказу мы должны получить продукцию не позднее 15 марта, мы возвращаем также Вашу накладную.Возможно, нам удастся поддерживать деловые отношения когда-нибудь в будущем. С искренними чувствами Джон Грин Рисунок 16-1. Продолжение Табличные отчеты Пакет SQL*Report особенно полезен для подготовки таблич¬ ных огчетов. Лучше всего это видно на примере построчного объяснения. Ниже приводится листинг команд для составления таблицы из пяти столбцов. Вслед за листингом даются объяснения каждой команды. Сам табличный отчет с вложен¬ ными таблицами показан на рис. 16-2. (Номера строк добавляются только для наглядности этого текста, вы не стали бы писать номера строк при организации реального отчета.) Общие принципы организации такого отчета состоят в следующем. Определение общих границ. Общие горизонтальные грани¬ цы определяются по "таблице 1", которая представляет собой глобальное обобщение отчета на странице. Эти границы равны
346 13 и 73. Вся область называется "столбцом". Любые таблицы в отчете будут "вкладываться" в пределах этих границ. 1. #DT 1 13 73# 2. #DT 2 1 5 9 28 32 39 42 52 0# 3. #страница 6 58 4. #Т 1 5. #S 4 6. #CUL "ПРОИЗВОДСТВЕННЫЙ ОТДЕЛ"# 7. #S 2 8. #CUL МЕСЯЧНЫЙ ОТЧЕТ О СБЫТЕ# 9. #S 4 10. #Т 2 11. ЭЛЕМЕНТ #N АМТ. #NC 12. #CEN ПРОДУКЦИЯ # #N #CEN ОПИСАНИЕ # #NC 13. #R ПРОШЛЫЙ #N МЕСЯЦ #NC 14. #R ЭТОТ # МЕСЯЦ #NC 15. #R Y-T-D #NC 16. #S 2 17. 500 В Яблоки #NC $329.26 #NC $438.50 #NC $1836.30 #NC 18. #S 1 19. 40 T Лимоны #NC $100.39 #NC $308.22 #NC $803.20 #NC 20. #S 1 21. 48 С Апельсины $839.22 #NC $798.33 #NC $2305.98 #NC 22. #S 1 23. #NC #NC #N $1258.87 #NC $1545.05# 24. $2945.48 25. #TE #S 3 26. #CUL SEE \ NEXT \ PAGE# 27. #TE Рисунок 16-2. Команды для организации табличного отчета из пяти столбцов и формируемый этими командами отчет
347 Утилита RPF составит на основании этой входной инфор¬ мации такой табличный отчет: ПРОИЗВОДСТВЕННЫЙ ОТДЕЛ МЕСЯЧНЫЙ ОТЧЕТ ЭЛЕМЕНТ АМТ. ОПИСАНИЕ ПРОДУКЦИИ ПРЕДЫДУ¬ ЩИЙ МЕСЯЦ ЭТОТ МЕСЯЦ ВЧЕРА 500 В Яблоки $329.26 $438.50 $1836.30 40 Т Лимоны $100.39 $308.22 $803.20 48 С Апельсины $839.22 $798.33 $2305.98 $1258.87 $1545.05 $2945.48 См. следующую страницу Рисунок 16-2. Продолжение Определение столбцов. Другая таблица 2, определяется по строке 2. Тем самым общий столбец подразделяется на 5 столбцов. Границы столбцов устанавливаются от 1 до 50, от 9 до 28, от 32 до 39 и т. д. Последний столбец определяется номерами 58 и 0. Число 0 означает, что столбец заканчивается в правой границе общего столбца, в пределах которого существует эта таблица. Иначе говоря, правая граница определяется как 73 в общем столбце, установленном в команде DT по строке 1. Определение вертикальных границ. Строка 3 определяет верхнюю и нижнюю границы страницы вывода, а строка 4 активизирует таблицу 1. Поскольку таблица 1 содержит только один столбец, ее текст будет форматироваться в пределах границ этого столбца. Центрирование и подчеркивание (CUL). Команда CUL в строке 6 устанавливает, что текст между этой командой и завершающей точкой должен быть центрирован в пределах текущего столбца и подчеркнут. Поскольку текущий столбец имеет протяженность от позиции 13 до позиции 73, этот текст центрируется па странице. Команда CUL в строке 8 порождает вторую строку центрированного и подчеркнутого текста.
348 Вложенные таблицы. Команда в строке 10 активизирует таблицу 2, которая была установлена выше в элементе 2, и помещает ее в пределах таблицы 1. То же самое происходит при установке на пишущей машинке режима табулирования для разделения всего столбца на пять отдельных столбцов. Если некоторая таблица активизируется при сохранении активности другой таблицы, то новая таблица становится "текущим" столбцом. Конечно, границы новой таблицы вписы¬ ваются в границы "родительского" столбца. Границы таблицы 2 интерпретируются относительно границ таблицы 1. Иначе говоря, таблица 1 фактически начинается в позиции 13. Однако таблица 2 начинается в первой позиции таблицы 1, и поэтому левая границы таблицы 2 показывается в относительной позиции 1, и она распространяется до относительной позиции 5. Дело в том, что таблица 1 содержит 61 печатную позицию. Таким образом, спецификации столбцов для таблицы 2 называют первую печатную позицию позицией 1, а последнюю — позицией 61. Это позволяет прослеживать границы имеющегося пространства. Ввод данных в столбцы. Текст из строки 11 помещается в первый столбец. Команда N приводит к внесению текста "No." (нет) в новую строку в пределах этого столбца. Команда NC приводит к прекращению размещения текста в текущем столбце. Любой следующий текст будет помещен в первой строке следующего столбца в таблице 2. Выравнивание текста в пределах столбца. Команда CEN в строке 12 обусловливает, что слова ITEM и DESCRIPTION должны быть центрированы по первым двум строкам второго столбца. Команда R (выровнять справа) в строках 13, 14, 15 специфицирует, что все последующие строки для столбцов 3, 4 и 5 должны быть выровнены справа. Заметим, что суммы в долларах в последних трех столбцах выравниваются справа. Перемещение в новую строку. Когда для каждой строки последний столбец заполнен, требуется команда для возврата в первый столбец. Это обеспечивается командой NC в строке 15. Команда S2 в строке 16 действовала бы так же и тоже предписала бы пропуск двух строк. Строка 17 помещает первую строку данных в каждый столбец отчета. Строки 19 и 21 определяют вывод для второй и третьей строк отчета. Автоматическое присоединение текста к столбцу. Утилита RPF поместит в одну строку столбца столько текста, сколько
349 возможно. Когда эта строка заполнена, последнее слово вырав¬ нивается справа, а оставшийся текст помещается в следующую строку столбца. Поскольку для текста PRODUCT DESCRIPTION требуются две строки, RPF осуществляет спуск на один интервал после этой строки, так что все столбцы для следующего элемента появляются в одной и той же строке. Суммирование информации. Суммарная информация спе¬ цифицируется в строках 23 и 24. Поскольку в первых двух столбцах нет информации, требуются две команды NC для помещения первой информации для этой строки в третьем столбце. Выходные данные для последних трех столбцов будут содержать строку черточек. Суммы для столбцов появятся в следующей строке. Конец таблицы. Команда ТЕ в строке 25 завершает текущую таблицу. В этот момент активизированная прежде таблица (таблица 1) снова становится текущей. Текст по строке 26 будет центрирован и подчеркнут в пределах границ столбца таблицы 1. Обратная косая черта (\) предписывает утилите RPF включить второй пустой символ между каждыми соседними словами вместо обычного одинарного интервала между словами. Команда ТЕ в строке 27 завершает таблицу 1, делая текущей таблицу, выбираемую по умолчанию. Другие команды форматирования: • введение или удаление дополнительных пробелов; • печать обратной косой черты; • печать команды утилиты RPF; • изменение номера страницы; • пробел; • центрирование; • пропуск столбца; • центрирование с подчеркиванием; • чертежи; • подавление справа; • горизонтальный пропуск; • отступ; • новый столбец; • абзац. В табл. 16-1 приводится синтаксис всех команд RPF с Краткими пояснениями.
350 Таблица 16-1. Описание и синтаксис команд RPF Команда Синтаксис Описание APN #APN < позиция > В #В CEN #CEN < текст ># CL #CL... < текстовые строки > # CS #CS < число строк > CUL #CUL < текст ># DT #DT сид таблицы> <spl> <epl> <sp2> <ер2> ...<spn> <epn># F #F сном 1 страницы> сном 2 страницы>...# Изменяет номер страницы: размещение нумерованных страниц Пропуск: Включает одну пустую строку в текст на выходе Центрирование: Последующий текст центрируется в текущем столбце. Закрывается1 Литеральный столбец: Приостановка форматирования для следующих строк в текущем столбце. Закрывается1 Пропуск столбца: Пропускаются п строк в текущем столбце Центрирование с подчерки¬ ванием: Центрирование и подчеркивание для всего последующего текста в пределах текущего столбца. Закрывается1 Определение таблицы: Определяются границы столбца для специфицированной таблицы. Закрывается1 Чертежи: Отводит в выходном документе страницы с указанными номерами для чертежей и графиков. Ном 1 страницы — это номер страницы, который нужно пропустить в выходном документе. Закрывается1
351 Таблица 16-1. Продолжение Команда Синтаксис FR #FR HS #HS < заполнение пробелами > I #1 < число пробелов > L #L... <строки текста> # N #N NC #NC NP #NP PAGE #PAGE < верхняя строка > < нижняя строка> Р #Р PAUSE #PAUSE Описание Подавление справа: Выравнивание и по левой, и по правой границам. Устанавливается по умолчанию Горизонтальное заполнение пробелами: для символов на принтерах типа Diablo. По умолчанию 6 или 10 символов на дюйм Отступ: Отступ последующего текста в текущем столбце Литерал: Отсрочка форматирования для последующих строк текста, определения столбцов игнорируются. Закрывается1 Новая строка: Переход к следующей строке в текущем столбце Новый столбец: Переход к следующему столбцу Новая страница: Заканчивается текущая страница и начинается новая Страница: Определяются верхняя и нижняя границы страницы Абзац: Начало новой строки в текущем столбце. Отступ начала строки на 5 пробелов Пауза: Останов принтера, пока не поступит некоторый сигнал от оператора с пульта
352 Таблица 16-Т Продолжение Команда Синтаксис Описание R #R Выравнивание справа: У станов- ка/отмена переключения на выравнивание справа всего текста, помещаемого в текущем столбце- RR #RR Неровно справа: Получение неровной (невыровненной) правой границы S #S < число строк > Пропуск: Пропускается указанное число строк SP #SP <n> Интервал: Определение интер¬ вала между строками вывода SPN #SPN <тип> <позиция> < пропускаемые строки > < начальный номер > < номер раздела ># Начало нумерации страниц: Специфицируется нумерация страниц. Закрывается1 Т #Т <ид таблицы > Таблица: Активизируется специфицированная таблица в текущем столбце ТЕ #ТЕ Конец таблицы: Завершение таблицы и возврат к предыдущему определению столбца TTL #TTL <w> < заголовок 1> [< заголовок 2>]# Заголовок: Специфицируется заголовок с центрированием вверху каждой страницы. Закрывается1 TTLU #TTLE <w> < заголовок 1> [< заголовок 2>]# Заголовок с подчеркиванием: Специфицируется заголовок с центрированием и подчерки¬ ванием вверху каждой страницы. Закрывается1
353 Таблица 16-1. Продолжение Команда Синтаксис Описание UL #UL < текст ># Подчеркивание: Подчеркивается последующий текст. Закрывается1 VS #VS < интервал > Вертикальный интервал: Определяется вертикальный интервал для принтеров типа Diablo. Комментарий "Закрывается” означает, что данная команда должна завершаться точкой (.) или знаком фунта (#). Исполнение RPF Утилита RPF может быть активизирована с пользователь¬ ского терминала. Выходные данные могут быть направлены на некоторый файл или же на любой терминал или устройство строчной печати, в том числе на системный принтер. RPF исполняется по следующей команде: RPF < входной файл><устройство вывода> [-переключатели] где входной файл устройство вывода переключатели имя входного текстового файла; имя устройства вывода; специфицируют один или более переключателей для управления исполнением RPF (описание переключателей см. ниже). Переключатели Вы можете осуществлять вывод непосредственно на некоторое Устройство, пользуясь переключателем устройств или называя Желаемое системное устройство вывода. Вы можете специфи¬ цировать один или более переключателей для управления Исполнением RPF. К их числу относятся переключатели: А = Сплошной жирный шрифт. Переключатель А приводит К тому, что все выходные данные печатаются жирным шрифтом.
354 Этот режим поддерживается только в принтерах типа Diable,. Для других принтеров этот переключатель игнорируется. При использовании этого переключателя нет надобности специфи¬ цировать переключатель В (жирный шрифт). В = Жирный шрифт. Переключатель В приводит к тому, что весь подчеркнутый текст печатается жирным шрифтом. Поддерживается только для принтеров типа Diablo. Для других принтеров этот переключатель игнорируется. D:D = Устройство является принтером типа Diablo. Перс ключатель D:D специфицирует, что устройство вывода пред¬ ставляет собой принтер типа Diablo и будет поддерживать печать жирным шрифтом и в двух направлениях. D:V = Устройство — это VT100. Переключатель D:V специфицирует, что устройством вывода является терминал VT100. Этот переключатель приводит к тому, что весь подчер кнутый текст выдается в негативном видеоизображении. Будет создан выходной файл, но он будет пустым. Если не специ¬ фицируется терминал видеоизображения, то подчеркнутый текст будет изображен, а потом переписан с подчеркнутыми буквами. F = Подача страницы. Переключатель F перед печатью страницы посылает на терминал символ подачи страницы. Если он не используется, то печатается подходящее количество пустых строк для позиционирования принтера вверху следую щей страницы. В утилите RPF при включении пустых строк подразумевается страница из 66 строк. Для страниц другой длины требуется позиционирование с помощью переключателя F. Если терминалы не поддерживают символ подачи страницы, то этот переключатель игнорируется. I = Выдача начальной страницы. Переключатель I выдает страницу до того, как устройство вывода приступит к печати. P:N:M = Страница. Переключатель P:N:M печатает страницы из диапазона от п до ш. Например: Р:5 Печатает страницы с пятой до последней. Р:5:7 Печатает страницы 5, 6 и 7. Р:5:5 Печатает только страницу 5. R = Обратный порядок подчеркивания. Не все устройства допускают перенабор. По умолчанию, утилита RPF сначала печатает символы, и поэтому на устройствах, где не разрешено наложение символов, символ подчеркивания не заменит неко¬ торого символа. Чтобы обратить этот принятый по умолчанию порядок, пользуйтесь переключателем R.
355 S = Буферизирование на строчный принтер. Переключатель S автоматически направляет выходной файл на построчно печатающее устройство для постановки в очередь на печать. U = Прописные. Переключатель U печатает все буквы как прописные. W = Ожидание (пауза). Переключатель W приведет к тому, что утилита RPF будет приостанавливать печать в конце каждой страницы и при всяком появлении команды PAUSE. Печать возобновляется после ввода любого одиночного символа. Этот символ не печатается. Переключатель W используется при спецификации устройства D:V или D:D. Генератор отчетов системы Oracle (RPT) В этом разделе предполагается, что читатель знаком с форма¬ тером текстов системы Oracle, описанном в начале главы. Хотя и операторам утилиты RPT, и операторам RPF могут предшествовать как точка (.), так и знак футгга (#), в этом разделе знак фунта будет по-прежнему использоваться для операторов RPT, а точка будет использоваться для операторов RPF, чтобы облегчить различение в этих примерах операторов утилит RPF и RPT. Назначение утилиты RPT состоит в том, чтобы позволить вам извлекать из базы данных информацию и использовать ее при конструировании отчетов, документов, генерируемых компьютером писем или при любых других применениях данных. С помощью утилиты RPT вы можете: • использовать запросы- на языке SQL для поиска инфор¬ мации в базе данных Oracle; • использовать другие операторы языка SQL для манипу¬ лирования этими данными; • пользоваться специфическими форматами вывода данных; • включать заголовки отчетов и опорную информацию; • употреблять команды RPF, чтобы объединять ваши данные с вашим текстом при изготовлении отчетов. Утилита RPT интерпретирует и исполняет ’’сценарий” отчета, или программу, состоящую из любой комбинации операторов Написания отчета, команд утилиты RPF и текста. Общий вид оператора утилиты RPT такой: < командах аргумент 1 >< аргумент 2 >...< аргумент п> При этом можно пользоваться как строчными, так и Прописными буквами.
356 Команда утилиты RPT может начинаться в любом месте входной строки и занимает всю строку. Вы можете включить в эту строку текст отчета или другие команды. Все аргументы, связанные с некоторой командой, должны быть специфициро¬ ваны в той же строке. У команды может быть один или более аргументов. Аргументы специфицируются по занимаемой ими позиции в определенном порядке. Всякий аргумент может представлять собой строку либо алфавитных, либо цифровых символов и должен отделяться от следующего аргумента хотя бы одним пробелом. Сам аргумент тоже может содержать пробелы, но в таком случае весь аргумент должен быть заключен в двойные кавычки. Генерация отчета Когда вы генерируете отчет, пакет SQL позволяет получать из базы данных желаемые данные. Команды RPF и операторы RPT дают возможность вставлять данные в формат отчета. В этом разделе объясняются и иллюстрируются операторы, необходимые для конструирования программы отчета. Назна¬ чение программы отчета состоит в восстановлении данных из базы данных и помещении этих данных в промежуточный файл. Всякий элемент данных, помещаемый утилитой RPT в промежуточный файл, интерпретируется утилитой RPF при обработке промежуточного файла как некоторое слово. Файл программы может содержать, помимо операторов программы RPT, команды форматирования утилиты RPF (или другие), а также текст. Утилита RPT, встречаясь с текстом и командами форматирования, копирует их непосредственно в промежуточный файл. С другой стороны, операторы программы отчета (например, операторы RPT) интерпретируются и испол¬ няются. Таким образом, информация из базы данных сливается с текстом, формируя законченный отчет, Утилита RPT может исполняться с терминала или включаться в пакетную процедуру. Она исполняется по следующей команде: RPT < входной файл >< выходной файл> [ид пользователя/пароль] [-cN] где < входной файл> — это имя файла, содержащего программу отчета для RPT
357 < выходной файл> — это имя файла, которое нужно присвоить промежуточному файлу, создаваемому утилитой RPT, а затем обрабатываемому утилитой RPF ид пользователя/пароль — это ваш пользовательский идентификатор или пароль. Он требуется, потому что для пользовательского идентификатора должны быть доверены привилегии SELECT для желаемых данных cN специфицирует размер рабочей области пакета SQL для всякого запроса на языке SQL, определяемого в отчете. Если этот параметр отсутствует, то будет использовано значение по умолчанию, специфи¬ цированное в файле INIT.ORA Структура отчета Программа для RPT состоит из трех разделов. Они не определяются какими-либо операторами, а представляют собой всего лишь логическое группирование. Хотя на позициониро¬ вание операторов RPT в пределах программы накладывается немного ограничений, все же переменные должны определяться до их использования. Команды RPT и текст отчета могут включаться в любом месте программы и будут копироваться в промежуточный файл, как если бы они встретились во время исполнения программы. Программа для RPT состоит из следующих трех разделов: Раздел описания данных. Раздел описания данных содержит определение ваших локальных переменных, которые будут служить для временного хранения информации, восстановлен¬ ной из базы данных. Можно также определить переменные для счетчиков, для хранения итогов и для временного хранения. Раздел макроопределении. В разделе макроопределений Можно определить два типа макросов: (1) макрос SELECT в Языке SOL. (2) Процедурный макрос, который представляет собой совокупность исполнимых операторов утилиты RPT и Похож на подпрограмму. Раздел процедур. Раздел процедур содержит исполнимые
358 операторы утилиты RPT, составляющие основное тело программ мы отчета. В пределах этого раздела макросы SELECT и процедурные макросы могут исполняться как явно, так и неявно. Вложенные отчеты Вложенный отчет содержит список или некоторый другой вид формальной информации в пределах тела главного отчета. Вложенный отчет можно рассматривать как "внутренний отчет", содержащийся во "внешнем", или главном отчете. Операторы языка SQL*Report Существуют шесть типов операторов для RPT: • описательные; • макроопределения; • исполнение макросов; • управления программой; • арифметические; • разнородные. Формат данных шести операторов приведен в табл. 16-2, а сами операторы объясняются в следующих разделах. Таблица 16-2. Обзор операторов для RPT Оператор Формат Описательный Макроопределение .DECLARE <имя программной переменной > < формат> .SET <имя программной переменной:- <литеральное значение > .EQUAL < целевая переменная > < исходная переменная > .DEFINE |<имя макроса SELECT> | <имя процедурного макроса > | строки текста Исполнение макроса .<имя процедурного макроса> EXECUTE <имя макроса SELECT >
359 Таблица 16-2. Продолжение Оператор Формат .REPORT < макросы SELECT > <тело макроса > [< заголовок макроса > [основание макроса >] Управление .& <имя метки > программой .GOTO <имя метки > .IF [”] < выражение > [”] THEN <метка 1> [ELSE <метка 2>] .IFNULL <имя переменной > <имя метки > .STOP Арифметический |ADD| . [ SUB | < целевая переменная > | < переменная источника 1> | | < переменная источника 2> | |MUL| | < литерал > | | <литерал> | |DIV| |DSUB| Разнородные .PRINT <имя программной переменной > [имя перемепной>]... .FPRINT [интервал] < переменная > [[интервал^ < переменная >]]... ASK ’<сообщение>’<имя программной переменной> .REM < текст комментария > .TELL ’< сообщение >’ .ROLLBACK .COMMIT Описательные операторы DATABASE, Оператор DATABASE требуется в ранних версиях системы Oracle, но не нужен в версиях, начиная с четвертой. Он специфицирует базу данных Oracle для работы в пределах отчета. DECLARE. Оператор DECLARE определяет программную переменную и формат печатаемой переменной. Для всех программных переменных должны быть установлены специ¬ фицированные значения. Синтаксис оператора DECLARE такой:
360 .DECLARE <имя переменной><формат> где <имя переменной > — это имя, присвоенное данной программной переменной. Оно может занимать от одного до восьми символов и должно начинаться с буквы < формат> — это формат редактирования, используемый при помещении этой переменной в промежуточный файл. В арифметических операторах этот формат будет также контролировать округление и переполнение. Тип данных для переменной указывается посредством спецификации ее формата Типы данных. В формате оператора DECLARE поддержи¬ ваются следующие типы данных: календарный, алфавитно-циф ровой и числовой. Они рассматриваются ниже. В RPT имеются три типа календарных переменных: date, edate и YYMMDD. Значение любой из таких переменных хранится в виде юлианской даты. Это позволяет выполнять календарные вы¬ числения и устанавливать дату одного типа в качестве значения для другого типа. Например, чтобы найти юлианскую дату, установите числовую переменную, равную календарной пере¬ менной, воспользовавшись командой RPT .EQUAL. Форматы для названных типов следующие: • для переменной типа date форматом ввода (ASK или .SET) и вывода (.PRINT или .FPRINT) является MM/DD/YY; • для переменной типа edate форматом является DD/MM/YY ("европейский формат"); • для переменной типа YYMMDD форматом является YYMMDD. При внутреннем хранении всякая календарная переменная представляет собой числовую переменную, содержащую соответ¬ ствующие данные как абсолютный юлианский номер дня (т. е. номер дня от начала новой эры). Благодаря этому можно вычитать из дат числовые значения. Например, в печатной накладной срок может быть вычислен как текущая дата плюс 30 дней. Если вы не выполняете вычисления над датами в пределах самого отчета, то корпорация Oracle рекомендует вам интерн-
361 ретировать даты как алфавитно-цифровые строки в рамках RPT. Вы можете воспользоваться функцией TO_CHAR для преобра¬ зования календарного столбца в желаемый формат. Например: TO_CHAR (<CTon6eq>,’MM/DD/YY’) Если вы выбираете данные непосредственно без функции TO..CHAR, в результате получится по умолчанию формат DD-MON-YY. Значение календарной переменной может быть инициализиро¬ вано одним из нескольких способов. Так, можно присвоить литеральное значение (дата устанавливается в формате MM/DD/YY), или же может быть установлено значение, равное значению другой календарной переменной. Если значение присваивается из столбца или выражения, возвращаемого командой SELECT языка SQL, то значение из базы данных должно быть представлено во внутреннем формате юлианских дат. Вы можете выбрать (SELECT) календарный столбец из Oracle, воспользо¬ вавшись функцией преобразования: TO_CHAR (<столбец>,\Г) Чтобы создать столбец, совместимый с календарными данными, нужно определить столбец как число в операторе CREATE TABLE языка SQL. Нужно первоначально ввести значение столбца и каждый раз обновлять его при использо¬ вании прикладной программы JAF (объясняемой в гл. 2), где тип поля определяется как дата. Константы ключевых слов. RPT содержит две константы ключевых слов, относящиеся к календарным данным: $$DATE$$ и $$Т1МЕ$$. Они преобразуются в строки. Поэтому если вы вводите .SET текстпер $$DATE$$ то получите юлианский день дня в текстовой переменной. Если же вводите. SET числпер $$DATE$$ то получите юлианский день в числовой переменной. Константа $$Т1МЕ$$ возвращает формат 24 часов в виде HH:MI:SS, например 15:28:53 означает 15 часов 28 минут 53 секунды. Обе константы ($$DATE$$ и $$Т1МЕ$$) устанавли¬ ваются однажды в момент запуска утилиты RPT, так что время и дата вычисляются относительно этого момента.
362 Алфавитно-цифровая переменная. Такая переменная может содержать любой печатный символ. Она определяется специ- фикацией формата: Ап где п — число символов При исполнении отчета всем алфавитно-цифровым пере¬ менным присваивается значение NULL. Числовые форматы. Используйте для спецификации чис¬ ловых значений следующие символы: 9 Определяет каждую цифру числовой переменной. Ведущие нули не изображаются. . Определяет позицию десятичной точки в пределах числовой переменной. Эта позиция используется для арифметического выравнивания и изображается в выходных данных. , Включает запятую в выходные данные. Опускается, если слева от этой позиции нет цифр. $ Помещает знак доллара перед числом в выходных данных. MI Изображает знак минус справа от отрицательного числа. По умолчанию знак минус изображается только слева. PR Приводит к изображению переменной в угловых скобках ”< >”, когда она отрицательная. О Может использоваться вместо символа формата 9 для обозначения цифры. Обычно ведущие нули подавляются, но нуль в формате приводит к заполнению каждой цифровой позиции. V Определяет позицию десятичной точки в числовой переменной. Эта позиция служит для выравнивания в арифметических операторах, но десятичная точка не изображается в выходных данных. В Приводит к выдаче переменной в виде пробелов, если ее значение равно нулю. В табл. 16-3 представлены примеры числовых форматов.
363 Таблица 16-3. Примеры числовых форматов Формат Значение Изображение 999.99 56.478 56.48 999V99 56.478 5648 9,999 8410 8,410 9,999 639 639 99999 607 607 09999 607 00607 9999 -5609 -5609 9999MI -5609 5609 9999PR -5609 <5609> В999 564 564 В999 0 пробелы 99.99 124.981 ##.## 24.98 $99.99 45.23 $45.23 DATE 24414532 12/23/80 А5 Заказное Заказное А20 Заказное Заказное Если значение, восстанавливаемое из базы данных для этой переменной, больше, чем можно изобразить согласно данному формату, то будут изображены знаки фунта (#). Если переменная переполняется вследствие арифметической операции, то будет изображено усеченное значение. 2 Юлианский номер дня для 12/23/80. SET. Оператор SET устанавливает значение переменной равным указанному литеральному значению. SET <имя переменной><литеральное значение> где <имя переменной > — это любая ранее определенная программная переменная. <литералыюе значение> — это числовой или символьный литерал. Тип литерала должен соответствовать типу переменной. Специальный литерал $$DATE$$ можег служить для присваивания значения системной даты календарной переменной.
364 Например: .SET имя Смит устанавливает текущее значение переменной "имя" равным Смит. .SET номмагаз 13 устанавливает текущее значение числовой переменной ■номмагаз" равным 13. .SET сегодня $$DATE$$ устанавливает значение календарной переменной "сегодня" равным текущей дате. EQUAL. Оператор EQUAL установит значение одной перемен¬ ной равным значению другой переменной, причем обе переменные должны относиться к одинаковому типу данных. Например: .EQUAL сцелевая переменная><исходная переменная> Для символьных переменных значение <исходной переменной> будет усечено, если оно длиннее, чем значение < целевой переменной >, или заполнится пробелами, если оно короче. У числовых переменных, если формат <целевой переменнрй> содержит меньше десятичных позиций, то значение <исходной переменной> будет округлено. В отношении переполнения никаких специальных мер не принимается. Если значение <исходной переменной> не может храниться в пределах формата <целевой переменной>, ее значение будет усечено в целевой переменной. Операторы макроопределений В RPT существуют два типа операторов макросов: • макросы SELECT; • процедурные макросы. Макросы SELECT и процедурные макросы определяются одинаково. Утилита RPT будет распознавать их по способу их активизирования и по типу содержащихся в них операторов. DEFINE. Ниже мы покажем, что оператор DEFINE может применяться и для процедурных макросов, и для макросов SELECT. При исполнении этого оператора макрос будет заполнен для дальнейшего использования без выдачи в про¬ межуточный файл. Две точки (.,) в отдельной строке завершают макроопределение. DEFINE j <имя макроса SELECT> | | <имя процедурного макроса> |
365 Строки текста макроса где <имя макроса SELECT> — это имя определяемого макроса SELECT. <имя процедурного макроса > — это имя определяемого процедурного макроса. служит для указания конца макроопределения. Макрос SELECT. Макрос SELECT содержит только один запрос на языке SQL. Он может включать любое предложение SELECT или параметр, корректный в пределах оператора SELECT. В утилите RPT оператор на языке SQL может содержать максимум 2048 байт. Поскольку RPT удаляет из каждой строки оператора SQL головные, хвостовые и внутренние множествен¬ ные пробелы, то переформатирование оператора SELECT не изменит размер требуемого места в памяти. Вы должны включить в оператор SELECT предложение INTO (помимо обычных предложений языка SQL), чтобы специфи¬ цировать программную переменную, которая будет принимать значения столбцов, возвращаемые в предложении SELECT. Например, предположим, что в программе отчета определены три переменные А, В и С. Если бы исполнялся показанный ниже макрос SELECT с именем SAMPLE, то значения, возвращаемые для номмагаз, пимя и город, хранились бы соответственно в программных переменных А, В и С: DEFINE sample SELECT номмагазин, пимя, город INTO а, Ь, с FROM магазины, поставщики WHERE магазин.номпостав = поставщики.номпостав AND прибыль = 500000 Программная переменная должна относиться к такому же типу данных, что и столбец или выражение в предложении
366 SELECT. Вы можете определить в свободном формате предло¬ жение SQL. Вы можете подставить значение программной переменной для любого литерала, определенного в предложении WHERE или SELECT из запроса на языке SQL Однако, действуя таким образом, вы должны предпослать имени переменной знак &. Например: DEFINE БюджОтдел SELECT назвотд, место INTO оимя, мес FROM отд WHERE номотд = &номо Если выполнить этот пример при номо = 15, то значение 15 будет подставлено в предложении WHERE. Вы не можете включать в имя переменной символы подчеркивания (_). Подведем итог сказанному: результаты одного запроса могут храниться в программной переменной и служить в качестве подставляемой переменной в другом запросе. Этот прием может использоваться для конструирования запросов, которые порож¬ дают вложенные отчеты. Операторы исполнения макросов Исполнение процедурных макросов и макросов SELECT рассматривается ниже. Вы можете явно исполнить процедурный макрос в любом месте программы RPT, в том числе и из другого процедурного макроса. Вы должны определить именован¬ ный макрос в программе, прежде чем пытаться исполнить его. Именованный макрос исполняется посредством спецификации: <имя процедурного макроса> Например, оператор: .review приведет к исполнению процедурного макроса '’review". После исполнения такого макроса выполняется следующий оператор из последовательности. Существуют три процедурных макроса. Они соответствуют заголовку, телу и окончанию отчета. Вы можете явно исполнить макрос SELECT с помощью следующего оператора утилиты RPT. .EXECUTE <SELECT имя макроса> После исполнения этого запроса будет возвращена первая
367 строка. Значения из выбранных столбцов будут помещены в соответствующие программные переменные, как определяется предложением INTO. При таком способе исполнения запроса будет возвращена только первая строка таблицы. Если данный макрос исполняется снова, то весь запрос будет повторно обработан, но опять будет возвращена только одна строка. Таким образом, явное исполнение макросов SELECT полезно, когда вам нужна только одна строка. Автоматическое исполнение макросов SELECT рассматривается в следующем разделе, посвященном операторам REPORT. Операторы REPORT. Оператор REPORT приводит к авто¬ матическому исполнению макросов SELECT и процедурных макросов, которые генерируют большинство отчетов. В отличие от описанного выше оператора EXECUTE, оператор REPORT приведет к тому, что всякая строка будет возвращаться от обрабатываемого макроса SELECT. Процедурные макросы ис¬ полняются для каждой строки. Заголовок, тело и окончание представляют собой стандартные процедурные макросы и Moiyr содержать любой корректный оператор языка RPT. Другие макросы могут исполняться внутри этих. Процедурный макрос заголовка исполняется один раз в рамках оператора REPORT, когда возвращается первая строка. В этот макрос могут включаться заголовки столбцов, описа¬ тельный текст и заглавия отчетов. Поскольку процедурный макрос тела не исполняется для первой возвращаемой вами строки (если включен заглавный аргумент), вам следует либо исполнить макрос тела для части заголовка, либо выполнить другие перемещения для печати первой строки. Процедурный макрос тела исполняется для всех строк, со второй до последней. Если вы не специфицировали макрос окончания, то макрос тела будет исполнен и для последней строки. Функция этого макроса состоит в том, чтобы выдавать каждую строку данных в желаемом формате. Другие функции этого макроса могут относиться к накоплению итогов, поддер¬ жанию счетчиков или контролю разрыва страниц. Макрос окончания исполняется после завершения обработки последней строки для запроса. В этот макрос могут быть включены итоговые вычисления и примечания. Вы можете исполнить один или более операторов REPORT в пределах макроса заголовка, тела или окончания в операторе REPORT. При их исполнении будет возвращаться строка из
368 любого из них. Данные, восстановленные посредством несколь¬ ких команд SELECT, могут поступать из разных таблиц. Вы можете специфицировать множественные макросы SELECT с операциями AND или OR между ними. Операция AND указывает, что отчет следует исполнить только в том случае, если SELECT с обеих сторон от AND возвращают хотя бы одну строку. Операция OR специфицирует, что отчет следует исполнить, если SELECT хотя бы с одной стороны от OR возвращает хоть одну строку. (Если вы специфицируете SELECT в отчете только один раз и никаких строк не возвращается, то отчет не будет исполняться.) Если вы специфицируете два или более макроса SELECT, то аргумент для SELECT должен быть заключен в двойные кавычки, например "поставщик 1 AND поставщик 2". Формат оператора REPORT такой: .REPORT <макросы SELECTxмакрос тела> [<макрос заголовках макрос окончания:*] где < макросы SELECT > — это имена макросов SELECT, исполняемых для этого отчета. Если специфицированы два таких макроса, то они должны быть соединены операцией AND или OR и заключены в двойные кавычки. < макрос тела> — это имя макроса тела, который будет исполняться для возвращаемых строк со второй до последней. < макрос заголовка > — это имя макроса заголовка, который исполняется для первой возвращаемой строки. Этот параметр необязателен. < макрос окончания > — это имя макроса окончания, который исполняется после возврата последней строки. Этот параметр необязателен и может специфицироваться только в том случае, если специфицирован и макрос заголовка. Операторы управления программой Язык RPT включает операторы управления исполнением программы в рамках процедурного макроса. Такими операто¬
369 рами управления программой являются оператор метки, опе¬ ратор GOTO, оператор IF, оператор IFNULL и оператор STOP. Вне процедурного макроса может использоваться только опе¬ ратор STOP. Ниже описываются перечисленные операторы. Оператор определения метки. Синтаксис оператора опре¬ деления метки следующий: .&<имя метки> где <имя метки > — это имя, содержащее от 1 до 8 символов, причем первый символ является буквой; & — знак, служащий для указания программной переменной. Вы можете ссылаться на метку только в пределах макроса, в котором определили ее. Однако, поскольку определения меток не охватывают макросы, вы можете пользоваться одним и тем же именем метки более чем в одном макросе. Оператор GOTO. Оператор GOTO представляет собой безус¬ ловное ответвление к указанной метке. Его формат имеет вид GOTO <имя метки > где <имя метки > — это имя метки, определенной в текущем процедурном макросе. Оператор IF. Оператор IF приводит к ответвлению на указанный макрос в зависимости от результата определенного выражения. Его формат такой: .IF <выражение> THEN <метка 1> [ELSE <метка2>] где: <метка 1> означает, что если <выражение> вычисляется . как True (истина), то управление будет передано на <метку 1>. <метка 2> означает, что если <выражение> вычисляется как False (ложь), то управление будет передано на <метку 2>. Если компонент ELSE опущен, а выражение равно False, то исполняется следующий оператор из последовательности. <Выражение> может сравнивать значение программной
370 переменной с другими программными переменными или литеральными константами. Вы должны ставить перед именами программных переменных знак <&. Если вы опустите этот знак, то будет изображено сообщение "Invalid Column Name" (Непра вильное имя столбца). Оператор IF поддерживает полный набор операций отноше¬ ния, логических операций и арифметических операций, разре¬ шенных в предложении WHERE оператора языка SQL. Вы должны заключать символьные константы в одинарные кавычки. Все литеральные значения и программные переменные в выражении должны относиться к одному и тому же типу данных. Если литералы, программные переменные и операции отношения разделяются более чем одним пробелом, то все выражение должно быть заключено в двойные кавычки ("). Для программной переменной, используемой в выражении, не допускается значение NULL (пустое). Если значение равня¬ ется NULL, то программа огчета завершается. Во избежание этого вы должны инициализировать все переменные как нули или пробелы. Если вы присваиваете переменной значение из столбца базы данных, допускающей значения NULL, пользуй¬ тесь функцией NVL пустого значения для присваивания значения, отличного от NULL. Например, если переменная оклад используется в таком операторе IF: .IF доклад > 10000" THEN... то в макросе SELECT следует определить функцию NVL в списке SELECT: SELECT NVL(okh,0) INTO оклад FROM ... Это означает, что любые значения NULL будут установлены как нули. Если в выражении всякое значение равно NULL, то появится системное сообщение об ошибке "Неожиданное окончание оператора языка SQL". Рекомендации относительно операторов 1F. Поскольку об¬ работка операторов IF требует много времени, вам следует осторожно пользоваться такими операторами в отчете. Корпо¬ рация Oracle рекомендует избегать некоторых применений IF в длинных отчетах. Исполнение IF для каждой обрабатываемой строки может привести к существенному увеличению времени подготовки отчета, если обрабатывается много строк.
371 Для некоторых применений операторов IF вы можете успешно подставлять функции языка SQL, Например, чтобы вычислить максимальное и минимальное значения некоторой переменной по некоему диапазону строк, вы можете сравнивать каждое новое значение с прежними максимальным и мини¬ мальным значениями. Для этого требуются два оператора IF на каждую строку. Более эффективно было бы исполнять SELECT в окончании огчета с использованием функции MIN и МАХ языка SQL. Оператор IFNULL. Оператор IFNULL является эффектив¬ ным средством проверки на NULL программных переменных и иногда может исключить потребность в операторе IF. Формат оператора IFNULL имеет вид .IFNULL <имя переменной><имя метки> где <имя переменной > — это имя переменной, которую нужно проверить относительно того, пустое ли у нее значение. <имя метки > указывает, где RPT осуществил ветвление, если данная переменная равна NULL. Здесь нет предложения ELSE. Оператор STOP. Оператор STOP завершит исполнение программы отчета. STOP можно включить в раздел процедур или в процедурный макрос. Формат оператора STOP следующий: .STOP Если оператор STOP не включен, то программа завершит работу, исполнив свой последний оператор. Арифметические операторы RPT поддерживает сложение, вычитание, умножение и деление применительно к двум программным переменным. Соответствующие форматы принимают следующую форму: | ADD | | SUB | | MUL | <целев.пер.хисх.пер.1 ><исх.пер.2> I DIV | j DSUB j где
372 <целев.пер.> — это результат арифметической операции; <исх.пер.1> — это ранее определенная переменная; <исх.пер.2> — это ранее определенная переменная; DSUB означает вычитание одной календарной переменной из другой. Для всех арифметических операторов, кроме DSUB, вы можете подставлять числовой литерал вместо входных аргу¬ ментов <исх.пер.1> и <исх.пер.2>. Числовые значения определяются в табл. 16-3. Максималь¬ ное число, которое может храниться в переменной, определяется форматом, специфицированным в операторе DECLARE. Если результат арифметической операции переполняет <целев.пер.>, то цифры высокого порядка (начинающиеся слева) будут потеряны, причем не будет указано никакой ошибки. Эти цифры теряются и на выходе, и в последующих арифметических операциях. Например, если результат арифметической операции равен 456, а формат для <целее.пер. > имеет вид 99, то в < целее, пер. > сохранится 56, а цифра 4 более высокого порядка будет утеряна. Если дробная часть результата содержит больше цифр, чем определено в формате для <целев.пер.>, то цифры низкого порядка будут округлены. Например, если результат арифме¬ тической операции равен 45.576, а формат для < целее. пер.> имеет вид 99.99, то будет заполнено число 46.58. Для операции DIV, если число делится на нуль (<исх.пер.2> = 0), то появляется сообщение об ошибке "** DIVIDE BY ZERO X/Y **’’ (деление на нуль X/Y) и программа отчета прекращает работу. Оператор DSUB вычитает одну календарную переменную из другой, занося результат в некоторую числовую переменную. Вычисляется число дней между двумя датами. Например, если дата1 = 01/24/81, а дата2 = 12/25/80, то .DSUB результат дата! дата2 устанавливает значение результат = 30. Ни дата1, ни дата2 не может быть литералом. Разнородные операторы К ним относятся операторы PRINT, FPRINT, ASK и REM. Оператор PRINT. Он включает содержимое, указанное сис¬
373 темной переменной, в выходной промежуточный файл. Это единственный механизм включения в выходной отчет информа¬ ции из базы данных. Форматирование содержимого переменной будет выполняться в соответствии с форматом, определенным в операторе DECLARE. Формат оператора PRINT такой: .PRINT <имя переменной> Операторы PRINT могут чередоваться с командами языка RPF для обеспечения печати данных в различных столбцах табличного отчета. Оператор FPRINT. Подобно оператору PRINT, данный оператор выводит значения программных переменных в про¬ межуточный файл. Однако он иначе форматирует промежуточ¬ ный файл. Выдача всякой переменной выделяется пробелами в соответствии с ее описанным форматом. Кроме того, вы можете установить число пробелов между любыми выделенны¬ ми переменными, включив в список аргументов константу интервала. Эта константа интервала будет воздействовать на интервал между переменными для всех элементов из правой части списка. Если константа интервала равна нулю (0), то выдача переменных будет сочлененной. Этот оператор полезен только тогда, когда он используется внутри области действия литерала RPF, поскольку обычно RPF будет игнорировать любые интервалы. Формат этого оператора имеет вид .FPRINT [<интервал>] <имя переменной> [[<интервал>] [<имя переменной >]]... где < интервал > — число пробелов, которые вы хотите поместить впереди переменной. По умолчанию это нуль. Если вы опускаете предложение об интервале, то не будет включено никаких пробелов <имя переменной> — это имя переменной, которую нужно напечатать Оператор ASK. Он помещает сообщение на ваш терминал и позволяет вам ввести значение, которое должно быть присвоено указанной программной переменной. Оператор ASK дает вам возможность динамически управлять последователь¬ ностью действий и выдачей вашего отчета. Формат этого оператора такой:
374 .ASK •< сообщение >”< переменная > где <сообщение> — это сообщение от 1 до х символов, которое будет изображено на вашем терминале. Если сообщение содержит символы пробела, то текст сообщения должен быть заключен в двойные кавычки (") < переменная > — это имя программной переменной, значение которой будет установлено равным введенному вами значению данных. Введенное значение данных должно относиться к тому же типу, что и программная переменная. Если вы специфицируете числовую переменную, а введенные данные являются алфавитно¬ числовыми, то переменная устанавливается как нуль и не указывается никакой ошибки. Если специфицирована календарная переменная, то формат ввода имеет вид MM/DD/YY. Календарная программа проверит правильность введенной даты. Если дата неправильная, то вас попросят ввести данные заново Оператор комментария (REM). Данный оператор позволяет вам включать строки комментария в файл, содержащий текст программы. Вся строка текста, следующая за оператором REM, рассматривается как комментарий и игнорируется программой RPT. Оператор комментария не будет выводиться на промежу¬ точный файл. Формат этого оператора такой: .REM <текст комментария > Заключение Пакет SQL*Report состоит из двух программ: генератора отчетов RPT, который позволяет вам использовать в своих отчетах информацию из базы данных, и форматера отчетов RPF, позволяющего вам управлять окончательным видом формата вашего отчета. В этой главе приводятся подробные инструкции относительно работы с обеими программами.
17 Системы баз данных коллективного пользования Существуют три общих типа систем баз данных коллективного пользования: • разделяемый диск; • распределенные базы данных; • распределенная обработка. Далее мы знакомим читателя с возможностями каждого из этих трех типов систем. Дополнительную информацию вы найдете в документации и руководствах корпорации Oracle, где описываются такие протоколы связи, как SQL* *Star и SQL*NET. Вкратце эти варианты систем коллективного пользования можно охарактеризовать следующим образом: • В системе разделяемого диска два или более центральных процессора присоединяются к одному и тому же диску и поэтому получают доступ к одной и той же базе данных. Кроме того, эти процессоры могут и не иметь доступ друг к другу. Для такой системы требуется ряд блокировок замками, чтобы предотвратить попытки отдельных (или всех) пользователей одновременно вносить изменения в базу данных. • В распределенной системе сама база данных разделяется на части, каждая из которых располагается на отдельном
376 диске. Всякий центральный процессор пользователя имеет доступ только к части базы данных. • В системе распределенной обработки каждый из нескольких центральных процессоров или терминалов имеет доступ к одному и тому же (обычно очень большому) диску. Реализованные базы данных часто сочетают в себе две или более из перечисленных выше возможностей. Например, каж¬ дый пользователь системы может иметь доступ только к части базы данных, но способен соединяться с другими пользовате¬ лями через сетевую организацию. Это позволяет ему требовать доступа от другого пользователя, если он нуждается в обращении к той части базы данных, которая доступна другому пользователю. СУРБД Oracle может быть установлена с воплощением любого из этих трех типов систем коллективного доступа, а также большинства возможных комбинаций этих систем. Системы разделяемого диска В систегие разделяемого диска база данных находится на разделяемом дисководе, доступном двум или более центральным процессорам. Каждый экземпляр обладает своим собственным файлом INIT.ORA, однако все экземпляры, разделяющие этот дисковод, должны ссылаться на один и тот же файл (файлы) управления для параметра CONTROL_FILES. Это означает, что файл INIT.ORA не разделяется, а файлы управления разделя¬ ются разными экземплярами. Параметры INIT.ORA, начиная с GC (глобальный кэш), применяются преимущественно к системам разделяемого диска. Эти параметры следующие: GC_DB_LOCKS GC.ROLLBACK LOCKS GC_ROLLBACK SEGMENTS GC_SAVE ROLLBACK LOCKS GC_SEGMENTS GC_TABLESPACES К системам разделяемого диска также имеют отношение следующие параметры: INSTANCES BUFFER_LOCKS_REQUESTS LOG-ALLOCATION
377 В подобных системах каждый экземпляр может формировать базу данных в режиме SHARED (разделение) или же запуск экземпляра должен осуществляться в варианте SHARED с помощью команды: SQLDBA STARTUP SHARED Поскольку по умолчанию принимается режим EXCLUSIVE (монополия), то открытие базы данных без варианта SHARED означает, что никакой другой экземпляр не может открыть ее. Кроме того, если один экземпляр открывает базу данных в варианте SHARED, то всякий другой экземпляр должен открывать ее как SHARED. Экземпляр не может быть запущен, если не имеет доступа хотя бы к одному общему или частному сегменту обратной прокрутки (в любом табличном пространстве). Если админи¬ стратор базы данных хочет отвести сегмент обратной прокрутки исключительно одному экземпляру, то для этого экземпляра он должен выполнить следующие операции: 1. Ввести оператор CREATE ROLLBACK SEGMENT языка SQL. 2. Зарезервировать сегмент обратной прокрутки для этого экземпляра, назвав этот сегмент в файле INIT.ORA как значение для параметра ROLLBACK-SEGMENTS. (Сегмент обратной прокрутки должен быть назван только в одном файле INIT.ORA и поэтому ассоциируется только с одним экземпляром.) 3. Остановить и запустить экземпляр. Администратор базы данных или любой экземпляр может также создать PUBLIC (общие) сегменты, доступные всякому экземпляру. Если имеется неиспользуемый общий сегмент, то любой экземпляр может затребовать его и этот экземпляр окажется исключительным пользователем сегмента, пока не выключит его и не возвратит этот сегмент для использования другим экземпляром. Общие сегменты не нужно называть в каком-либо файле INIT.ORA. Независимо от того, сколько экземпляров разделяют базу данных, оперативно используется только один файл регистрации действий. Все экземпляры пишут в один и тот же файл регистрации, и поэтому когда один из них выходит за границы файла регистрации, все начинают писать в следующий файл регистрации. Для достижения эффективности каждому из экземпляров, разделяющих базу данных, отводится свой диа-
мазов (называемый размещением) текущего оперативного файла ре ги стр а цх х действ и й. Всякий файл ретютращш действий должен быть настолько велик, чтобы вмещать су rd му всех параметров LOG_ALLOCATION для всех экземпляров,, разделяющих эту базу данных. Корпорация Oracle рекомендует вюпочагь в LOG_A.LLOCATION хотя бн 1000 блоков и девать емкость каждого файла регистрации действий по крайней мере в 2000 раз больше числа экземпляров. Контрольные точки будут реализовываться поэкземплярно и могут быть разными для каждого экземпляра, имеющего доступ к регистрации действий. Для всякого экземпляра контрольная точка встретится, когда заполнится определенное количество страниц регистрации (указанное в параметре эк¬ земпляра для INIT.ORA) или когда будет отсчитано количество страниц, соответствующее интервалу контрольной точки, Кон¬ трольные точки будуг браться для всех экземпляров, когда заполнится оперативный файл регистрации. Когда вы создаете базу данных, устанавливается режим ARCHIVELOG или NOARCH1VELOG (для базы данных, но не для каждого экземпляра). Вы можете изменить эту установку, воспользовавшись командой ALTER DATABASE. Можно проводить архивизацию либо вручную, либо авто¬ матически, в любом случае архивизация должна направляться по одному и тому же адресу. Всякий экземпляр архивизируется индивидуально. Для систем с распределением диска восстанов¬ ление экземпляра может проводиться автоматически (за иск¬ лючением повторного запуска). Распределенные базы данных Вы можете пользоваться своей базой данных Oracle в конфигурации программного обеспечения, которая называется SQL*Star и поддерживает распределенную базу данных и распределенную обработку. (Распределенная обработка рассмат¬ ривается в следующем разделе.) СУРБД Oracle, Ваша система Oracle поддерживает распре¬ деленные базы данных, прозрачность местонахождения и автономность установки (все это описывается ниже). SQL*Connect. "Шлюзовый" продукт дня отличных от Oracle баз данных, например SQL/DL и DB2, который позволяет некоторым средствам Oracle функционировать с отличным от
379 Oracle базами данных так, как если бы это были базы данных Oracle. Используется в сочетании с SQL*Net. SQL*Net. Компонент из SQL*Star для интерфейса с сетью, который позволяет посылать данные через протоколы связи. Обрабатывает передачу данных между базами данных. Клиенты и обслуживающие устройства (серверы) В распределенной базе данных имеются клиенты и обслуга. Клиенты требуют информацию из другого узла. Этим другим узлом может быть прикладное средство или некоторый узел из базы данных. В роли клиента может выступать персональный компьютер, мини- или большой компьютер. Обслуживающими устройствами являются узлы, из которых требуются данные. Они могут представлять собой системы коллективного обслуживания, которые работают с многополь¬ зовательской системой Oracle. У любого узла может иметься много одновременно работающих транзакций, и поэтому он может быть клиентом и обслуживателем одновременно. Клиенты и обслуживающие устройства связываются пред¬ определенными сочленениями, называемыми связями базы данных, которые проводят запрос через базу данных и обратно. Клиенты берут на себя ответственность за исполнение приклад¬ ной программы, посылая операторы SQL на обслуживающие устройства через сеть. С другой стороны, обслуживающее устройство грамматически разбирает и исполняет такой опе¬ ратор и отсылает данные и значения, определяющйе состояние, обратно клиентам. Только у обслуживающего устройства воз¬ никает программная необходимость осуществлять грамматиче¬ ский разбор. Вы нуждаетесь в связи базы данных, принадлежащей клиенту базы данных, чтобы подсоединяться к базе данных с удаленного Узла. Связь базы данных идентифицирует ’’путь” от одной базы Данных к другой. Ей должны соответствовать пользовательское имя и пароль, корректные в базе данных обслуживающего Устройства. Связь базы данных может быть общей или частной. Общая связь базы данных позволяет любому пользователю в базе данных клиента подключаться к указанному обслуживаю¬ щему устройству. Частные связи базы данных создаются одним пользователем в базе данных клиента для сто исключительного пользования. Они более защищены, чем общие связи базы данных, потому
380 что словарь данных разрешит только конкретному пользователю работать с такой связью базы данных. Оптимизация производительности Администратор базы данных для системы распределенных баз данных должен заниматься такими же проблемами, как и для баз данных с одиночным процессором: скоростью ЦПУ, емкостью памяти, программным обеспечением и проектирова¬ нием базы данных, а также специальными проблемами воз¬ действия затрат на сетевые связи и размещения данных и программ в конкретных узлах сети. Причем проектирование баз данных, по-видимому, является наиболее важным, опреде¬ ления таблиц и представлений могут быть быстро и легко изменены, но внутренняя констукция базы данных будет влиять на всю систему и может потребовать далеко идущих исправ¬ лений сразу же после установки. Распределенная обработка Распределенная обработка происходит, когда вы пользуетесь одним центральным процессором для доступа к базе данных на другом центральном процессоре. Это позволяет использовать несколько различных типов аппаратуры, например персональ¬ ные компьютеры для быстрой, экономичной обработки и мини- ил и большие компьютеры с быстрым вводом/выводом и неограниченным пространством на диске для хранения данных. При таком подходе разделяемые данные могут управляться централизованно администратором базы данных, тогда как прикладные программы и средства обработки могут контроли¬ роваться локально. Применение Oracle и SQL*Net в распределенной обработке обеспечивает вам преимущества 1) локальной прозрачности, которая скрывает от вас базу данных, требуя, чтобы вы знали только имя желаемого вами объекта (В распределенной базе данных эта возможность есть, но при распределенной обработке ее может не быть.) и 2) местной автономии, которая означает, что каждая база данных в системе распределенных баз данных может администрироваться независимо от остальных баз данных SQL*Net также позволяет вам выполнять распределенные запросы. Они могут содержать ссылки на данные не только из тех узлов, где вы входили в систему. Вы можете также выдавать
381 запросы с требованием данных из одиночных или множест¬ венных узлов и определять представления, используя таблицы по разным узлам. Однако в настоящее время Oracle и SQL*Net не позволяют вам выдавать через узлы команды обновления, удаления, вставления или команды ЯОД. Вы можете делать это только в том узле, где входите в систему. Заключение В этой главе определяются три общих типа систем баз данных коллективного пользования: распределение диска, рас¬ пределенные базы данных и распределенная обработка. Рас¬ сматриваются их применения с СУРБД Oracle.
1 Проекция, соединения, функциональные зависимости и нормализация В этой главе рассматриваются основные понятия, необходимые для понимания нормализации, которая служит для сокращения избыточности и усиления некоторых ограничений целостности. Сравниваются два метода нормализации баз данных, называемые синтезом и декомпозицией. Стимулирумые нормализацией ог¬ раничения целостности возникают вследствие функциональных зависимостей, которые объясняются в этой главе. Избыточность, т. е. повторение одинаковой информации снова и снова, может значительно расширить базу данных сверх необходимости и в результате существенно снизить ее произ¬ водительность. Избыточность возникает тогда, когда таблица содержит столбцы, в которых одни и те же значения много¬ кратно повторяются. Например, если у вас имеется таблица продаж, в которой вы повторяете имя продавца при каждой продаже, то на сотни повторений этого имени уйдет без всякой надобности много памяти. Избавиться от избыточности можно, разбив информацию
383 на две или более таблицы, в которых информация появляется лишь однократно, и соединяя таблицы общими столбцами. Разбиение таблиц аналогично делению, и в реляционной алгебре оно называется проекцией (см. следующий раздел). Чтобы снова собрать информацию воедино для запросов, таблицы нужно согласовать по общим столбцам. В реляционной алгебре согласование по общим столбцам таблиц, которые до этого были разбиты, называется естественным соединением. См. раздел с подобным названием. Естественное соединение ана¬ логично умножению. Таким образом, нормализация представ¬ ляет собой теоретический метод исключения избыточности за счет разбиения таблиц. В этой главе мы пользуемся взаимозаменяемыми терминами "имя столбца" и "атрибут". В действительности точное значение этих терминов различается. Атрибут представляет собой хорошо определенное и ограниченное множество значений, которые служат для описания конкретных объектов, например продаж. Имя столбца, например продажа, является именем некоторого атрибута. Проекция Нормализуя базу данных, вы разбиваете таблицы на меньшие с несколькими атрибутами. Соответствующая операция реля¬ ционной алгебры называется проекцией. Проекция — это реляционная операция над таблицами, при которой вы сохраняете некоторые (но не все) столбцы и исключаете из них повторяющиеся строки. Например, рассмот¬ рим данные служащих, сведенные в табл. 18-1. Если вы исключите все столбцы, кроме служ_город и служ_оклад, то получите табл. 18-2. Таблица 18-1. Таблица служащих Слухс_ Слухе _имя Ном Служ_улица Служ_город Служ_ оклад 10 Джон Джойс 1011 Walnut Чикаго 20 000 11 Билл Смит 2012 Cherry Денвер 35 000 12 Мэри Уилк 1412 Munroe Чикаго 20 000 13 Джо Бернс 2515 Ash Чикаго 25 000
384 Таблица 18-2. Промежуточная таблица Служ_город Служ_рклад Чикаго 20 000 Денвер 35 000 Чикаго 25 000 Чикаго 25 000 Исключение повторяющихся строк приводит к появлению табл. 18-3, которая представляет собой проекцию табл. 18-1 на столбцы служ_город и служ_оклад. Таблица 18-3. Проекция таблицы служащих но служ_город и служ_оклад служ_город служ_о клад Чикаго 20 000 Денвер 35 000 Чикаго 25000 Завершим этот раздел еще двумя примерами проекций, которые будут служить для иллюстрации соединений в следующем разделе. Если вы спроектируете табл. 18-1 на служ_улица и служ_го- род, то получите табл. 18-4. Проектирование табл. 18-1 на служ_ном, служ_имя и служ_улица дает табл. 18-5. Таблица 18-4. Проекция таблицы служащих на служ_улица и служ_город служ_город 1011 Walnut Чикаго 2012 Cherry Денвер 1412 Munroe Чикаго 2515 Ash Чикаго
385 Таблица 18-5. Проекция таблицы служащих на служ_ном, служ_имя и служ_улица Служ_ном Служ_имя С луж_улица 10 Джон Джонс 1011 Walnut 11 Билл Смит 2012 Cherry 12 Мэри Уилк 1412 Munroe 13 Джо Бернс 2515 Ash Естественные соединения Естественные соединения (называемые в этой главе соеди¬ нениями) являются противоположностью проекций аналогично тому, как противоположны операции деления и умножения. Если вы нормализуете свою базу данных проектированием на таблицы с меньшим числом атрибутов, то будете иногда нуждаться в том, чтобы снова соединять таблицы для получения ответов на запросы. Когда вы соединяете две или более таблиц, то делаете это, согласовывая строки в общих строках. Например, соединение табл. 18-3 и 18-4 представлено в табл. 18-6. Таблица 18-6. Соединение табл. 18-3 и 18-4 Службу лица Служ_город С луж_оклад 1011 Walnut Чикаго 20 000 2012 Cherry Денвер 35 000 1412 Munroe Чикаго 20 000 2515 Ash Chicago 20 000 1011 Walnut Чикаго 25000 1412 Munroe Чикаго 25 000 2515 Ash Чикаго 25 000 Замечание. Порядок строк в таблице несуществен для определения таблицы. Две таблицы с одинаковыми строками в разном порядке считаются эквивалентными. Первая строка в табл. 18-6 образуется из аналогичных строк Табл. 18-3 и 18-4. Пятая строка табл. 18-6 получается из третьей
386 строки табл. 18-3 и первой строки табл. 18-4. Остальные строки получаются аналогично. Соединяя табл. 18-5 с табл. 18-6, вы получаете табл. 18-7. Таблица 18-7. Соединение табл. 18-5 и 18-6 Служ_ ном . Служ_имя Служ_улица Служ_город Служ_ оклад 10 Джон Джонс 1011 Walnut Чикаго 20 000 11 Билл Смит 2012 Cherry Денвер 35000 12 Мэри Уилк 1412 Munroe Чикаго 20 000 13 Джо Бернс 2515 Ash Чикаго 25000 10 Джон Джонс 1011 Walnut Чикаго 25 000 12 Мэри Уилк 1412 Munroe Чикаго 25 000 13 Джо Бернс 2515 Ash Чикаго 20 000 Заметим, что табл. 18-7 содержит четыре строки из табл. 18-1 плюс три дополнительные строки содержат неверные значения оклада. Этот результат называется ложным соединением. Ложное соединение возникает всякий раз, когда результат соединения проекцией содержит больше строк, чем было в исходной таблице. Поскольку данные в дополнительных строках ложного соединения отличаются от данных, первоначально включенных в базу данных, то ложное соединение никогда не является желательным результатом. База данных ’’нормализуется” разбиением больших таблиц на меньшие посредством проекций. После этого данные можно восстанавливать из меньших таблиц. Если желаемые данные находятся более чем в одной из меньших таблиц, вы должны соединить эти таблицы между собой, чтобы получить ответ на свой запрос. Ложное соединение может сделать невозможным распознавание исходных данных. Например, невозможно ска¬ зать на основании табл. 18-7, равняется ли оклад Джо Бернса 20 000 или 25 000. Очень важно избегать ложного соединения. Метод предотвращения ложных соединений показан в разд "Получение универсального ключа”.
387 Функциональная зависимость Для выполнения алгоритмов нормализации вы нуждаетесь в ряде функциональных зависимостей. Функциональные зави¬ симости устанавливают, какими атрибутами определяются другие атрибуты. Из сказанного ниже станет ясно, что иногда полезно во избежание избыточности изобретать новые атрибуты для указания протяженности строк символов, так чтобы эти занимающие много места в памяти строки символов появля¬ лись в нормализованной базе данных только по одному разу. Функциональная зависимость существует, когда один или более столбцов в вашей базе данных уникально определяют один или более других столбцов. Например, "служащий” уникально определяет "оклад”, доступный бюджет уникально определяет сумму, получаемую по этому бюджету. Мы будем употреблять стрелку -► вместо термина "определяет”. Так, имеет место отношение служащий -► оклад. Могут понадобиться два или более столбца, чтобы уникально определить другой столбец или столбцы. В таком случае мы перечисляем определяющие столбцы слева от стрелки, а определяемые столбцы — справа от стрелки. Набор атрибутов, перечисленных слева от стрелки, называ¬ ется "левой стороной" (левой частью), а набор атрибутов справа от стрелки называется "правой стороной" (правой частью) функциональной зависимости. Из определения функциональной зависимости очевидным образом следует, что нет надобности в том, чтобы какой-нибудь атрибут появлялся более чем один раз с какой-либо стороны от стрелки, а также, что порядок появления атрибутов с одной стороны от стрелки не имеет никакого значения. Более точно функциональная зависимость определяется так. Если заданы два подмножества X и У атрибутов для R, то подмножество Y называется "функционально зависящим" от X, если значения X уникально определяют значения Y. Иначе говоря, если вы знаете значения всех атрибутов из множества X, то знаете уникально значения всех атрибутов из множества Y. Сказанное означает, что вы можете вычислить значения столбцов из Y на основании значений столбцов из X. Иначе можно представить себе функциональные зависимо¬ сти, рассматривая атрибуты с левой стороны от стрелки как уникальный ключ для таблицы, состоящей из атрибутов с обеих
388 сторон от стрелки. Если атрибуты с левой стороны не образуют уникальный ключ для таблицы, состоящей из атрибутов с обеих сторон от стрелки, то у вас нет функциональной зависимости. Например, рассмотрим номер социальной страховки. Если ваша база данных должна представлять сведения о людях, то полезно включить номер социальной страховки в качестве одного из атрибутов, потому что этот номер является уникаль¬ ным ключом почти для всех других атрибутов, и вы можете написать: Номер социальной страховки -+ имя, адрес... Однако номер социальной страховки служащего не является уникальным ключом для имен детей служащих. Поэтому вы не можете поместить ребенок_имя в правую часть приведенной выше функциональной зависимости. Иногда бывает полезно создавать уникальные ключи для определенных атрибутов и совокупностей атрибутов. Например, вы можете использовать номера для обозначения имен, получая в результате следующую функциональную зависимость: Имя_ном - имя Этот подход может принести большую пользу, если ваша база данных содержит порядочно имен. Например, если ваша база данных содержит все имена из телефонного справочника, то вы можете употреблять некоторый номер для обозначения каждого последнего имени и другой номер для обозначения каждого первого имени. Таким образом, вы можете впечатля¬ юще сократить объем памяти, требующейся для имен. В системе Oracle вы можете использовать некую таблицу имен, а потом пользоваться последовательными номерами (см. в гл. 2 описание генератора последовательности) для ссылок на имена. Правила вывода Существуют несколько хорошо известных правил вывода для манипулирования наборами функциональных зависимостей с целью полуюния других функциональных зависимостей. Получаемые посредством правил вывода функциональные за¬ висимости должны иметь место, если справедливы исходные функциональные зависимости. При написании этих правил вывода мы обозначаем множества атрибутов прописными буквами W, X, Y и Z. Благодаря этому вы можете подставлять
389 вместо каждой буквы W, X, Y или Z фиксированное множество атрибутов и продолжать вывод. Таким образом, использование букв для обозначения множеств атрибутов позволяет представ¬ лять одним выражением бесконечное количество выводов сходного типа. Правила вывода таковы: Ri: Рефлексивность: Для любого X, X -> X Кг: Расширение: Если X -* Y, то для любого W верно X,W -* Y Кз: Аддитивность: Если X - Y и X -♦ Z, то X -* Y,Z R4: Проективность: Если X -> Y,Z, то X -* Y Rs: Транзитивность: Если X -> Y и Y - Z, то X -> Z Кб: Псевдогранзитивность: Если X - Y и Y,Z -> W, то X,Z - W Из этих можно вывести другие правила вывода. Например, если X — подмножество из Y, a Z — множество атрибутов, принадле¬ жащих Y, но не принадлежащих X, мы имеем согласно правилу R1, что X - X и поэтому, согласно правилу R2, X,Z - X. Заменяя X,Z на Y (что обозначает то же самое множество атрибутов), получаем Y -* X. Таким образом, в общем случае любое подмножество атрибутов функционально зависит от этого множества атрибутов. Два множества F и G функциональных зависимостей "эквивалентны”, если всякая функциональная зависимость из G может быть выведена из функциональных зависимостей из F и всякая функциональная зависимость из F может быть выведена из функциональных зависимостей из G. Когда множества F и G эквивалентны, говорят, что каждое из них является ’’покрытием" для другого. Минимальным покрытием для множества F функциональных зависимостей является такое покрытие G для F, что если какая-либо функциональная зависимость удаляется из G, то результат перестает быть эквивалентным множеству F. Описываемый в этой главе алгоритм синтеза для нормализации начинается с вычисления минимального покрытия для ваших функциональных за¬ висимостей.
390 Нормальные формы Кодд [1 — 3] впервые предложил первые три нормальные формы и нормальную форму Бойса-Кодда. Определялись и изучались также некоторые другие нормальные формы, нс однако они выходят за рамки этой книги. Первая нормальная форма База данных представлена в первой нормальной форме, если всякий столбец в любой таблице является "атомным”. Термин атомный означает, что речь идет о единственном предмете, а не о списке. Например, если у вас в одной из ваших таблиц имеется столбец дети_имена для детей ваших служащих, то эта таблица не относится к первой нормальной форме, потому что данный столбец может содержать списки детей служащих. Некоторые авторы считают, что первая нормальная форма является предпосылкой для того, чтобы база данных была реляционной. Первая нормальная форма совсем непохожа на вторую и третью нормальные формы, которые основываются на функциональных зависимостях. Атрибуты Ключи часто содержат более чем по одному атрибуту. Если какой-то атрибут входит в некий ключ, он называется первичным атрибутом. Атрибут А "транзитивно зависит от ключа" К, если существует совокупность атрибутов Y, для которой выполняются условия: • К функционально не зависит от Y; • А функционально зависит от Y; • А не входит в множество К или в множество Y. Согласно условию 1, Y не является ключом, потому что в противном случае любой атрибут из К функционально зависел бы от Y, а поэтому множество К функционально зависело бы от Y. Атрибут А может быть первичным, потому что он может содержаться в некотором ключе К’, отличающемся от К. Поскольку К является ключом, каждый атрибут из Y функци¬ онально зависит от К, и поэтому Y функционально зависит от К. Итак, мы имеем К - Y и Y -* А. Поэтому можно написать К -* Y -* А для обозначения того, что "А функционально зависит от ключа К через Y".
391 Мы закрепляем обозначение К -> Y -> А для тех случаев, когда К, Y и А удовлетворяют условиям 1, 2 и 3. Так, например, мы не можем написать К -» К -> К несмотря на истинность отношения К -► К. Более высокие нормальные формы Определения второй, третьей нормальной форм и нормальной формы Бойса-Кодда основываются на отсутствии транзитивных зависимостей. Третья нормальная форма более ограничительна по сравнению со второй, а Бойса-Кодда — по сравнению с третьей. Вторая нормальная форма требует, чтобы для всякой таблицы Т не существовало никаких транзитивных зависимо¬ стей К -* Y -* А в Т, где Y — подмножество множества К, а А — не первичный атрибут. Третья нормальная форма требует, чтобы для всякой таблицы Т не существовало никаких транзитивных зависимостей К -► Y А в Т, где А — не первичный атрибут, вне зависимости от того, является ли Y подмножеством множества К или нет. Нормальная форма Бойса-Кодда требует, чтобы для всякой таблицы Т не существовало никаких транзитивных зависимо¬ стей К - Y - А вне зависимости от того, является ли атрибут А первичным или нет. Проверка на принадлежность к нормальным формам не проста, если только сама база данных не является совсем простой. Для каждой таблицы в базе данных вы должны найти все ключи. Затем вы должны сопоставить все подмножества Y столбцов таблицы, которые не являются ключами и не содержат ключей, со столбцами А, не принадлежащими множеству Y, чтобы проверить, имеет ли место отношение Y -> А. Если существуют такие Y и А, причем А — не первичный атрибут, то таблица (а следовательно, и база данных) либо не принад¬ лежит ко второй нормальной форме, либо не принадлежит к третьей нормальной форме в зависимости от того, является ли Y подмножеством какого-то ключа. Если атрибут А всегда первичный для любых таких Y и А, то таблица относится к третьей нормальной форме, но не к нормальной форме Бойса-Кодда. Поскольку для этого процесса требуется проверка почти всех подмножеств атрибутов для таблицы, то понадобится примерно 2п операций, где и — число атрибутов в таблице. При больших значениях п величина 2п может быть очень большой. Например,
392 210 равняется 1024, 220 = 1024*1024, что превышает миллион, 250 превышает единицу с пятнадцатью нулями и т. д. Если у вас имеется транзитивная зависимость К -> Y -> А, вы можете исключить ее, разбив таблицу на две таблицы. Пусть Z — это подмножество всех атрибутов таблицы, которые не принадлежат К, не принадлежат Y и не равны А. Тогда вы можете образовать одну из двух таблиц проектированием на атрибуты из К, Y и Z и представить вторую таблицу как проекцию на Y и А. Этот метод достижения нормальных форм называется декомпозицией. Например, если у вас есть таблица со столбцами НСС (для номера социальной страховки), служ_имя, ребенок_ном, ребе¬ нок—имя и функиональными зависимостями НСС -> служ_имя и НСС, ребенок_ном -> ребенок_имя, то имеется транзитивная зависимость: НСС, ребенок_ном -> НСС -> служ_имя Поскольку слуЖ-Имя не содержится в каком-либо ключе, служ-имя не является первичным атрибутом, и поэтому таблица не принадлежит ко второй нормальной форме. Чтобы исключить транзитивную зависимость, разложите декомпозицией таблицу на две таблицы: Т1 с тремя столбцами НСС, ребеноК-Имя и ребенок_ном и другая таблица Т2 с двумя столбцами НСС и служ_имя. Поскольку в таблице Т2 только два столбца, она представлена в нормальной форме Бойса-Кодда. В таблице из двух столбцов не может быть никаких транзи¬ тивных зависимостей. Вам следует проверить, что таблица Т1 относится тоже к нормальной форме Бойса-Кодда. Так как нормальная форма Бойса-Кодда является наиболее ограничи¬ тельной нормальной формой, то таблицы Т1 и Т2 относятся также ко второй и третьей нормальным формам. Усиливаемое™» и полнота Помимо нормализованное™ существует еще одно свойство, весьма желательное для базы данных. Вам хотелось бы быть в состоянии "усиливать” все функциональные зависимости, описывая уникальные индексы для некоторых из ключей для ваших таблиц. (Уникальные индексы должны представлять собой сочленения из непустых столбцов.) Если все заши функциональные зависимости усиливаются таким образом, вы
393 пытаетесь вставить в свои таблицы данные, которые нарушили бы одну или более функциональных зависимостей, то система Oracle возвратит сообщение об ошибке. Для усиления всех функциональных зависимостей необхо¬ димо только усилить минимальное покрытие для функцио¬ нальных зависимостей. См. определение покрытия в разд. "Правила вывода". При некоторых множествах функциональных зависимостей вы можете оказаться не в состоянии достичь и усиливаемое™, и представления в нормальной форме Бойса-Кодда. Однако вы всегда можете найти какое-то множество таблиц, удовлетворя¬ ющих следующим трем условиям: • все таблицы относятся к третьей нормальной форме; • все функциональные зависимости усилены ключами; • имеется наименьшее число таблиц, такое что все они принадлежат к третьей нормальной форме и все функ¬ циональные зависимости усилены. Если ваша база данных удовлетворяет этим трем требова¬ ниям, она называется полной. Существует алгоритм, который выводит полную базу данных из множества функциональных зависимостей. Он называется синтезом. Хотя синтез кажется более сложным алгоритмом, чем декомпозиция, его "сложность по времени гораздо лучше". Синтез может быть запрограммирован так, чтобы работать за время, пропорциональное квадрату общей длины функциональ¬ ных зависимостей, где длина функциональной зависимости представляет собой число атрибутов, появляющихся в этой функциональной зависимости. Поскольку результат синтеза удовлетворяет критериям усиливаемое™ и минимальности, а также третьей нормальной форме, то синтез обычно более предпочтителен, чем декомпозиция. Основная связанная с синтезом проблема, которая может быть разрешена, состоит в том, что соединения по результи¬ рующей базе данных могут оказаться ложными. Например, предположим, что в вашей базе данных имеются четыре столбца А, В, С и D и только такие функциональные зависимости: Fi*. А -* В и F2: В,С -» D В примере столбец А может состоять из целых чисел от 1 до 4 включительно. Пусть В — остаток от деления А на 3.
394 Пусть С — любое целое число, a D — произведение В и С. Возможна такая таблица: Таблица 18-8. Пример А А В с D 1 1 1 1 4 1 2 2 Функциональные зависимости Fi и F2 приводят только к одному ключу А,С -* В,С - D. Декомпозиция дает две таблицы: табл. 18-9 (А, В, С) и табл. 18-10 (В, С, D). Таблица 18-9. Проекция примера А на А, В и С А В С 1 1 1 4 1 2 Таблица 18-10. Проекция примера А на В, С и D в с D 1 1 1 1 2 2 Соединением табл. 18-9 и 18-10 является табл. 18-8. Декомпозиция не приводит к ложным соединениям. Однако табл. 18-9 и 18-10 не обеспечивают какого-либо способа усиления функциональной зависимости Fi, потому что един¬ ственным ключом для табл. 18-9 является А, С. Функциональная зависимость F2 может быть усилена уни¬ кальным индексом по столбцам В и С, который является единственным ключом для табл. 18-10. Синтез приводит к двум схемам Si: А, В и S2: В, С и D. Если вы проектируете табл. 18-8 на Si и S2, то результатами будут соответственно табл. 18-11 и 18-12.
395 Таблица 18-11. Проекция экземпляра А на А и В А в 1 4 1 Таблица 18-12. Проекция экземпляра А на В, С и D в с D 1 1 1 1 2 2 Схема Si позволяет усилить Fi, но в результате соединения табл. 18-11 и 18-12 получается табл. 18-13, которая отличается от табл. 18-8. Иначе говоря, в этом случае результатом синтеза является ложное соединение. Таблица 18-13. Соединение табл. 18-11 и 18-12 А в с D 1 1 1 1 1 1 2 2 4 1 1 1 4 1 2 2 Решение проблемы ложных соединений состоит в том, чтобы добавить схему, которая содержит ’'универсальный ключ", и включить ее в соединение. Универсальным ключом является ключ для всех атрибутов. Такой схемой для Fi и F2 служит S3: А, С. Если вы проектируете табл. 18-8 па S3, то получаете табл. 18-14. Таблица 18-14. Таблица универсального ключа для примера А А С 1 1 4 2
396 Если вы соедините табл. 18-13 и 18-14, то получите табл. 18-8, потому что вторая и третья строки из табл. 18-13 не участвуют в соединении. Предположим, что вы хотите найти соединение табл. 18-11, 18-12 и 18-14 и изобразить только столбцы А и D. Тогда вы можете воспользоваться следующим запросом на языке SQL: SELECT A, D FROM (таблица 18-12) U WHERE EXISTS ( SELECT A, C FROM (таблица 18-14) V WHERE T.A = V.A AND U.C = V.C; Предположим, что А, В, С и D являются атрибутами для школы. Пусть А — имена детей, В — район местоположения школы, С — возраст детей и D — школа, которую они посещают. Тогда выполняются функциональные зависимости Fi и F2, но, кроме того, вы имеете: F3: А - С Применив аддитивность (см. разд. "Правила вывода") к Fi и F3, вы получаете F4: А -*• В, С Применив транзитивность к F2 и F4, получаете F5: А - D Применив аддитивность к F4 и F5, получаете F6: А - В, С, D Следовательно, А является универсальным ключом. У вас имеется транзитивная зависимость: А -► В, С -+ D С добавлением функциональной зависимости F3 декомпо¬ зиция и синтез дают реляционные схемы А, В, С и В, С, D. Поскольку схема А, В, С содержит универсальный ключ А, то нет ложного соединения. Функциональные зависимости Fi и F3 усиливаются схемой В, С, D с ключом В, С. Алгоритм синтеза В этом разделе мы кратко описываем алгоритм синтеза для получения сложной базы данных. Мы не углубляемся в подробности такого программирования алгоритма, при котором он выполняется за время, пропорциональное п2. За этой информацией советуем вам обратиться к публикации Мейера (ссылка [4] в конце этой главы)
397 Составные функциональные зависимости Для алгоритма синтеза требуются составные функциональ¬ ные зависимости, которые будут описаны в этом разделе. Составная функциональная зависимость представляет собой выражение с таким синтаксисом: (Xi;X2;...;Xn)-Y Здесь Xi и Y — множества атрибутов. ’’Левой частью” составной функциональной зависимости является часть внутри скобок слева от стрелки. ’Правая часть" -^это Y. Если стрелка и Y опущены, то выражение остается составной функциональной зависимостью, но подразумевается, что множество Y пустое. С каждой составной функциональной зависимостью мы ассо¬ циируем следующее множество функциональных зависимостей: Xi -> Х2 Х2 -> Хз X„.i -> х„ Хп -* Xi,Y Если стрелка и Y исключены из составной функциональной зависимости, то соответствующее множество функциональных зависимостей остается прежним, за исключением того, что Y исключается из последней ассоциируемой функциональной зави¬ симости, т. е. эта функциональная зависимость становится такой: Хп - Xi Если С — это множество составных функциональных зависимостей, то мы будем обозначать через fd(C) множество всех функциональных зависимостей, соответствующих состав¬ ным функциональным зависимостям из С. Поэтапный синтез Если задано множество F функциональных зависимостей, то первые три этапа алгоритма синтеза сводят F тремя способами: Этап 1: Отыскание минимального покрытия Fi для F. Этот этап может быть выполнен удалением элементов из Множества F одного за другим и проверкой, может ли удаляемая функциональная зависимость быть выведена из оставшихся функциональных зависимостей. Если да, то удалите ее и испытайте следующую. Например, если F содержит А В, В -* С и А С, то вы можете удалить А С, потому что эта
398 функциональная зависимость может быть выведена из двух других по транзитивности. Этап 2: Сокращение слева элементов из Fi дня получения F2. Для выполнения этого этапа удаляйте атрибуты один за другим из левой части функциональной зависимости и про¬ веряйте, может ли получающаяся в результате функциональная зависимость быть выведена из исходных функциональных зависимостей. Если да, то замените исходную функциональную зависимость на новую и продолжайте. Например, если Fi содержит А -> В, В -* А и А,В -* С, то вы можете удалить либо А, либо В из А,В - С, потому что или А -► С, или В -> С выводится из А -> В, В -♦ А и А,В - С. Для того чтобы убедиться в выводимости А -* С из исходных функциональных зависимостей, отметим, что поскольку А А, то А -> А,В выводится в силу А -* В и аддитивности. Затем А -> С выводится из А -* А,В и А,В -* С по транзитивности. Этап 3: Сокращение справа элементов из F2 для получения F3 На этом этапе атрибуты удаляются по одному с правой стороны каждой функциональной зависимости из F2. Если прежняя функциональная зависимость может быть выведена из новой функциональной зависимости наряду с остальными функциональными зависимостями, то замените прежнюю функциональную зависимость на новую и продолжайте. Например, если вы имеете А -* В,С и В -* С, то можете удалить С с правой стороны из А -> В,С, потому что можно вывести А-»СизА->ВиВ->Спо транзитивности, а далее А В,С следует изА-*ВиА->Спо аддитивности. Эти три этапа завершают сокращение функциональных зависимостей. Следующие два этапа предназначаются для получения минимального количества функциональных зависи¬ мостей из F3 комбинированием функциональных зависимостей при определенных условиях. Этап 4: Разделение F3 на такие группы функциональных зависимостей, что две функциональные зависимости находятся в одной и той же группе тогда и только тогда, когда их правые стороны эквивалентны. Например, если А -> В, В -> А, А,С -* D и В,С -* Е, то. поскольку А и В эквивалентны, А -* В и В -> А находятся в одной группе, А,С и В,С эквивалентны в силу расширяемости и аддитивности, а следовательно, А,С -> D и В,С -* Е принадлежат одной и той же группе.
399 Этап 5: Для всех пар функциональных зависимостей Fdi и Fdj из одной и той же группы проверьте, может ли функцио¬ нальная зависимость левой стороны Fdi от левой стороны Fdj быть выведена из функциональных зависимостей не из этой группы. Если да, удалите Fdj и добавьте правую часть этой функциональной зависимости к правой стороне Fdi. Новая функциональная зависимость останется в той же группе, в которой находились две исходные функциональные зависимо¬ сти. Результат этого этапа состоит в получении минимального количества функциональных зависимостей, покрывающего F3, а следовательно, и F. Пусть F5 обозначает множество функци¬ ональных зависимостей, получающееся на этом этапе. Так, в примере, приведенном для этапа 4, функциональная зависимость А,С -> В,С выводится с применением функцио¬ нальных зависимостей А -♦ В и В -* А, которые находятся не в той же группе, что и А,С -♦ D и В,С -» Е. Таким образом, А,С -► D и В,С -> Е могут быть заменены на В,С -> D,E. Этап 6: Для каждого множества функциональных зависи¬ мостей с эквивалентными левыми частями из F5 создайте составную функциональную зависимость (Xi;...;Xn) -* Y, где Х1,...Хп -- это эквивалентные левые части функциональных зависимостей из группы, a Y — множество атрибугов, которые появляются в правых частях функциональных зависимостей в группе. Если какой-либо атрибут из Y появляется в каком-то Xi, то удалите его из Y. Пусть Ci обозначает множество всех созданных составных функциональных зависимостей. Так, в примере под этапом 5 в результате получаются составные функциональные зависимости (А;В) и (В,С) -* D,E. Этап 7: Для всякой составной функциональной зависимости из Ci и каждого Xi из левой части с сдвиньте Xi в правую часть с, чтобы сформировать с’. Пусть С’ — это Ci с заменой с на с’. Если fd(C’) и fd(Ci) эквивалентны, то замените Ci на С’ и продолжайте тестировать остальные элементы левых частей составных функциональных зависимостей из С’. Обозначим через С2 множество составных функциональных зависимостей, которые получаются на этом этапе. Например, предположим, что имеется составная функциональ¬ ная зависимость с = (А;В;А,В) -* С. fd(c) равняется {А -* В, В А,В, А,В - А,С}. Если вы сдвигаете А,В в правую часть с для получения с’ = (А;В) -* С, то fd(c’) равняется {А -> В, В А,С}, (Вы можете удалить А и В из правой части с, потому
400 что они появляются в левой части с’.) Поскольку В -* А,В и А,В -> А,С выводимы из fd(c’), то вы можете заменить с на с’. Этап 8: Для всякой составной функциональной зависимости с из С2 и для каждого атрибута А из правой части с удалите А, чтобы получить с’. Пусть С’ обозначает С2 с заменой с на с’. Если fd(C’) и fd(C2) эквивалентны, то замените С2 на С’. Обозначим через Сз множество составных функциональных зависимостей, которые получаются на этом этапе. Например, предположим, что С2 = {(А;В;С) -* D, (В) -* D}. Тогда fd(C2) = {А -► В,С, В,С A,D, В -* D}. Удалив D из правой части (А;В;С) -> D , чтобы получить С’ = {(А;В;С), (В) -» D}, вы имеете fd(C’) = {А -> В,С, В,С -> А, В -* D}. Поскольку В,С -> A,D выводится из В,С -> А и В -» D, вы можете заменить С2 на С’. Этап 9: Для всякой составной функциональной зависимости с из Сз формируется таблица из атрибутов, которые появляются в с. Ключами для этой таблицы, которая послужит для усиления функциональных зависимостей в F, будут Xi из левой части с. Например, пусть Сз = {(А;В,С) - Е, (В) -► D, (F;G)}. Тогда у вашей первой таблицы имеются атрибуты А, В, С и D с двумя ключами А и {В,С}. У вашей второй таблицы атрибуты В и D с ключом В, у вашей третьей таблицы атрибуты F и G с ключами F и G. Получение универсального ключа Поскольку таблица универсального ключа необходима для предотвращения ложных соединений в схемах баз данных, возникающих в результате синтеза, то имеет смысл добавить какую-то функциональную зависимость к вашему исходному множеству функциональных зависимостей, так чтобы гаранти¬ ровать, что ваше окончательное множество таблиц будет содержать таблицу универсального ключа. Можно сделать это, добавив функциональную зависимость универсального ключа ALL -► уключ, где ALL — это множество всех ваших атрибутов, а уключ — некий добавленный атрибут. Этап 1 алгоритма синтеза не окажет никакого воздействия па функциональную зависимость универсального ключа. Этап 2 удалит из множества ALL все атрибуты, которые не являются необходимыми для универсального ключа. Когда функциональ¬ ные зависимости будут группироваться на этапе 4, функцио¬
401 нальная зависимость универсального ключа сгруппируется с другими функциональными зависимостями, только если левая часть некоторой другой функциональной зависимости содержит универсальный ключ. Наконец, после этапа 9 таблица, содер¬ жащая атрибут уключ, станет таблицей универсального ключа. В этот момент атрибут уключ может быть удален из данной таблицы. Заключение В этой главе мы обсуждаем смысл и пользу нормализации. Иллюстрируются два способа нормализации, называемые син¬ тезом и декомпозицией, и рассматриваются достоинства и недостатки каждого из них. Литература 1. Codd Е. F. ’’Normalized database structure: A brief tutorial.” ACM SIGFIDET Workshop on data description, access, and control. Nov 1971. (Кодд вводит нормальные формы в этой и в двух цитируемых ниже работах.) 2. Codd Е. F. "Further normalization of the database relational model.” in Data Base Systems, Rustin R. ed., Courant Inst., Computer Science Symp. 6 (Englewood Cliffs, N.J.: Prentice Hall Inc., 1972). 3. Codd E. F. "Recent investigations in relational database systems." (IFIP Conf. 1974). pp. 1017-1021. 4. Maier D. The Theory of Relational Databases (Computer Science Press, 1983).
Приложение Зарезервированные слова Вы не можете использовать зарезервированные слова языка SQL в качестве имен объектов базы данных, если они не заключены в двойные кавычки. ACCESS FILE MOVE SEGMENT ADD FLOAT NEXT SELECT ALL FOR NOARCHIVELOG SESSION ALTER FROM NOAUDTT SET AND GRANT NOCOMPRESS SHARE ANY GRAPHIC NOSYSSORT SIZE ARCHIVELOG GROUP NO'I SMALLINT AS HAVING NOWAIT SPACE ASC IDENTIFIED NULL START AUDIT IF NUMBER SUCCESSFUL BETWEEN IMMEDIATE OF SYNONYM BY IN OFFLINE SYSDATE CHAR INGREMENT ON SYSSORT CHECK INDEX ONLINE TABLE CLOSE INDEXED OPEN THEN CLUSTER INDEXPAGES OPTIONS TO COLUMN INITIAL OR UID COMMENT INSERT ORDER UNION COMPRESS INTEGER PARTITION UNIQUE CONNECT INTERSECT PCTFREE UPDATE CREATE INTO PCIINCREASE USER CURRENT IS PRIOR VALIDATE DATAPAGES LEVEL PRIVILEGES VALUES DATE LIKE PUBLIC VARCIIAR DBA LINK RAW VARGRAPHIC DECIMAL LIST RENAME VIEW DEFAULT LOCK RESOURSE WHENEVER DEFINITION LONG REFERENCES WHERE DELETE MAXEXTENTS REVOKE WITH DESC MAXTRANS ROLLBACK DISMOUNT MINEXTENTS ROW DISTINCT MINUS ROWID DROP MINTRANS ROWNUM ELSE MODE ROWS EXCLUSIVE MODIFY RUN EXISTS MOUNT SAVEPOINT
Т2 Приложение О Параметры для INIT.ORA Имя параметра Значение по умолчанию Воз- Описание лож¬ ность изменения # \ LIST AUDIT_TRAIL 0 Да BACKGROUND ОС Да DUMP-DEST CALLS ОС Нет CLEANUP 20 элементов Да ROLLBACK-ENTRIES Означает комментарий. Означает, что продолжение строки будет в следующей строке Текущие значения параметра будут изображены при запуске системы Разрешает или запрещает запись строк в контрольный журнал Место (директория, диск, файл), где для фоновых процессов (LGWR, DBWR, DBRD, ARCH, SMON и PMON) записываются дампы во время работы системы Oracle. Имеет смысл только для систем коллективного пользователя Число рекурсивных вызовов системы. Распределенное значение обычно оказывается достаточным и не нуждается в изменении Число элементов обратной прокрутки на одном этапе доводки в процессе доводки транзакции. Обычно модификация не потребуется
404 Имя параметра CONTEXT-AREA Значение no умолчанию Воз- Описание мож- ность изменения 4096 байт Да CONTEXT.INCR 4096 байт Да CONTROL-FILES CPU_COUNT DB_BLOCK-BUFFERS ОС Да 0 Да 32 Да DB_BLOCK¬ CACHE—PROTECT DB-BLOCK-1 HACH-BUCKETS ложь Нет зависимо Нет Начальный размер в байтах новой контекстной области, для которой не было специфицировано никакого размера. Фактический максимум для той или иной операционной системы может изменяться Число байт, на которое вырастет контекстная область, когда он заполнится и потребуется дополнительное место. Фактический максимум для той или иной операционной системы может изменяться Одно или более имен файлов управления, разделенные запятыми. Корпорация Oracle рекомендует пользоваться множественными файлами на разных устройствах Число центральных процессоров для этого экземпляра Число блоков базы данных, накапливаемых в глобальной области системы (ГОС). Этот параметр наиболее значим для определения размера ГОС и производительности базы данных. Преимущество более высокого значения состоит в том, что тот блок базы данных, который потребуется пользователю, с большей вероятностью окажется в памяти и за счет этого сократится ввод/вывод. Размер каждого буфера равен размеру параметра DB_BLOCK_SIZE Режим отладки, при котором защищаются блоки базы. Может изменяться только персоналом Oracle Размер хэш-таблицы, используемой для поиска буферов в буферном пуле. Вычисляется на основании DB_.BLOCK_BUFFERS. Обычно не нуждается в модификации Желательно устанавливать простое значение и ни в коем случае не четное
405 Имя параметра Значение по умолчанию Воз- Описание мож- ность изменения DB BLOCK МАХ MOD.PCT 51% Да Процент модифицируемых блоков в буфере, нужных для триггера, записываемого фоновым процессом DBWR DB BLOCK МАХ CLEAN-PCT 33% Да Каждое прохождение DBWR через буфер "очищает по крайней мере этот процент буфера. Увеличьте значение, если обновляется много разных блоков. Если значение слишком велико, го возникнет избыточный ввод/вывод DB BLOCK MULTIPLE HASHCHAIN LATCHES истина Нет При установке TRUE используется одна защелка на цепочку хэширования DB_BLOCK_SIZE ОС Да Размер в байтах блоков базы данных Oracle. Типовьс значения равны 2048 и 4096 DB BLOCK TIMEOUT WRITE-PCT 20% Да Регулярные прохождения через буфер сопровождаются заполнением приблизительно этого процента буфера. Более высокие значения могут обеспечить ускоренный доступ к блокам, но сдерживают фоновые процессы, которые могут блокировать активные процессы DB BLOCK WRITE_BATCH 8 блоков Да Число блоков, переданных одновременно в операционную систему для записи. Высокие значения сокращают ввод/вывод за счет времени ожидания DB BLOCK MULTIBLOCK READ COUNT зависимо Да Максимальное число блоков, прочтенных при вводе/выводе во время последовательного просмотра. По умолчанию является функцией от параметров DB_BLOCK_BUFFERS- и PROCESSES. Целесообразны значения из диапазона от 4 до 16 или даже 32. Фактический максимум изменяется операционной системой
406 Имя параметра Значение no умолчанию Воз- Описание лож¬ ность изменения DB_FILE_ SIMULTANEOUS WRITES 4 Да DB_FILES 32 файла Да DB_HANDLES DB-HANDLES CACHED DB-NAME зависимо Нет 2 Нет зависимо Да DC.COLUMNS 300 Да Число одновременных записей для каждого файла базы данных при работе DBWR. У этого значения нет максимума, но DBWR пишет группами по B_BLOCK_WRITE_BATCH блоков, так что нет смысла пользоваться значением, превышающим DB_BLOCK_WRITE_BATCH Максимальное число файлов базы данных, которые могут быть открыты во время работы этой базы данных. Уменьшайте его, только если нуждаетесь в пространстве глобальной области системы или располагаете меньшим количеством файлов. Вы можете увеличить это значение, выключив экземпляр и запустив его заново. Большие значения явно воздействуют на размер файла управления Максимальное число буферов, одновременно доступных всем процессам пользователей. Вычисляется как учетверенное число процессов (PROCESS) Число обработок буферов для процессов пользователей Идентификатор базы данных, состоящий из восьми или меньшего количества символов. Если указан, должен соответствовать имени, специфицированному в операторе CREATE DATABASE. Если же не указан, то имя базы данных должно появиться в командной строке либо STARTUP, либо ALTER DATABASE MOUNT Число элементов в буфере описаний столбцов. Это значение должно быть не меньше, чем максимальное число столбцов в любой отдельной таблице. Для наилучшей производительности это значение должно быть близким к числу столбцов, на которые все совместно работа¬ ющие пользователи ссылаются в любой момент времени
407 Имя параметра Значение по умолчанию Воз- Описание мож- ность изменения DC COLUMN GRANTS 50 Да Число элементов в буфере доверения столбцов. Допускается по одному для каждого столбца с доверением, но не для каждого доверения DC CONSTRAINT DEFS 200 Да Число элементов в буфере описания ограничений DC_CONSTRAINTS 150 Да Число элементов в буфере ограничений DC_FILES 25 Да Число элементов в буфере описаний файлов. Допускается по одному для каждого файла, соответствующего используемым табличным пространствам DC_FREE_EXTENTS 50 Да Число элементов в буфере описаний свободных экстентов, накапливающем отдельные экстенты свободного места в памяти любых размеров DCJNDEXES 50 Да Число элементов в буфере описаний индексов DC_OBJECTIDS 50 Да Число элементов в буфере идентификаторов объектов DC_OBJECTS 100 Да Число элементов в буфере описаний объектов (который содержит имена таких объектов базы данных, как таблицы, кластеры, синонимы и представления). Значение этого параметра влияет на производительность во время грамматического разбора. Для наилучшей производительности это значение должно быть равно числу объектов, с которыми работают все пользователи в любой момент DC ROLLBACK SEGMENTS 25 Да Число элементов в буфере описания сегментов обратной прокрутки DC_SEGM ENTS 50 Да Число элементов в буфере описаний сегментов. Допускается по одному для каждой таблицы, кластера, индекса и сегмента обратной прокрутки DC_SEQUENCE_ 20 Да Число доверений для последовательностей, которые могут быть помещены в буфер DCSEQUENCES 20 Да Число элементов в буфере описания последовательностей
408 Имя параметра Значение Воз- Описание по мож- умолчанию ность изменения DC_SYNONYMS 50 Да Число элементов в буфере описаний синонимов DC_TABLES 100 Да Число элементов в буфере описаний таблиц/кластеров/ /представлений DC_TABLE_G RANTS 50 Да Число элементов в буфере доверения таблиц. Нужно по одному элементу для каждой таблицы с доверением, а не для каждого доверения DC TABLESPACE QUOTAS 25 Да Число элементов в буфере квот табличного пространства, где хранятся индивидуальные квоты пользователей для каждого табличного пространства. Если 10 пользователей создали таблицы в двух табличных пространствах, то потребуются 20 элементов DC_TABLESPACE 25 Да DC_USED_EXTENTS 50 Да DC_USERNAMES 50 Да DC.USERS 50 Да DDL_LOCKS 20 Да Число элементов в буфере описаний табличных пространств Число элементов в буфере используемых экстентов Число элементов в буфере имен пользователей Число элементов в буфере описаний пользователей Максимальное число поддерживаемых одновременно замков блокировки грамматического разбора. Должно быть по одному для каждой таблицы, на которую происходит ссылка во время сеанса. Значение является глобальным. Например, если три пользователя модифицируют данные в одной таблице, то потребуются три элемента. Если же три пользователя модифицируют данные в двух таблицах, то потребуются 6 элементов
409 Имя параметра Значение по умолчанию Воз- Описание лож¬ ность изменения DMLJLOCKS 20 Да ENQUEUE_HASH зависимо Нет ENQUEUE_LOCKS зависимо Нет ENQUEUE RESOURCES зависимо Нет EVENT зависимо Нет FIXED_DATE зависимо Да FREE-LISTJNST 1 Да FREE_LIST_PROC 4 Да Максимальное число замков данных: по одному для каждой таблицы, модифицируемой в транзакции. Это значение должно быть равно общему числу замков для таблиц, на которые ссылаются все пользователи. Например, если три пользователя модифицируют данные в одной таблице, то потребуются три элемента. Если же три пользователя модифицируют данные в двух таблицах, то потребуются 6 элементов Длина хэш-таблицы очереди. Значение выводится из ENQUENE_RESOURCES и не должно изменяться Число отдельных замков, принадлежащих процессу, отличному от DDL и DML. Значение выводится из ENQUEUE.RESOURCES и не должно нуждаться в изменении Число ресурсов, которые могут быть блокированы менеджером блокировок в системе Oracle. Допускается единица на ресурс, но не на замок. Это число должно равняться DML_LOCKS плюс DDL_LOCKS плюс превышение от примерно 20. Значение определяется из PROCESSES и должно быть адекватным. Если используется несколько таблиц, то значение может быть увеличено Контроль событий в режиме отладки. Может изменяться только персоналом Oracle Позволяет вам установить константу для SYSDATE Число элементов свободного списка для экземпляра. Применимо только для систем с разделением диска Число элементов свободного списка для процессов. Применимо только для систем с разделением диска
410 Имя параметра Значение по умолчанию GCJDB_LOCKS зависимо GC_ROLLBACK_ 20 LOCKS GC ROLLBACK 20 Да SEGMENTS GC SAVE 20 Да ROLLBACK-LOCKS GC_SEGMENTS 10 Да Воз- Описание лож¬ ность изменения Да Относится только к системам с разделением диска, максималь¬ ное число модифицированных блоков, которые могут поддерживаться в буферах всех объединяемых экземпляров. Умолчание имеет смысл для систем с одним или двумя экземплярами. Значение должно устанавливаться заново для систем, в которых больше экземпляров. Подходит значение (сумма DB_BLOCK_BUFFERS для всех экземпляров)/! Относится только к системам с разделением диска, число блоков совместных модифици¬ руемых сегментов обратной прокрутки во всех экземплярах. Значение по умолчанию пригодно для одного или двух экземп¬ ляров, но должно быть увели¬ чено до 10 на экземпляр при большем количестве экзем пл я jx>b Относится только к системам с разделением диска. Общее число сегментов обратной про¬ крутки масштаба системы, кото¬ рые могут служить для управ¬ ления распределением места в памяти. Для систем с одним или двумя экземплярами подходит значение по 10 на экземпляр Относится только к системам с разделением диска. Число совместных модифицированных блоков косвенных сегментов обратной прокрутки во всех объединяемых экземплярах. Значение по умолчанию пригодно для одного или двух экземпляров, но должно быть увеличено до 10 на экземпляр при многих экземплярах Относится только к системам с разделением диска. Общее число сегментов масштаба системы, которые могут служить для управления распределением места в памяти. Значение по умолчанию пригодно для одного или двух экземпляров, но должно бъггь увеличено до 10 на экземп¬ ляр при многих экземплярах
411 Имя параметра Значение по умолчанию Воз- Описание мож- ность изменения GC_SORT_LOCKS зависимо Нет GC_TABLES PACES 5 Да IFILE 5 Да INIT_SQL_FILES ОС Да INSTANCES 16 Да LANGUAGE ’ainerican_ Нет america. us7ascii’ Общее число замков сортировки. Относится только к системам с разделением диска Относится только к системам с разделением диска. Общее число табличных пространств, которые могут одновременно переводиться из автономного режима в оперативный Вставляет другой файл в текущий файл INIT.ORA. Должен сопровождаться именем файла, как IFILE=TESTPARAM.ORA. Допускается до трех уровней вложенности Список одного или более файлов, содержащих операторы языка SQL, которые должны исполняться, когда создается база данных. Этот параметр всегда должен использоваться для создания таблиц и представлений словаря данных. Потом при желании можно запускать в работу другие местные файлы. Это имя файла не должно изменяться, но допускается добавление дополнительных файлов Относится только к системам с разделением диска. Текущее максимальное число экземпляров, которые могут одновременно открывать базу данных. Этот параметр отличается от варианта MAXINSTANCES для CREATE DATABASE. MAXINSTANCES определяет абсолютное максимальное число экземпляров. INSTANCES может временно уменьшить предел, установленный параметром MAXINCTANCES, но не может увеличить его Строка символов, описывающая национальный язык работы с базой данных. Этот параметр определяет три аргумента в формате языктерритория- . набор—Символов
412 Имя параметра Значение по умолчанию Воз- Описание мож- ность изменения LOG-ALLOCATION 200 Да LOG_ARCHIVE_DEST ОС Да LOG_ARCHIVE_ FALSE Да START LOG_BUFFER 8192 байт Да Имеет смысл в первую очередь для дисковых систем. Указывает число блоков в файле регистрации действий, отводимых для экземпляра всякий раз, когда он требует еще места в текущем оперативном файле регистрации. В случае использования для систем без разделения диска все распределения относятся к одному и тому же экземпляру и поэтому отводимый размер может быть близким к размеру файла Применим только в случае регистрации действий в режиме ARCHIVELOG и при автоматической архивизации (если LOG-ARCHIVE-START равняется ’TRUE”). Текстовая строка, указывающая место и корень файла на диске или на лентопротяжке для использования при наименовании архивизированных файлов регистрации Применим только в случае регистрации действий в режиме ARCHIVELOG. Указывает, должна ли архивизация обеспечиваться автоматически или вручную при запуске экземпляра. Значение TRUE указывает, что администратор базы данных будет архивизировать заполненные файлы регистрации действий Число байт, отводимых в глобальной области системы для буферов регистрации действий. В общем случае более высокие значения сокращают ввод/вывод для файлов регистрации действий, особенно если транзакции длинные или многочисленные
413 Имя параметра Значение по умолчанию Воз- Описание лож¬ ность изменения LOG-CHECKPOINT INTERVAL 2000 блоков Да LOG_FILES 16 Да LOG_IO_SIZE зависимо Нет MAX DUMP FILE SIZE 500 блоков Да MESSAGES зависимо Нет Число вновь заполненных блоков для файлов регистрации действий (единицами являются блоки операционной системы, а не блоки Oracle), нужных для триггера контрольной точки. Вне зависимости от этого значения контрольная точка будет всегда появляться при переключении с одного оперативного файла регистрации на другой. Размер может превышать фактический размер любого файла регистрации действий. В таком случае контрольные точки появляются только при переключении файлов регистрации Максимальное число файлов базы данных, которые могут быть открыты во время работы этой базы данных. Сокращается, только если вы нуждаетесь в пространстве ГОС и имеете меньше файлов базы данных. Вы можете увеличить значение, выключив экземпляр и запустив его заново. Более высокие значения несколько воздействуют на размер файла управления Максимальное число блоков для одновременной записи на оперативный файл регистрации действий. Значение вычисляется на основе значения для LOG_BUFFERS Максимальный размер в блоках любого следа записанных файлов Максимальное число тех буферов межпроцессных сообщений, которые отводятся для связей между процессами пользователей и фоновыми процессами. Значение вычисляется на основе PROCESSES и обычно не должно изменяться
414 Имя параметра Значение по умолчанию Воз- Описание лож¬ ность изменения NLS.SORT FALSE OPEN_CURSORS 50 OPEN_LINKS Нет Определяет, основывается ли сортировка (как в сортирующей последовательности для запросов ’ORDER BY’) на специфицированном наборе символов (значение TRUE) или на числовом значении символов (двоичная сортировка, значение FALSE). Если значение равно TRUE, то допустима сортировка по национальному языку, причем сортировка основывается на множестве символов, указываемом значением параметра LANGUAGE Да Максимальное число открытых курсоров на процесс пользователя, в результате увеличивается или уменьшается пространство адресуемой памяти, используемое каждым процессом. Различие в размерах не велико, требуется особое место только для дескрипторов курсоров Да Максимальное число одновременно открытых соединений с удаленными базами данных на процесс пользователя. Значение должно быть не меньше числа баз данных, на которые имеются ссылки из любого отдельного оператора на языке SQL, ссылающегося на множественные базы данных, так чтобы все эти базы данных могли быть открыты для исполнения оператора. Этот параметр относится только к соединениям, используемым для распределенных запросов. Непосредественные соединения с удаленными базами данных, специфицированные как прикладные соединения, не принимаются в расчет. При установке значения 0 не разрешается никаких распределенных запросов
415 Имя параметра Воз- Описание мощ¬ ность изменения Значение по умолчанию PRE_PAGE_SGA FALSE PROCESSES 20 ROLLBACK- 20 SEGMENTS' ROW CACHE ENQUEUES 100 Нет ROW CACHE INSTANCE-LOCKS 100 Нет ROW CACHE MILT!_INSTANCE TRUE Нет ROW CACHE PCT 10 Нет FREE Если установлен как TRUE, то все страницы глобальной области системы размещаются в рабочей области каждого пользователя. Этот параметр специфичен для VMS и особенно полезен во время тестирования достигаемого уровня Да Для многопроцессной работы максимальное число процессов пользователей операционной системы, которые могут одновременно подключаться к Oracle. Следует включать до шести базовых процессов плюс 1 для начала сеанса, так что значение 20 допустило бы от 13 до 15 совместно работающих пользователей Нет Один или более сегментов обратной прокрутки, которые должны быть специально отведены для этого экземпляра. Экземпляр всегда будет получай» все сегменты, указанные этим параметром, даже если число сегментов превышает вычисленное минимальное количество сегментов, которые будут затребованы экземпляром (с применением TRANSACTIONS/ TRANSACHONS_PER_ ROLLBACK-SEGMENT). Сегменты могут создаваться с ключевым словом PUBLIC или без него. Никогда не специфицируйте сегмент обратной прокрутки SYSTEM как значение для этого параметра Число совместных постановок в очередь, управляемых строкой буфера Число замков для экземпляров по строке буфера Если значение равно TRUE, то строка буфера будет поддерживать несколько экземпляров Число свободных объектов, владеющих строкой буфера
416 Значение no умолчанию Имя параметра Воз- Описание лож¬ ность изменения ROW-CACHE- BUFFER-SIZE SAVEPOINT SCN_INCREMENT SCN.THRESHOLD SEQUENCE- CACHE-ENTRIES 200 5 2048 512 10 SEQUENCE-CACHE- HASH-BUCKETS Нет Размер в байтах циклического буфера строк Да Максимальное число совместных точек сохранения, действующих для процесса пользователя Нет Глобальное число системных согласований увеличивается на это значение, когда исчерпывается текущий диапазон. Обычно это значение не должно нуждаться в изменении Нет Диапазон для глобального числа системных согласований считается исчерпанным, когда это количество закончилось. Обычно это значение не должно нуждаться в изменении Да Число номеров последовательностей, которые могут быть размещены в буфере ГОС для непосредственного доступа. Этот буфер управляется по принципу самого давнего использования, так что если делается запрос последовательности, не представленной в буфере, то при отстутствии свободных элементов будет удален дольше всех не использовавшийся и на его место поступит вновь затребованный. Самая высокая параллельность достигается, когда в качестве значения устанавливается наибольшее возможное количество последовательностей, которые одновременно будут использоваться в экземпляре Да Служит для ускорения поиска в буфере вновь затребованных последовательностей. Буфер упорядочивается как хэшированная таблица. Когда процесс в первый раз запрашивает некоторую последовательность, он ищет ее в этой последовательности
417 Значение no умолчанию Имя параметра SERIALIZABLE Воз- Описание мож- ностъ изменения FALSE SESSIONS SINGLE-PROCESS 28 FALSE SORT_AREA_SIZE ОС SORT_READ_FAC SORT_SPACEMAP SIZE ОС ОС Да Если TRUE, то запросы получают замки чтения, препятствуя тем самым любому обновлению читаемых объектов, пока не завершится согласование транзакции, содержащей конкретный запрос. Обеспечивается согласованность третьей степени при значительных затратах на параллелизм Нет Общее число сеансов работы пользователя с системой Да Определяет, работает ли база в режиме одиночного пользователя (т. е. одного процесса) или коллективного пользования (многих процессов). TRUE означает режим одиночного пользователя, a FALSE означает коллективное пользование Да Размер в байтах реальной памяти, которую есть основания предполагать доступной для сортировки. Например, для компьютера VAX с 8 Мбайтами реальной памяти, из которой, по вашему мнению, 1/8 может оказаться доступной частью для процессов сортировки, причем вы ожидаете одновременного прохождения примерно четырех сортировок, вы могли бы установить этот параметр равным 8192/8/4 = 256К (преобразован в байты). Как правило, больший размер только повысит эффективность объемных сортировок Нет Мультиблочный коэффициент чтения для сортировки Да Размер в байтах отображения сортировки в контекстной области. Уточнение этого параметра могло бы оказаться желательным, только если создаются очень большие индексы
418 Значение no умолчанию Имя параметра Воз- Описание мощ¬ ность изменения SESTD__TIME_ZONE Сортировка, соответствующая стандарту в строке формата календарных данных. К допус¬ тимым относятся следующие строки (где "d" и "s'* означают дневной свет и adt, ast bet, bst cdt, cst edt, est gmt hdt, hst mdt, mst nst pdt, pst темноту): to. дарового дааи. Атлантический Берингов Центральный Западный Гринвич Среднее время Гавайи, Аляска Горный Ньюфаундленд Тихоокеанский TABLE LOCKING FALSE Да Если FALSE, то предоставляется возможность блокировки на уро¬ вне строк. Если TRUE, то систе¬ ма всегда будет осуществлять блокировку на уровне таблиц и обновление одной таблицы будет препятствовать обновлению дру¬ гих. Включен для совместимости с прежними версиями Oracle TIMED,STATISTICS FALSE Да TRANSACTIONS 20 Да TRANSACTIONS, PER_ROLLBACK_ SEGMENT 20 Да По умолчанию (при установке FALSE) статистика SQL*DBA, относящаяся ко времени (от программы управления буфером) всегда нулевая и СУРБД могут избежать выхода за пределы времени, затребованного от операционной системы. Для включения статистики установите значение TRUE Максимальное число одновре¬ менных транзакций. Влияет на размер глобальной области сис¬ темы и на способ распределения сегментов обратной прокрутки Число совместных транзакций, разрешенных на один сегмент обратной прокрутки. Таким об¬ разом, число сегментов обратной прокрутки, доступных при за¬ пуске, получалось бы делением TRANSACTIONS на значение этого параметра Например, если TRANSACTIONS равняется 101, ; параметр равен 10, то число дос¬ тупных сегментов обратной про¬ крутки будет округленным резуль¬ татом деления 101/10, т. е. 11
419 Имя параметра Значение по умолчанию USE_ROW_ TRUE ENQUEUES USER_DUMP_DEST ОС Да USER_SESSIONS 1 Нет Воз- Описание лож¬ ность изменения Да По умолчанию постановки в очередь внутри памяти получаются для блокировки строк, и поэтому они передаются с доверением в правильном порядке. Этот параметр управляет доступом к строкам, требуя от всех обновляющих пользователей, чтобы они сначала встали в очередь к строкам, подлежащим модификации. Тем самым предотвращаются излишняя работа и повторные разборы в случае изощренных строк и уменьшается ввод/вывод для систем со многими экземплярами. При отсутствии конкуренции строк и при желании получить небольшой выигрыш в производительности, установите параметр как FALSE, исключив также ситуационные постановки в очередь. Но при наличии конкуренции строк и при значении FALSE могут ухудшиться характеристики ввода/вывода. Установка этого параметра не воздействует на поддержание замков или на целостность данных и на порядок изменений. Она влияет только на тот порядок, в котором получаются замки. Этот параметр должен иметь одно и то же значение для всех экземпляров, разделяющих базу данных Местоположение (директория, файл, диск), куда пишутся отладочные файлы прослеживания от процесса пользователя Максимальное число сеансов на один процесс пользователя. В настоящее время ограничивается одним сеансом на процесс пользователя
Глоссарий АБД (администратор базы данных). Пользователь, авторизи- рованный, чтобы передавать с доверением и активизировать доступ других пользователей к системе, модифицировать варианты Oracle, затрагивающие всех пользователей, и выполнять другие административные функции. См. также SYS и SYSTEM. Автоматический пропуск. Атрибут поля. Когда какой-то сим¬ вол вводится в последнюю позицию поля автоматического пропуска, программа SQL*Forms осуществляет прогон до следующего поля текущего блока. Автоматическое согласование. Средство пакета SQL*Plus для передачи с согласованием изменений в базу данных в конце каждой команды. Вводится командой SET AUTOCOMMIT ON. Автономная регистрация действий. При использовании реги¬ страции действий в режиме ARCHIVELOG файл регистра¬ ции, который уже был архивизирован. Авторизация. Любая из операций, выполнять которую может быть уполномочен ("авторизирован”) носитель пользовательского имени. Система Oracle распознает авторизации, реализуемые зарезервированными словами CONNECT, RESOURCE и DBA. Аргумент. Выражение внутри скобок некоторой функции, предоставляющее значение, которым эта функция должна оперировать. Или же элемент данных вслед за командным
421 именем файла в команде START, которая предоставляет значение для переменной подстановки в командном файле. Асинхронное опережающее чтение (ARH). Процесс ускорения реакции на запросы, который читает данные из базы данных в глобальную область системы для процесссов, осуществля¬ ющих полные просмотры таблиц. Атрибут. В SQL*Forms. Синоним ’’характеристики", как в термине "характеристики поля”. База данных. Набор таблиц словаря и таблиц пользователей, которые рассматриваются как некая единица. Базовая таблица. Любая "фактическая" таблица в базе данных в отличие от "виртуальной таблицы". Блок. (1) Основная единица хранения всех-данных системы Oracle. Число блоков, отводимых на таблицу, зависит от табличного пространства, находившегося в действии при создании этой таблицы. Изменяется операционной системой. Обычные размеры блоков составляют 512 и 2048 байт. В руководстве по установке Oracle указан размер блока в вашей системе. (2) В языке SQL*Forms раздел формы, который содержит группу связанных полей с данными и тестами, соответствующими одной таблице в базе данных. Блок единой записи. Блок, изображающий в каждый момент одну запись. Блок заголовка сегмента. Первый блок в первом экстенте сегмента, содержащий, помимо прочего, список экстентов для этого сегмента. Блок множественных записей. В SQL*Forms блок, отобража¬ ющий в какой-то момент более чем одну строку данных (одну запись) для каждого поля в блоке. Блок управления. Блок, который не соответствует какой-либо таблице базы данных. Служит для выполнения автоматиче¬ ских вычислений над данными, восстанавливаемыми из базы данных или вводимые пользователем. Может содержать приглашение пользователю принять какое-то решение (за¬ казные меню) или содержать изображение инструкций (экраны заказной помощи). Блок экстента. Первый блок начальных данных или индекс¬ ный экстент, содержащий административную информацию о каждом экстенте, отведенном для таблицы. Существуют три блока переполнения на таблицу (два для данных и один
422 для индекса). Блок экстента представляет собой первые данные и первый блок индекса. Блокировка в режиме монополии. Режим блокировки таблиц для гарантий, что некоторый процесс является единственным процессом, обновляющим данные какой-то таблицы. Ника¬ кой другой процесс не может стать владельцем замка этой таблицы, пока не будет снята исключительная блокировка. Блокировка в режиме разделения. Блокировка, гарантирую¬ щая, что данные не будут изменяться, пока какой-то процесс запрашивает их. Этот режим может быть активизирован явно предложением LOCK TABLE в операторе SHARE MODE. Блокировка записи. В SQL*Forms средство, препятствующее двум пользователям одновременно обновлять одну и ту же строку в одной и той же таблице. Блокировка на уровне строки. Синоним для блокировки в режиме разделяемого обновления. Тип блокировки, при котором обновление данных происходит посредством бло¬ кировки строк в таблице, а не блокировки всей таблицы. Брат. В древовидной структуре данных узел, имеющий того же родителя, что и другой узел. Буфер. Место, где система Oracle хранит вводимую, редакти¬ руемую или исполняемую команду или программу. Буферизация. Перепись изображаемых выходных данных на буфер. Управляется командой SPOOL. Вариант доверительной передачи. Вариант для передачи дру¬ гим пользователям базы данных тех привилегий, которые были вам доверены. Вариант доверяется с помощью пред¬ ложения GRANT...WITH GRANT OPTION. Ввод разрешен. В SQL*Forms атрибут поля. Вы можете ввести какое-то значение в поле с этим атрибутом. Версия сопровождения. Второй идентифицирующий номер программного обеспечения Oracle. В версии 6.0.10 номер версии сопровождения равняется 0. Ветвь. Узел дерева вместе со всеми его отпрысками, отдален¬ ными потомками и родительскими источниками. Виртуальная таблица. Таблица, которая фактически не суще¬ ствует в базе данных, но как бы существует с точки зрения пользователя. Противоположность "базовой таблицы". См. также "Представление". Виртуальный столбец. Столбец в результате выполнения за¬
423 проса. Его значение было вычислено по значению (значе¬ ниям) другого столбца (столбцов). Вложенность* Упорядоченность двух этапов обработки, при которой один этап активизирует другой. Внесение с согласованием. Внесение постоянных изменений в базу данных. До запоминания результатов выполнения команд INSERT, UPDATE, DELETE существуют как прежние, так и новые данные, так что можно запомнить изменения или заново запомнить данные в их прежнем состоянии. Когда данные передаются с согласованием, все новые данные, которые являются частью транзакции, становятся постоян¬ ными, заменяя данные в базе данных. Внешнее соединение. Строки, которые не согласуются с усло¬ вием соединения. Внешний ключ. Столбец (или комбинация столбцов) в одной таблице, который не является ключом в этой таблице, но служит ключом где угодно в другом месте (например, в другой таблице). Служит для связывания данных в множе¬ ственных таблицах с помощью соединения. Внутренние замки. Замки на внутренних структурах базы данных и физических файлах, гарантирующие целостность данных. Существуют три типа внутренних замков: замки словарного буфера, замки файлов и управления регистрацией и замки табличных пространств и сегментов обратной прокрутки. Восстановление среды. Восстановление в случае отказа аппа¬ ратуры, которое предшествовало бы чтению или записи данных, а следовательно, работе базы данных. См. также ’’Восстановление экземпляра”. Восстановление экземпляра. Восстановление в случае отказа программного или аппаратного обеспечения. Возникает, если программное обеспечение аварийным образом завершает свою работу вследствие нескольких ошибок, тупиковой ситуации или разрушительного взаимодействия между про¬ граммами. См. также "Восстановление среды". Временные таблицы. Часто требуются для упорядочения дан¬ ных и для исполнения операторов языка SQL, включающих предложения DISTINCT, ORDER BY или GROUP BY. Всплывающее меню. В SQL*Forms 1.0 меню, изображаемое программой экранной живописи. Называется так, потому что "всплывает" над частью содержимого экрана, иногда над
424 другими всплывающими меню. Когда перестает быть нуж¬ ным, стирается, и тогда покрываемая им информация ищется заново. В версии SQL*Forms 2.0 называется окном. Входы в систему OPS$. Тип пользовательского имени в системе Oracle, при котором OPS$ выступает в роли префикса для бюджета или идентификатора операционной системы для упрощения входа в систему Oracle по этому идентификатору. Выборка. Один этап исполнения запроса, когда фактические строки данных, удовлетворяющие всем критериям поиска, извлекаются из базы данных. Выключение. Процесс отключения экземпляра от базы данных и прекращения работы экземпляра. Выражение. Один или более элементов данных, скомбиниро¬ ванных в команде операциями или функциями. Когда SQL*Plus исполняет команду, вычисляется значение выражения. Выход пользователя. В SQL*Forms функция, написанная на таком языке программирования, как Кобол или Си, и активизируемая каким-то этапом триггера. Генератор интерактивных приложений (IAG). Программа, преобразующая формы из формата INP в формат FRM. Активизируется автоматически после того, как вы создали или модифицировали форму. Может также работать как отдельная программа согласно приглашению из командной строки вашей операционной системы. Главный компьютер. Системы Oracle и SQL*Plus могут работать на компьютерах многих различных типов. Компью¬ тер, на котором вы запускаете их в работу, называется вашим главным компьютером. Глобальная область программы (ГОП). Память, предназна¬ ченная для конкретного пользователя базы данных. Проти¬ воположность глобальной области системы. Глобальная область системы (ГОС). Разделяемая область в основной или виртуальной памяти (в зависимости от операционной системы), отводимая программой IOR. Об¬ ласть ГОС представляет собой центр деятельности на время функционирования базы данных. Размер ГОС (и произво¬ дительность системы) зависит от значений переменных параметров для INIT.ORA. Глобальная область системы обеспечивает связь между процессами пользователя и фо¬ новыми процессами.
425 Групповая функция. Функция, оперирующая по столбцу или выражению во всех строках, выбранных по запросу, и вычисляющая в результате одно значение. Например, фун¬ кция AVG вычисляет среднее значение. Декларативный оператор языка SQL. Оператор языка SQL, который не генерирует обращения к базе данных и поэтому не является исполнимым оператором SQL. Примеры: DECLARE SECTION или DECLARE CURSOR. Длина поля. В SQL*Forms число символов, которые могут быть помещены в поле во время ввода данных. Дружественный к пользователю интерфейс. Интерактивный интерфейс пользователя, предоставляемый в системе Oracle по версию 4 включительно. Заменен и расширен в Oracle версии 5 средствами SQL*Plus. Дублированная таблица. Таблица, обычно называемая DUAL и содержащая в точности одну строку. Полезна в качестве объекта для команды SELECT, предназначаемой для копи¬ рования значения одного поля в другое поле. Единица работы. Логическая единица работы эквивалентна транзакции. Включает всякие операторы языка SQL, потому что используется для исполнения программы IOR по варианту WARM. Единый процесс. Режим работы базы данных, позволяющий нескольким пользователям разделять базу данных. Заголовок. Текст, появляющийся над столбцом отчета для именования или описания этого столбца. Заголовок строки. Часть всякой строки, содержащая инфор¬ мацию о строке, отличную от собственно данных строки, например число кусков строки, столбцов и т. д. Загрузчик данных системы Oracle. Утилита пользователя. Служит для загрузки данных из стандартных файлов операционной системы. Будет заменен программой SQL*Loader. Заказная форма. В SQL*Forms форма, созданная посредством "экранной живописи" в отличие от "формы по умолчанию", которая описывается проектировщиком, а затем создается автоматически программой SQL*Forms. Закрытая база данных. База данных, которая соответствует некоторому экземпляру, но не открыта. Базы данных должны быть закрыты для нескольких функций поддержания базы
426 данных. Реализуется оператором ALTER DATABASE языка SQL, Замечание, Описание таблицы или столбца, которое может ассоциироваться с определением этой таблицы или столбца в словаре данных. Замок, Замок на уровне пользователя, который поддерживается на протяжении прохождения транзакции для гарантии согласованности внутри транзакции. Замок грамматического разбора. Один из двух типов замков словаря (другим типом являются замки языка определения данных). Устанавливается пользователями, которые ссыла¬ ются на таблицы в операторах на языке SQL. Замки грамматического разбора используются с разделением. Замок обновления с разделением. Замок, позволяющий другим пользователям и запрашивать, и блокировать данные. Замок определения таблицы. Замок, препятствующий другим пользователям в получении какого-либо доступа к таблице, пока не изменяется определение таблицы (например, по команде ALTER TABLE). Замок с разделением. Тип замка, позволяющего другим пользователям запрашивать данные, но не изменять их. Замок транзакции. Замок, который появляется в изображении MONITOR с указанием, что какая-то транзакция поддержи¬ вает замки строк. Замок ТТ. Замок словаря на временном сегменте. Замок ЯМД. Синоним для замков данных. Замок ЯОД. Один из двух типов словарных замков (к другому типу относятся замки грамматического разбора), устанавли¬ ваемых пользователями, которые исполняют операторы языка определения данных. Замки ЯОД являются исключительными. Замки данных. Замки, явно или неявно устанавливаемые пользователями по данным. Замки данных могут устанав¬ ливаться в любом из шести режимов блокировки и появляются в изображении MONITOR как замки ТА или ТМ. Замки словаря. Замки, устанавливаемые пользователями, ко¬ торые грамматически разбирают операторы (замки разде¬ ляемого словаря или замки грамматического разбора) или которые исполняют операторы языка определения данных (исключительные замки словаря или замки ЯОД). Замки словарных буферов. Один из трех типов внутренних замков. Замки па элементах словарных буферов.
427 Замки табличных пространств. Один из трех типов внутрен¬ них замков. Эти замки устанавливаются на табличных пространствах и сегментах обратной прокрутки для гарантии правильности доступа и внесения информации со стороны экземпляров в табличные пространства и сегменты обратной прокрутки. Запись. Одна строка таблицы. Запрос. Инструкция для SQL, которая извлечет информацию из одной или нескольких таблиц и представлений. Запрос с древовидной структурой. Запрос, в котором строки выбираются в порядке, определяемом соотношениями между определенными значениями в разных строках. Зарезервированное слово. Слово, имеющее специальное зна¬ чение в SQL или SQL*Plus и поэтому запрещенное для пользователей при именовании таблиц, представлений или столбцов. Защелка. Внутренний замок, поддерживаемый на короткое время для гарантии согласованности базы данных. Значение по умолчанию. Значение, используемое если не специфицировано другое значение. Значение, которое форма помещает в поле создаваемой записи и которое пользователь может потом изменить. См. также ’’Фиксированное значение". Идентификатор экземпляра. Средство различать один экземп¬ ляр от другого, когда на одном центральном процессоре существует несколько экземпляров. Идентификатор задается по способу портов. Иерархия прерываний. Порядок, в котором SQL*Plus прове¬ ряет возникновение событий и триггеры, соответствующие операциям прерываний. Импорт. Утилита системы Oracle, служащая для чтения файлов операционной системы, которые содержат данные из базы данных и записаны утилитой Импорт с целью восстанов¬ ления этих данных в базе данных Oracle. Имя базы данных. Уникальный идентификатор, используе¬ мый для именования базы данных. Присваивается в опера¬ торе CREATE DATABASE. Индекс. Общий термин для средства Oracle/SQL, используе¬ мого преимущественно для ускорения исполнения и при¬ дания данным уникальности. Обеспечивает более быстрый доступ к данным, чем выполнение полного просмотра таблиц.
428 Индекс кластера. Индекс, созданный вручную после создания кластера и до того, как какие-либо операторы языка манипулирования данными смогут оперировать этим кла¬ стером. Данный индекс создается по столбцам ключа кластера с помощью оператора CREATE INDEX языка SQL, Индексный сегмент. Память, отведенная для индексов по какой-то индексной таблице. Состоит из начального индекс¬ ного экстента и нуля или более приращающих индексных экстентов. Размер и количество этих экстентов определяется табличным пространством во время создания таблицы. Инициализация. Начальная подготовка базы данных. Всегда выполняется при первоначальной реализации системы базы данных. Активизируется посредством использования IOR.INIT. Всякие существовавшие данные пользователя теряются Устанавливаются начальные таблицы базы данных. Исполнимый оператор языка SQL, Оператор языка SQL, генерирующий обращение к базе данных. Включаются почти все запросы, операторы языков манипулирования данными (ЯМД), определения данных (ЯОД) и управления данными (ЯУД). Сравните с декларативным оператором языка SQL. Календарное поле. Поле, значением которого является дата (date). Иногда термин применяется к полю, значением которого является число, представляющее дату. (Этот по¬ следний тип календарного поля использовался в ранних версиях SQL*Forms, которые не поддерживали настоящие календарные поля, и сохраняется в более поздних версиях для совместимости.) Кандидатурная строка. Выбранная по основному запросу стро¬ ка, значения полей которой используются при исполнении соответственного подзапроса. Квота. Лимит ресурса. Квоты могут ограничивать количество памяти, потребляемой каждым пользователем базы данных. Кластер. Метод совместного хранения данных из разных таблиц, когда данные в этих таблицах содержат общую информацию и подходят для совместного доступа. Служит для повышения производительности. Ключ. Столбец (столбцы) в одной таблице, который может служить для уникальной идешификации строки. Столбец (столбцы), формирующий кл'к>i, обычно индексируется. Ключ кластера. Столбец (столбцы), который кластеризирует
429 таблицы, имеющие общие части и выбранные в качестве ключа хранения/доступа. Команда. Инструкция в языке SQL или SQL*Plus. Большинство строк в языке SQL могут занимать по нескольку строк и завершаются точкой с запятой. Команда SQL*Forms. Последовательность функций, активизи¬ руемая этапом триггера. Обычно пользователь активизирует их нажатиями функциональных клавиш. Командная строка. Строка на экране дисплея компьютера, в которую вы приглашены ввести команду.. Командный файл. Файл, содержащий команды, которые вво¬ дятся интерактивно. Контекстная область. Рабочая область, где система Oracle хранит текущий оператор на языке SQL. Если этот оператор является запросом, то в конкретной области хранятся также заголовки столбцов и одна строка результата. Синоним термина курсор. Контрольная точка. Точка, в которой применительно к экзем¬ плярам измененные блоки пишутся в базу данных. Появ¬ ляется, когда в определенное количество блоков файлов регистрации действий была произведена запись LOG_ CHECKPOINT__INTERVAL, а также когда оперативный файл регистрации действий заполнен. Контрольный журнал. Таблица в таблице словаря данных, называемой SYSAUDITJTRAIL, содержащая описания ре¬ визуемых операций. Координаты курсора. Местоположение курсора на экране дисплея. Корень. В древовидной структуре данных начало дерева. Вершина, которая не имеет родителя и прямые и косвенные отпрыски которой образуют все дерево. В древовидном запросе строка, специфицированная предложением START WITH. Курсор. (1) Синоним для контекстной области. Курсоры Moiyr быть открытыми или закрытыми. (2) Опознавательный знак (например, мерцающий квадрат или линия), отмечающий вашу текущую позицию на экране дисплея. Курсор строки. Часть строки, содержащая заглавную инфор¬ мацию или данные собственно строки. Лист. В древовидной структуре данных узел, у которого нет отпрысков.
430 Логическая единица работы. См. '’Транзакция”. Логический блок. Единица памяти базы данных, используемая системой Oracle для распределения места под строки с общими значениями кластер_столбец. По умолчанию логи¬ ческий блок имеет такой же размер, как физический блок. Его можно уменьшить с помощью предложения SIZE из команды CREATE CLUSTER. Таким образом, два или более логических блоков могут храниться в одном физическом блоке. Логическое выражение. Выражение, значением которого яв¬ ляется либо истина, либо ложь. Синоним для "условия”. Локальная база данных. База данных, к которой подключается пакет SQL*Plus, когда вы его запускаете в работу. Обычно это база данных на вашем главном компьютере. См. также "Удаленная база данных". Макрос. В SQL*Forms возможность формы, изменяющая функцию функциональной клавиши. Метка. В SQL*Forms идентифицирующее слово, ассоциирую¬ щееся с этапом триггера. Отдельные метки специфицируются соответственно тому, заканчивается ли этап успехом или отказом. См. "Метка успеха" или "Метка отказа". Метка отказа. В SQL*Forms метка, специфицированная как часть одного этапа в триггере, идентифицирующем другой этап, который программа SQL*Forms должна исполнить, если этот этап дает отказ. Метка успеха. В SQL*Forms метка, специфицированная как часть одного этапа в триггере и идентифицирующая другой этап, который программа SQL*Forms должна исполнить следующим, если этот этап оказывается успешным. Многопроцессность. Режим работы базы данных, позволяю¬ щий нескольким пользователям разделять эту базу данных. Множественное условие. Логическое выражение, содержащее запрос. Модель формата. Предложение, которое управляет появлением какого-то значения в столбце отчета. Модели форматов специфицируются предложением FORMAT из команды COLUMN. Модели форматов для столбцов данных исполь¬ зуются также в таких функциях преобразований данных, как TO_DATE.
431 Наследование. Процесс копирования значения из одного поля в другое, логически связанное иоле. Например, когда номер специальной страховки служащего вводится в блок формы записей окладов, он может быть унаследован в блок формы удержания налогов. Независимость от устройств. Способность программы одина¬ ково работать с разными типами устройств. SQL*Forms достигает независимости от устройств за счет использования файлов CRT. Несжатый индекс. Индекс одного или нескольких столбцов, когда все индексные данные хранятся в индексе. Позволяет ускорить выполнение запроса, если все запрошенные данные хранятся в индексе. Противопоставляется сжатому индексу. Несформнрованная база данных, База данных, которая не сформирована каким-либо экземпляром и поэтому не может быть открыта или стать доступной для использования. Неуравнивающее соединение. Условие соединения, специфи¬ цирующее соотношение, иное, чем "равны* ( = ). Номер последовательности регистрации действий. Номер, слу¬ жащий для идентификации журнала регистрации действий, используемого при восстановлении состояния базы данных с помощью регистрационных файлов. Область времени. Область внутренней памяти, созданная по команде timing и содержащая информацию о приблизительном количестве времени, затраченном на исполнение группы команд. Область связи SQL (SQLCA). Область памяти, используемая функциями в IAP для возврата полезной информации вызывающим их выходам пользователя. Обновление, если пусто. В SOI?Ferms атрибут поля. Вы можете обновлять значение такого поля, только если это значение пусто. Атрибуты обновление разрешено и обновление, если пусто, являются взаимно исключающими. Обновление разрешено. В SQL*Forms атрибут поля. Вы можете обновлять значение такого поля. Обработка транзакций. Обработка логических единиц работы, а не отдельных элементов, с целью сохранения согласован¬ ности базы данных. Обратная прокрутка. Для повторения изменений, внесенных в базу данных в процессе транзакции, или логической единицы работы. Противоположна передаче с согласованием.
432 Обслуживающее устройство. Исполнитель услуг, требуемых клиентом. Обход дерева. Процесс обследования по очереди каждого узла дерева. Общий сегмент обратной прокрутки. Сегмент обратной про¬ крутки, который может быть распределен любым экземп¬ ляром, имеющим доступ к базе данных. Противоположность частному сегменту обратной прокрутки. Общий синоним. Синоним для объекта базы данных, создан¬ ного администратором базы данных в расчете на всех пользователей базы данных. Объединение. Операция объединения (UNION) из традицион¬ ной теории множеств. Например, A UNION В (где А и В — это множества) представляет собой множество всех таких объектов х, что х является элементом множества А, или х является элементом множества В, или х входит в оба множества. Объект. Нечто, хранимое в базе данных. Примеры: таблицы, представления, синонимы, индексы, столбцы, отчеты, хра¬ нимые процедуры, хранимые программы. Обязательный. В SQL*Forms атрибут поля. Такое поле должно содержать данные, прежде чем курсор переместится в другое поле. Окно. Меню, изображенное программой экранной живописи в пакете SQL*Forms. Всплывает над частью содержимого экрана, иногда над другими окнами. Когда оно больше не нужно, стирается. При этом покрываемая им информация снова открывается. Оперативная регистрация действий. Те файлы регистрации действий, которые не были архивизированы, но либо доступны экземпляру для регистрации действий, либо уже записаны и находятся в состоянии ожидания архивизации. Оперативное резервирование. Архивизация данных из базы данных во время ее работы. Таким образом, администратор базы данных не нуждается в отключении базы данных с целью архивизации данных, можно архивизировать даже те данные, к которым осуществляется доступ. Оператор (языка SQL). "Полное предложение" на языке SQL. Большинство операторов языка SQL, но не все, являются исполнимыми операторами SQL. Части оператора могут называться выражениями или предикатами.
433 Операция. Символ или зарезервированное слово, используемое в выражении для выполнения такой операции, как сложение или сравнение, над элементами выражения, например операции умножения и ANY (сравнивает какое-то значение с каждым значением, возвращаемым по подзапросу). Определение места. Объект базы данных, который определяет множество параметров распределения места для таблиц и индексов. Таблица или индекс может быть создана со специфи¬ цированным набором параметров распределения места за счет ссылок на подходящее определение места в команде CREATE. Оптимизатор. Часть ядра Oracle, которая определяет наилуч¬ ший способ использования таблиц и индексов для выпол¬ нения действий, требуемых согласно оператору языка SQL. Основная переменная. Переменная, которая получает значение поля в команде ЕХЕС языка SQL. Основная программа. Программа, выполняемая интерактивно вводом команды CALL. Основная программа может запускать в работу другие программы исполнением команды CALL. Основной запрос. Самый внешний запрос в сцеплении под¬ запросов, приводящий к изображению результата. Отказ. В SQL*Forms один возможный результат исполнения этапа в триггере. Открытая база данных. База данных, подключенная к како¬ му-то экземпляру и доступная для пользователей. Отмена выбора. Противоположность выбора. Отличный. У никал ьный. Отпрыск. В древовидной структуре данный узел, который ’’принадлежит" другому узлу. Узел, которому принадлежит узел-отпрыск, называется родительским узлом. Отсроченный сегмент обратной прокрутки. Сегмент обратной прокрутки, содержащий элементы, которые не могут быть применены к табличному пространству, потому что данное табличное пространство находится в автономном режиме. Как только табличное пространство возвращается в опера¬ тивный режим, все такие элементы раскрываются. Параметр. Имя столбца, выражение или константа, специфи¬ цирующая, что команда должна делать. Перезапуск пз памяти. Обычный способ запуска базы данных Oracle всякий раз, кроме первого. Также используется для исполнения программы IOR по варианту WARM.
434 Переменная базы данных. Переменная, сопоставленная с базой данных по команде EXEC SQL CONNECT. Служит для ссылки на базу данных из предложения АТ в команде ЕХЕС языка SQL. Переменная подстановки. Имя переменной или число, пред¬ шествуемое знаком & и используемое в командном файле для представления значения, которое будет предоставлено, когда командный файл будет запущен в работу. Переменная пользователя. Переменная, определенная пользо¬ вателем по команде на языке SQL*Plus. Переменные параметры. Параметры, которые устанавливают¬ ся в файле параметров для INIT.ORA и будут влиять на размер глобальной области системы. (ГОС). Если эти параметры увеличиваются, то возрастает и размер памяти, требуемой для ГОС. Перенос. Перенесение конца заголовка или записи на новую строку, когда заголовок или поле слишком длинны и поэтому не помещаются в одной строке. Переносимость. Легкость, с которой компьютерная программа может быть адаптирована для аппаратного обеспечения, отличающегося от того, для которого она была написана. Подача формы. Символ управления, который побуждает прин¬ тер перейти к верху нового листа бумаги. Подзапрос. Запрос, используемый как предложение в команде языка SQL. Подключиться. Идентифицировать себя для системы Oracle по своему пользовательскому имени и паролю, получив тем самым доступ к базе данных. Подразделение. Логическая единица хранения в базе данных Oracle. Всякая база данных содержит подразделение SYSTEM и может содержать дополнительные подразделения. Состоит из одного или нескольких физических файлов. Поле. Часть таблицы, которая содержит один элемент данных. Пересечение строки и столбца. Поле временных данных. В SQL*Forms поле, в котором временно хранятся и изображаются данные, извлеченные из других полей в форме. Эти данные не хранятся в какой-либо таблице базы данных и не извлекаются из таких таблиц. Поле просмотра таблиц. В SQL*Forms поле, изображающее данные из таблицы, которая не является базовой таблицей для данного блока.
435 Поле CHAR. В языке SQL*Forms поле, значение которого представляет собой последовательность символов. Пользователь SYS. Один из администраторов базы данных, оформленных при установке и инициализации системы Oracle (второй называется SYSTEM). SYS владеет базовыми таблицами для словаря данных. SYSTEM владеет представ¬ лениями, созданными на этих таблицах. Пользователь SYSTEM. Один из администраторов базы дан¬ ных, оформленных при установке и инициализации базы данных (второй называется SYS). См. "Пользователь SYS". Порт. Термин, используемый для ссылки на любую конкрет¬ ную операционную систему, которая поддерживает СУРБД Oracle. Хотя много информации относительно Oracle спра¬ ведливо для всех портов, некоторая информация обязательно изменяется в зависимости от операционной системы. Эта информация обычно называется специфичной для порта или зависящей от операционной системы. Последовательный номер строки. Присваивается строке, когда она вставляется в блок данных таблицы. Запоминается также как добавление к строке и образует часть псевдостолбца ROWID. Постановка в очередь. Ресурс, управляющий запросами бло¬ кировок. Всякий процесс, требующий блокировку на какой-то объект базы данных, должен быть поставлен в очередь на эту блокировку. Максимальное число требований блокировки определяется параметром ENQUENES для INIT.ORA. Постоянный текст. В языке SQL*Forms. Фиксированная ин¬ формация для какой-то формы. То есть, все, что угодно, кроме определений полей и определений триггеров. Предикат. Часть оператора на языке SQL, обычно часть предложения WHERE, налагающая ряд критериев на данные, которые должны быть возвращены по запросу. См. также "Выражение". Предкомпилятор. Программа, которая читает файл исходной программы и пишет модифицированный файл исходной программы, который может потом читать компилятор. Система Oracle поддерживает предкомпилятор, который называется РСС (общий предкомпилятор) и обрабатывает команды, встроенные в выходы пользователей и в другие программы. Предкомпилятор может использоваться с под¬ ходящим параметром командной строки для обработки любого включающего языка, поддерживаемого системой Oracle.
436 Предложение. Зарезервированное слово, которое используется для указания, что должна делать команда, и иногда сопровождается каким-то значением, например, в команде SELECT DISTINCT цена FROM Поставщики SELECT и FROM Поставщики являются предложениями. Предложение предиката. Предложение, основанное на одной из операций (=, ! =, is not, >,>=,<,<=) и не содержащее AND, OR или NOT. Представление. Таблица, которая физически не существует в памяти, но как бы существует с точки зрения пользователя. Часть таблицы, которая реально существует в базе данных. "Виртуальная" таблица. Преобразователь интерактивных приложений (IAC). Програм¬ ма, которая преобразует формы из формата INP в формат базы данных или наоборот. Может также работать как отдельная программа согласно вашему приглашению из командной строки вашей операционной системы. Прерывание. Событие, которое происходит, когда пакет SQL обрабатывает запрос или отчет (например, изменение зна¬ чения выражения). Пакет SQL может быть принужден выполнить некоторое действие, например печать итогов при всяком возникновении прерывания. Привилегия АБД. Привилегии по отношению к базе данных, предоставленные оператором GRANT DBA. Круг их обладателей должен ограничиваться очень немногими пользователями. Проверка правильности. В SQL*Forms этап обработки, на котором проверяется по крайней мере потенциальная пра¬ вильность информации. Например, проверка того, что целое число, представляющее день недели, находится в диапазоне от 1 до 7. Для выполнения проверки правильности могут использоваться триггеры на уровне поля. Проверка согласованности. В языке SQL*Forms этап обработ¬ ки, который обеспечивает проверку того, что две части информации имеют совместный смысл. Например: проверка того, что номер поставщика в строке, вставляемой в таблицу заказов, уже имеется в какой-то строке в таблице постав¬ щиков. Для выполнения проверки согласованности часто используются триггеры на уровне блоков. Программа написания/Форматер отчетов (RPT и RPF). Основой пакета SQL*Rcport является программа генерации отчетов,
437 которая включает в себя две утилиты: RPF,.t. е. форматер текстов отчетов Oracle, и RPT, генератор отчетов Oracle. Программа управления замком на уровне строк. Часть ядра, позволяющая блокировать на уровне строк, а не на уровне таблицы и тем самым обеспечивающая высокий уровень параллелизма и производительности транзакций. Программа управления кэшем диска. Ответственна за обеспе¬ чение передачи на диск в правильном порядке всех изме¬ нений, внесенных в программные средства. Программа-утилита. Программа, которая запускается в работу командой операционной системы главного компьютера и выполняет какую-то функцию, связанную с системой Oracle, например функцию CCF, создающую файл для включения в подразделение базы данных. Программа экранной живописи. Средство SQL*Forms для создания заказных форм и модифицирования форм. Представ¬ лено в основном меню вариантами (С) CREATE и (М) MODIFY. Программа IOR. Утилита для АБД, служащая для инициали¬ зации системы Oracle и для ее запуска и останова. Возможны варианты работы Oracle с разделением, когда имеются экземпляры, разделяющие файл базы данных, а также такого запуска Oracle, при котором только администратор базы данных имеет доступ к базе данных. Программный интерфейс. Процедурный интерфейс с базой данных, обеспечивающий доступ к СУРБД для прикладных программ пользователей. Программный интерфейс системы Oracle (OPI). Относящаяся к Oracle часть программного интерфейса, обеспечивающая взаимную защиту программы пользователя и программы Oracle. См, также 'Программный интерфейс пользователя (UPI)". Программный интерфейс пользователя (UPI). Пользователь¬ ская часть программного интерфейса, ответственная за поддержание разделения между программой пользователя и программой Oracle для защиты данных. Проектировщик интерактивных приложений (IAD). Програм¬ ма, которая выполняет функции экранной живописи в SOL*Forms. Может быть активизирована посредством вари¬ анта "Create a form" (создать форму) или "Modify a form" (модифицировать форму) из основного меню SQL*Forms или же можег работать как отдельная программа согласно пригла¬ шению из командной строки вашей операционной системы.
438 Прокручивание полиэкрана. Способность некоторых экранных устройств обеспечивать прокручивание данных в диапазоне строк без воздействия на другие части экрана. Процедура. Запомненное множество инструкций (обычно опе¬ раторов на языке SQL и команд PL/SQL), сохраненное в PL/SQL для повторяемого исполнения. Процесс записи журналов (LGWR). Один из шести фоновых процессов, используемых многопроцессными системами баз данных. Пишет на диск элементы журналов регистрации действий. Процесс ARCH. Один из шести фоновых процессов, исполь¬ зуемых системами баз данных с многими процессами, архивный процесс выполняет автоматическую архивизацию файлов регистрации действий, когда такая регистрация реализуется в режиме ARCHIVELOG. Процесс DBRD. Процесс чтения базы данных. Один из шести фоновых процессов, работающих в системах баз данных коллективного пользования. Читает из базы данных полными просмотрами таблиц прежде, чем они понадобятся. Процесс PMON. Процесс мониторинга. Один из шести фоно¬ вых процессов, используемых в многопроцессных системах баз данных. Выполняет восстановление в случае отказа процесса, обращающегося к базе данных. Процесс SMON. Процесс мониторинга системы. Один из шести фоновых процессов, используемых в многопроцессных системах баз данных. Выполняет восстановление в случае отказа экземпляра, осуществляющего доступ к базе данных. Процесс интерактивных приложений (IAP). Позволяет неиску¬ шенным пользователям взаимодействовать с базой данных в структурированной среде. Прямая прокрутка. Повторное применение к базе данных изменений. Необходимо для восстановления носителя ин¬ формации и иногда для восстановления экземпляра. Журнал регистрации действий содержит элементы действий, исполь¬ зуемые для прямой прокрутки. Псевдоним. Временное имя, присвоенное какой-то таблице или столбцу отчета и служащее для ссылки на эту таблицу или столбец. Псевдостолбец. "Столбец", при выборе которого порождается значение, но который не является фактической частью той
439 таблицы, из которой он выбирается. Например, псевдостол¬ бец SYSDATE порождает текущую дату и время. Пустое значение. Отсутствие значения для заданного столбца. Пустое значение означает только, что ничего не известно об истинном значении. Можно потребовать, чтобы столбцы содержали непустые значения. Для этого нужно определить столбцы как NOT NULL при создании таблицы. Пустая команда. Команда языка SQL*Plus, состоящая только из точки с запятой. Пустая команда представляет собой способ позволить программе ничего не делать в контексте, требующем какой-то команды. Рабочее пространство. Место хранения записей в пакете SQL* Forms при работе с ними. Вводите записи в рабочее пространство, создавая их или извлекая их из какой-то таблицы по запросу. Записи покидают рабочее пространство при их удалении или внесении в базу данных с согласова¬ нием. Рамка. В языке SQL*Forms прямоугольное покрытие в форме, содержащее группу связанных объектов, например поля и постоянный текст в блоке. Создается с помощью функции DEFINE BOX, также может быть создана вводом последо¬ вательностей текстовых символов, например и Т. Распределенная база данных. Совокупность баз данных, кото¬ рые обрабатываются и управляются по отдельности, а также могут разделять информацию. Ревизия. Указание системе Oracle хранить записи различных аспектов ее использования, например доступов к таблице. Режим блокировки. Один из шести режимов, в которых может быть установлен замок. Эти режимы следующие: SHARE, SHARE UPDATE, SHARE EXCLUSIVE, ROW SHARE, ROW EXCLUSIVE и EXCLUSIVE. He все замки могут устанавли¬ ваться во всех режимах, возможны замки данных. Режим включения. Всякий вводимый вами символ включается в курсор, проталкивая последующие символы вправо. Про¬ тивоположность режима замены. Регистрация действий. Последовательный журнал действий, которые нужно повторно применить к базе данных, если они оказались не записанными на диск. Этот журнал всегда состоит из двух файлов. Один из них произвольно буфери¬ зируется, тогда как в другом производится запись. Когда
440 записываемый в настоящий момент файл заполняется, то заново используется второй файл. Режим живописи. В SQL*Forms режим, в котором вы взаи¬ модействуете с программой экранной живописи непосред¬ ственно (т. е. не через окно). Режим замены. Режим, в котором каждый вводимый вами символ заменяет символ у курсора. Противоположен режиму вставления. Режим запроса. В SQL*Forms специальный термин, в кагором выполняются триггеры на уровне поля, когда какая-то запись извлекается в рабочее пространство. Обработка в режиме запроса отличается от обычной обработки триггеров на уровне поля. Режим обновления с разделением. То же, что блокировка на уровне строки. Блокировка, при которой обновления данных происходят посредством блокировки строк в таблице, а не блокировки всей таблицы. Рекурсивные вызовы. Вложенная активизация СУРБД, напри¬ мер, ревизионная информация записывается в системные таблицы посредством рекурсивного вызова. Реляционная база данных. База данных, которая представля¬ ется пользователю как совокупность связанных таблиц. Ресурс. Общий термин для логического объекта базы данных или физической структуры, которая может быть заблокиро¬ вана. Пользователи могут непосредственно блокировать ресурсы строки и таблиц. СУРБД может блокировать многочисленные разнообразные ресурсы, в том числе таб¬ лицы словаря данных, буферы и файлы. Родитель. В древовидной структуре данных узел, который ’’владеет" другим узлом. Находящийся в его собственности узел называется ’’отпрыском" родительского узла. Связь базы данных. Объект, хранимый в локальной базе данных и идентифицирующий удаленную базу данных, пользовательское имя в той базе данных и пароль для этого пользовательского имени. После своего определения она может служить для выполнения запросов по таблицам в удаленной базе данных. Сеанс. Период времени между подключением некоторого пользовательского имени к базе данных и его отключением. Сегмент. Совокупность, блоков, зарезервированных для таб¬ личных данных (строк), данных для одиночного индекса
441 или для сегмента обратной прокрутки. У таблицы всегда будет иметься один сегмент данных и столько же индексных сегментов, сколько индексов. У кластера всегда будут хотя бы два сегмента (один для данных, а другой для индекса кластера). Сегмент данных. Память, отведенная для данных из таблицы, в отличие от памяти, отведенной под индекс по таблице. Состоит из экстента начальных данных и нуля или более экстентов приращенных данных. Размер и количество этих экстентов определяются табличным пространством, в кото¬ ром создается таблица. Сегмент начальной загрузки. Сегмент, необходимый во время создания базы данных для образования начальных структур базы данных (словаря данных). Сегмент обратной прокрутки. Множество элементов, исполь¬ зуемых для повторения внесенных в базу данных изменений в случае события обратной прокрутки транзакции, катаст¬ рофы, восстановления носителя информации или при необходимости для согласованности чтения. Для всякого экземпляра требуется хотя бы один отведенный ему сегмент обратной прокрутки. Сеть. Соединение между двумя или более различными ком¬ пьютерами, позволяющее им непосредственно обмениваться информацией. Сжатый индекс. Индекс, для которого хранится лишь та информация, которая нужна для идентификации уникально индексированных элементов. ’’Усеченный" индекс. Сокращает накладные расходы памяти. Противоположен несжатому индексу. Синтаксис. Линейный порядок слов или символов. Синхронный терминал. Терминал, который передает или получает символы по экрану или по полю за один раз. Противоположность асинхронного терминала. Система базы данных. Сочетание экземпляра и базы данных. Если экземпляр запускается и подключается к открытой базе данных, то система базы данных доступна для пользователей. Система отображения системы Oracle. Утилита администра¬ тора базы данных для управления процессами пользователя и системы Oracle. Система с разделением диска. Множественные экземпляры на одном или нескольких центральных процессорах, разделя¬ ющие общую базу данных.
442 Система частей с разделением. Конфигурация, в которой системы Oracle на множественных узлах сети разделяют одни и те же файлы базы данных. Каждый узел называется "экземпляром". Системная . переменная. Значение, поддерживаемое системой Oracle или SQL*Plus для некоторого указания относительно ее состояния или среды. Многие системные' переменные могут изображаться по команде SHOW и/или устанавли¬ ваться по команде SET. Системно привилегированные команды SQL*DBA. Подмноже¬ ство команд SQL*DBA, которым требуется не только доступ к утилите SQL*DBA, но и специальный бюджет операцион¬ ной системы. Этим командам нужен самый высокий уровень защиты. Словарь данных. Исчерпывающий набор таблиц и представле¬ ний, принадлежащих пользователю — администратору базы данных SYS и установленных при инициализации системы Oracle. Содержит также информацию о пользователях, привилегиях и ревизии, доступную только администратору базы данных. Является центральным источником информа¬ ции для самой базы данных и для всех пользователей. Таблицы автоматически поддерживаются системой Oracle. Согласованность чтения. Возможность запроса SQL всегда обозревать моментальный снимок таблицы в том виде, в котором она существовала в начале исполнения этого запроса, несмотря на то, что кто-то может модифицировать таблицу. Соединение. Извлечение более чем из одной таблицы. Создание базы данных. Процесс подготовки базы данных для начального использования. Включает в себя очистку файлов базы данных и загрузку начальных таблиц базы данных, которые требуются для СУРБД. Осуществляется оператором CREATE DATABASE языка SQL. Создание смежного файла (CCF). Имеющаяся в некоторых операционных системах утилита Oracle, которая используется администратором базы данных для создания и приведения в готовность файлов базы данных и файлов BI. Соотносимая вложенная команда SELECT. Подзапрос, испол¬ нение которого повторяется. Соотносимый подзапрос. То же, что соотносимая вложенная команда SELECT.
443 Сортирующая последовательность. Последовательность симво¬ лов, в которой всякий символ определяется как больший или меньший по отношению к каждому другому символу. Сортирующая последовательность служит для упорядочения и выбора по значениям полей символов. В языках SQL*Plus и SQL*Forms используется сортирующая последовательность либо ASCII, либо EBSDIC в зависимости от типа работаю¬ щего с сортирующей последовательностью компьютера. Составные ключи. Значение ключа, которое формируется более чем одним столбцом. Сочлененный индекс. Индекс, созданный по более чем одному столбцу таблицы. Служит для гарантии, что эти столбцы являются уникальными для каждой строки в таблице. Может быть сжатыми или несжатыми по любой комбинации столбцов таблицы. Спецификация базы данных. Алфавитно-цифровой код, кото¬ рый идентифицирует базу данных Oracle и служит для специфицирования базы данных в операциях SQL*Net и для определения связи базы данных. Средство для интерактивных приложений (IAF). Состоит из двух программ: IAG и IAP. Ссылка на поле. Слово, используемое в команде языка SQL, в команде SQL*Forms или в выходе пользователя для идентификации поля, содержащего код функции. Старшинство операций. Порядок, в котором Oracle выполняет операции в выражении. Например, в выражении 2 + 3*х сначала вычисляется произведение 3*х, а затем прибавляется 2, потому что операция умножения (*) старше, чем операция сложения ( + ). Столбец. (1) Поля, представляющие один вид данных в таблице, например поля, представляющие оклад в таблице служащих. (2) Поля, представляющие один вид данных в результате выполнения запроса. Столбец кластера. Одно из полей в кластеризированной группе таблиц, служащее для указания мест для хранения строк из этих таблиц. Столбец прерывания. Столбец в отчете, изменение значения которого приводит к прерыванию. Страница. (1) Заполнение экрана изображаемыми данными или заполнение листа бумаги печатными данными в отчете. (2) Единица памяти на диске, см, также "Блок".
444 Строка. (1) Одно множество полей в таблице. (2) Одно множество полей в результате выполнения запроса. Строка состояния. В SQL*Forms строка на экране вашего дисплея, где SQL*Forms показывает информацию о своем текущем состоянии. Обычно это последняя строка на экране. СУРБД. Система управления реляционными базами данных. Сформированная база данных. База данных, соответствующая экземпляру системы Oracle. Эта база данных может быть открытой или закрытой. Когда база данных сформирована, она проверена на "правильность оформления" и обладает логическим именем, по которому к ней могут обращаться последующие операторы. База данных должна быть сфор¬ мированной и открытой для доступа пользователей. Та база данных, которая была сформирована, но не открыта, может быть доступной для некоторых целей сопровождения. Сцепленный блок. Последующий блок, установленный на хранение табличных данных, когда первоначально отведен¬ ный блок вышел за пределы памяти, потому что строки в этом блоке расширились вследствие обновлений. Обычно используется для табличных данных, но допускается сцеп¬ ление и индексных блоков. Много сцепленных блоков будут воздействовать на производительность, поскольку параметр определения пространства PCTFREE может быть установлен слишком низким. Таблица, Основная единица информации в системе управле¬ ния реляционной базой данных. Состоит из одной или более единиц информации (строк), каждая из которых содержит значения некоторого вида (столбцы). Табличное пространство. Логическая часть базы данных, ис¬ пользуемая при распределении памяти для табличных данных и индексов таблиц. Текущая команда SQL. Команда на языке SQL в буфере SQL. Обычно это команда SQL, исполненная самой последней. Текущая строка. Строка текущего буфера, на которую могут воздействовать в любой заданный момент команды редак¬ тирования языка SOL*Pius. Текущее поле. Б язы»<с SOL*Forms это поле текущего блока, в котором можно е/щдить ипъ редактировать данные. Текущий буфер. Бустер, на который будут воздействовать в любой момент команды редактирования языка SQL*Plus.
445 Терминал в режиме блоков. Устройство отображения наподо¬ бие терминала IBM 3270, передающее и получающее данные полями или более крупными порциями, а не посимвольно. См, также "Синхронный терминал". Терминальный узел. В древовидной структуре данных узел, не имеющий отпрысков. Называется также "листом". Тип данных. Любая одна из форм данных, которые система Oracle может хранить и обрабатывать. Основными типами данных для Oracle являются CHAR, VARCHAR, DATE, LONG, NUMBER и RAW. Тип данных LONG. Тип данных, который допускает строки символьных данных длиной до 65 535 символов. Тип данных LONG RAW. Сходен с типом данных LONG, но не основывается на предположениях о типе данных (напри¬ мер, ASCII или EBCDIC). Для данных, ориентированных на байты, длиной до 65535 байт. Тип данных NUMBER. Тип данных для числовых данных. Тип данных RAW. Сходен с типом данных CHAR с той разницей, что хранит интерпретированные байты, а не символы. Тип устройства по умолчанию. Тип устройства отображения, которое программа SQL*Forms предполагает используемым, если не сказано обратного. Описывается файлом DEFAULT.CRT. Тип файла. Часть имени файла, которая описывает тип данных, хранимых в файле. Обычно тип файла для того или иного файла отделяется от собственного имени файла точкой, например STORDATA.LIS, где LIS — тип файла. Точка сохранения^ Точка, в которой записывается вся работа в транзакции. В транзакции могут применяться ряд точек сохранения, выступающих в роли промежуточных точек для работы либо по внесению с согласованием, либо по обратной прокрутке. Транзакция. Логическая единица работы, определяемая поль¬ зователем. Триггер. В SQL*Forms последовательность команд на языке SQL и/или команд SQL*Forms, которые исполняются, когда происходит определенное событие. Существуют два типа: триггеры на уровне блоков, активизируемые, когда выпол¬ няется запрос или когда записи вносятся с согласованием в базу данных, и триггеры на уровне полей, активизируемые, когда курсор покидает какое-то поле после изменений значения этого поля.
446 Триггер включения. В SQL*Forms триггер на уровне блока, исполняемый в процессе включения строки в таблицу во время передачи с согласованием. Существуют две разновид¬ ности: триггеры предвключения и триггеры поствключения. Триггер запроса. В SQL*Forms триггер на уровне блока, исполняемый в процессе выполнения запроса. Существуют два вида: триггеры предзапросов и триггеры постзапросов. Триггер, названный пользователем. В SQL*Forms триггер, названный как-нибудь иначе, чем предопределенным именем для SQL*Forms. Может упоминаться (исполняться) другими триггерами с помощью макрооператора EXETRG. Триггер на уровне блока. В языке SQL*Forms триггер, акти¬ визируемый при выполнении запроса или при передаче с согласованием записей в базу данных. Триггер на уровне поля. В SQL*Forms триггер, активизируе¬ мый, когда курсор покидает поле после того, как было изменено значение этого поля, и при выборке записи в текущий блок в процессе выполнения запроса. Триггер обновления. В SQL*Forms триггер на уровне блока, выполняемый в процессе обновления строки в таблице во время внесения изменения с согласованием. Существуют два вида: триггеры предобновления и постобновления. Триггер постблока. В SQL*Forms триггер на уровне блока, выполняемый, когда оператор покидает блок. Триггер поствставления. В SQL*Forms триггер на уровне блока, выполняемый после вставления всякой строки в таблицу во время согласования. Триггер постзаписи. В SQL*Forms триггер на уровне блока, выполняемый, когда оператор покидает запись, отображен¬ ную в блоке. Триггер постзапроса. В SQL*Forms триггер на уровне блока, выполняемый всякий раз, когда какая-то запись извлекается в рабочее пространство в процессе выполнения запроса. Триггер постнзменения, В SQL*Forms триггер на уровне поля, выполняемый всякий раз, когда оператор с пульта изменяет значение в этом поле. Триггер постобновления. В SQL*Forms триггер на уровне блока, выполняемый после обновления всякой строки в таблице во время согласования. Триггер постполя. В SQL*Forms триггер на уровне поля, выполняемый, когда оператор покидает поле.
447 Триггер постудаления, В SQL*Forms триггер на уровне блока, выполняемый сразу после удаления всякой строки из таблицы во время согласования. Триггер постформы. В SQL*Forms триггер на уровне формы, выполняемый, когда оператор покидает форму. Триггер предблока. В SQL*Forms триггер на уровне блока, выполняемый, когда оператор входит в блок. Триггер предвставления. В SQL*Forms триггер на уровне блока, выполняемый непосредственно перед вставлением всякой строки в таблицу во время согласования. Триггер предзаписи. В SQL*Forms триггер на уровне блока, выполняемый, как только оператор входит в запись. Триггер предзапроса. В SQL*Forms триггер на уровне блока, выполняемый при нажатии EXECUTE QUERY. Триггер предобновлепия. В SQL*Forms триггер на уровне блока, выполняемый перед обновлением всякой строки в таблице во время согласования. Триггер предполя. В SQL*Forms триггер на уровне поля, выполняемый, когда оператор входит в блок. Триггер предудалеиия. В SQL*Forms триггер на уровне блока, выполняемый перед удалением всякой строки из таблицы во время согласования. Триггер предформы. В SQL*Forms триггер на уровне формы, выполняемый, когда оператор входит в форму. Триггер удаления. В SQL*Forms триггер на уровне блока, выполняемый в процессе удаления строки из таблицы во время согласования. Имеются два вида таких триггеров: триггеры предудаления и триггеры постудаления. Тупик. Ситуация, в которой два пользователя соперничают из-за ресурсов, блокированных каждым из них, и поэтому ни один из них не может получить ресурс, необходимый для завершения работы. Система Oracle разрешает тупиковые ситуации за счет обратной прокрутки работы того пользо¬ вателя, у которого меньше ожидаемый объем деятельности. Удаленный компьютер. Любой компьютер в сети, отличаю¬ щийся от вашего собственного главного компьютера. Узел. (1) Конкретный центральный процессор с соответству¬ ющей ему памятью. (2) В древовидной структуре данных одна единица данных. В таблице с древовидной структурой всякая строка является узлом.
448 Умолчание. Значение какого-либо варианта, встроенное в систему и используемое системой, если пользователь не специфицировал значение для этого варианта. Уникальный индекс. Индекс (сжатый или несжатый), придающий уникальность каждому индексируемому им значению. Может быть единичным столбцом или сочлененными столбцами. Уравнивающее соединение. Условие соединения, специфици¬ рующее отношение "равны” ( = ). Уровень. В древовидной структуре данных число узлов между заданным узлом и корнем. Считается, что сам корневой узел находится на уровне 1, его отпрыски находятся на уровне 2 и т. д. Усекать. Обрезать, как при сокращении или изображении в сокращенной форме большого куска данных. Условие. Выражение, значение которого является либо исти¬ ной, либо ложью, например Х = 10. Успех. В SQL*Forms один из возможных результатов испол¬ нения этапа в триггере. Например, команда SELECT успешна, если она выбирает хотя бы одну строку, и дает отказ в противном случае. Файл. Основная единица информации, поддерживаемая опе¬ рационной системой. Область памяти, используемая для хранения всяких данных из базы данных. Файл базы данных. Файл, используемый в базе данных. База данных состоит из одного или более табличных пространств, которые в свою очередь состоят из одного или более файлов базы данных. Файл предварительных образов. Также называется файлом BI. Содержит образы данных до внесения изменений. Служит для гарантии, что данные не вводятся в базу данных, пока не станут завершенными и согласованными. Файл управления. Небольшой административный файл, кото¬ рый требуется во всякой базе данных и необходим для запуска и работы системы баз данных. Файл управления сочетается с базой данных, а не с экземпляром. Из соображений защиты данных множественные идентичные файлы управления предпочтительнее, чем одиночный файл. Файл CRT. Файл с информацией о свойствах конкретного типа устройств отображения. Сообщает программе SQL*Forms, с каким устройством производится работа и как его использовать.
449 Файл FRM. В SQL*Forms двоичный файл, представляющий форму. Создан программой IAG и читается программой IAP (частью программы SQL*Forms, запускающей форму в работу). Файл INP. Файл символов, представляющий форму. Создается программами IAG и IAC в формате INP и читается программами IAG и IAC. Служит связующим звеном между формой, хранящейся в базе данных, и файлом FRM для этой формы, а также между прежними версиями SQL*Forms и версией 2.0. Файлы последующего образа. Также называются файлами AIJ. Служат для записи согласованных данных транзакций, с целью восстановления обратной прокрутки в случае отказа системы. Фиктивная таблица. Таблица, содержащая в точности одну строку и один столбец. Полезна в качестве объекта для команды SELECT, предназначаемой для копирования зна¬ чения одного поля в другое поле. Фиктивная таблица обычно называется DUMMY. Фоновый процесс. Один из шести процессов, используемых экземпляром в многопроцессной системе Oracle для выпол¬ нения и координации задач от имени совместно работающих пользователей базы данных. К этим шести процессам относятся ARCH, DBRD, LGWR, PMON и SMON. Они существуют, пока существует экземпляр. Форма по умолчанию. Описываемая вами форма, которую программа SQL*Forms создает автоматически. Впоследствии вы можете модифицировать ее программой экранной живописи. Формат базы данных. В SQL*Forms. Формат, который про¬ грамма SQL*Forms использует для хранения описания формы в базе данных. Этот формат поддерживает версию формы, которая может быть модифицирована программой экранной живописи (LAD). Создается и читается средствами LAD и IAC. Фрагментированная база данных. База данных, которая вре¬ менно использовалась так, что данные, принадлежащие к разным таблицам, распространяются по всей базе данных и свободное пространство может состоять из многих малых кусков (а не умеренного количества больших кусков) вследствие обширности работы или применений базы данных. Фрагментация может понизить эффективность ис¬ пользования памяти и может быть устранена за счет экспорта и импорта некоторых или всех данных.
450 Функция. Операция, которая может быть выполнена посред¬ ством помещения в какое-то выражение имени функции, сопровождаемого скобками. Большинство функций опери¬ руют одним или несколькими аргументами внутри скобок и используют при своей работе значения этих аргументов. Холодный запуск. Термин для первонального запуска базы данных Oracle. Обычно называется "инициализацией базы данных". Исполнение IOR.INIT. Частная строка. Строка в отчете, представляющая данные, восстановленные из одной строки таблицы. Частный сегмент обратной прокрутки. Сегмент обратной прокрутки, имя которого было специфицировано в файле INIT.ORA для конкретного экземпляра и который тем самым зарезервирован для этого экземпляра. Число прохождений. Число циклических повторений всех блоков в файле ВТ Появляется на экране BI в ODS. Нечасто употребляется пользователями. Шестнадцатеричная система. Система счисления, в которой используется основание 16 вместо основания 10. Представ¬ ляет числа от 10 до 15 буквами от А до F. Часто применяется для представления внутренних ("сырых") значений данных, хранимых в компьютере. Ширина отображения. В SQL*Forms ширина поля в форме. Значение поля может быть шире, чем указанная ширина изображения для поля. В таком случае пользователь может прибегнуть к горизонтальному прокручиванию, чтобы обоз¬ реть все значения. Экземпляр. Работающее активирование системы Oracle. Всегда имеется взаимно однозначное соответствие между экземп¬ ляром Oracle и глобальной областью системы (ГОС). Экземпляр обычно состоит из ГОС, нескольких обособлен¬ ных процессов и нуля или более процессов пользователя. Экспорт. Утилита системы Oracle, служащая для написания файлов операционной системы, содержащих данные из базы данных, которые впоследствии могут быть восстановлены посредством Импорта. Экстент. Прогон смежных блоков в файле базы данных, отведенных либо для сегмента табличных данных, либо для
451 сегмента индекса. Первым отведенным экстентом является "начальный" экстент. Каждый последующий экстент блоков представляет собой "приращающий" экстент. Элемент данных. Отдельная единица данных. Этап. В SQL*Forms одна операция в триггере. Этап может исполнять команду языка SQL, команду SQL*Forms или выход пользователя. Этап исполнения. Один этап исполнения оператора на языке SQL, когда вся информация, необходимая для исполнения, уже получена и оператор может фактически выполняться. Этап определения. Один этап исполнения оператора на языке SQL, в котором программа определяет результаты подлежа¬ щего исполнению запроса. Юлианская дата. Способ преобразования календарных дат, при котором каждая дата может быть выражена как уникальное целое число. Получается использованием форматной маски "J” с функциями от календарных данных. Ядро. Часть системы Oracle, выполняющая затребованные пользователем операции SQL. Кроме того, координирует работы в системах коллективного пользования. Язык манипулирования данными (ЯМД). Одна категория операторов языка SQL. Эти операторы запрашивают и обновляют реальные данные. Примеры: SELECT, INSERT, DELETE, UPDATE. Язык определения данных (ЯОД). Одна категория операторов языка SQL. Эти операторы определяют (CREATE) или удаляют (DROP) объекты базы данных. Примеры: CREATE TABLE, CREATE INDEX, DROP TABLE, RENAME TABLE. Язык Си. Язык программирования. Язык структурированных запросов (SQL). Основной интер¬ фейс пользователя для запоминания и поиска информации в базе данных. Язык управления данными (ЯУД). Одна категория операторов языка SQL. Эти операторы управляют доступом к данным и к базе данных. Примеры: GRANT CONNECT, GRANT SELECT, UPDATE ON, REVOKE DBA. AIJ. Регистрация последующего образа. См. "Файлы последу¬ ющего образа". ARH. См. "Асинхронное опережающее чтение".
452 ASCII. Стандарт использования цифровых данных для пред¬ ставления печатных символов. Сокращение от "American Standard Code Information Interchange" (американский стан¬ дартный код для обмена информацией). CCF. Создание смежного файла. CHAR. Тип данных для хранения строк символов максимум до 240 символов. CRT. Утилита системы Oracle, служащая для описания или изменения способов взаимодействия терминалов с програм¬ мным обеспечением Oracle. Обычно используется для опи¬ сания того, какие функции выполняются теми или иными ключами. DATE. Стандартный тип данных системы Oracle для хранения дат и данных о времени. Формат имеет вид 01-JAN-89. EBCDIC. Сокращение от Extended Binary Coded Decimal Interchange Code (расширенный двоично кодированный код десятичного взаимообмена). Сортирующая последовательность, исполь¬ зуемая на больших компьютерах фирмы IBM и совместимых с ними компьютерами. FSF. Программа, которая создает форму по умолчанию. Активизируется через вариант CREATE A FORM из основ¬ ного меню SQL*Forms или может быть запущена в работу как отдельная программа согласно приглашению из команд¬ ной строки вашей операционной системы. IAC. См, "Преобразователь интерактивных приложений". IAD. См. "Проектировщик интерактивных приложений". IAF. См. "Средство для интерактивных приложений". IAG. См. "Генератор интерактивных приложений". IAP. См. "Процессор интерактивных приложений". INIT.ORA. Файл параметров системы базы данных, содержащих несколько установок и имен файлов, которые используются при запуске системы в рабогу с помощью программы IOR. INTERNAL. Пользовательское имя, посредством которого ад¬ министратор базы данных может подключиться к базе данных в таких редких ситуациях, как создание базы данных. Требует специальной привилегии ревизии базы данных. ODL. См. ’’Загрузчик данных системы Oracle".
453 ODS. См. "Система отображения системы Oracle". PCTFREE. Отношение размера памяти в каждом блоке данных, подлежащих резервированию для восстановления, к строкам, хранимым в этом блоке данных. Часть блока данных, не заполненная строками при их включении в таблицу, а зарезервированная для последующих обновлений строк в этом блоке. Фактическое процентное соотношение определя¬ ется значением PCTFREE в табличном пространстве при создании таблиц. PCTINCREASE. На сколько процентов следующий экстент блоков больше, чем предыдущий экстент блоков. PCTUSED. Процентная часть места в блоке данных, которую система Oracle попытается поддерживать заполненной. Рго*С. Расширение языка программирования Си, позволяю¬ щее разрабатывать выходы пользователя и другие програм¬ мы, обращающиеся к базе данных Oracle. Предкомпилятор преобразует код на Рго*С в код на чистом языке Си. Pro*COBOL. Расширение Кобола, позволяющее разрабатывать выходы пользователя и другие программы, обращающиеся к базе данных Oracle. Предкомпилятор преобразует код на Pro*COBOL в код на чистом языке Кобол. Pro*FORTRAN. Расширение Фортрана, позволяющее разраба¬ тывать выходы пользователя и другие программы, обраща¬ ющиеся к базе данных Oracle. Предкомпилятор преобразует код на Pro*FORTRAN в код на чистом языке Фортран. Pro*Pascal. Расширение Паскаля, позволяющее разрабатывать выходы пользователя и другие программы, обращающиеся к базе данных Oracle. Предкомпилятор преобразует код на Pro*Pascal в код на чистом языке Паскаль. Pro*PL/l. Расширение PL/1, позволяющее разрабатывать вы¬ ходы пользователя и другие программы, обращающиеся к базе данных Oracle. Предкомпилятор преобразует код на Pro*PL/l в код на чистом языке PL/1. RBA (относительный адрес блока). Номер блока Oracle в пределах подразделения. ROWID. Псевдостолбец для всякой строки в базе данных. Содержит адрес каждой строки. Средство самого быстрого доступа к любой строке. ROWID содержит три части: номер подразделения, номер блока внутри подразделения и номер
454 строки внутри блока. Также тип данных в системе Oracle, служащий для поддержки такой части данных. ROWNUM. Индекс, начинающийся с 1 и идентифицирующий местоположение строки в пределах таблицы. SELECT. В SQL*Forms одна из типовых функциональных клавиш, распознаваемая программой экранной живописи. SELECT представляет собой способ указать курсором объект и сказать: "Я хочу это”. Одна из важнейших функций экранной живописи. Служит (1) для выбора поля, которое должно быть определено, скопировано, перемещено или удалено, (2) для выбора варианта из окна, (3) для указания места, где должен находиться конец линии или угол рамки. Команда SELECT. Команда языка SQL, которая выполняет запрос. Может использоваться также с дублированной таб¬ лицей для копирования значения одного поля в другое поле. Soundex. Метод представления звучания слова в символьном значении. Коды Soundex часто используются для запомина¬ ния фамилий в таком формате, что запрос найдет желаемые строки, даже если он искажает имя. SQL. См. "Язык структурированных запросов". SQLCA. См. "Область связи SQL". SQL*DBA. Утилита системы Oracle, включенная в версию 6 для использования администраторами базы данных при выполнении сопровождения и наблюдения за базой данных. SQL*Forms. Программа системы Oracle, использующая формы извлечения и ввода информации в таблицах. Должна выглядеть и иногда применяться подобно обычной бумажной форме. SQL*Loader. Средство системы Oracle, служащее для загрузки данных из файлов операционной системы в таблицы базы данных Oracle. SQL*Net. Дополнительный программный продукт, который работает с СУРБД Oracle и позволяет двум или более компьютерам, реализующим Oracle, обмениваться через сеть данными из баз данных, SQL*PIus. Программный продукт, созданный корпорацией Oracle для изготовления форматированных отчетов и напи¬ сания командных процедур для управления информацией в базе данных Oracle. SQL*Report. Программа генерации отчетов, которая включает два программных средства: RPF, т. е. форматер текстов
455 отчегкуъ Oracle, позволяющий вам управлять окончательным форматом отчетов, и RPT, т. е. генератор отчетов Oracle, позволяющий включать информацию из баз данных Oracle в ваши письма и огчеты, SYSTEM (подразделение). Первоначальное и единственное подразделение, существующее во вновь установленной сис¬ теме. Всякая система базы данных должна обладать подраз¬ делением SYSTEM, к которому отнесен хотя бы один файл. TPS. Вариант подсистемы обработки транзакций, представля¬ ющий собой совокупность доступных в версии 6 средств систем, предназначаемых, чтобы обрабатывать много парал¬ лельных транзакций с высокой степенью надежности.
Оглавление Об этой книге 5 1. Реляционная база данных 10 Терминология 11 Определения . 11 Обозначения 15 Заключение 17 2. Что такое Oracle? 18 СУРБД ORACLE 22 SQL*DBA 23 Утилита CRT . 24 Export/Import * 24 SQL* Loader 24 Подсистема обработки транзакций (TPS) 25 SQL*Plus 25 SQL* Report 25 SQL*Forms . .25 Генератор интерактивных приложений (LAG) 26 Процессор интерактивных приложений (IAP) 26 Компонент FSF 26 Утилита CRT 26 Проектировщик интерактивных приложений (IAD) 26 Преобразователь интерактивных приложений (LAC) 27 SQL* NET 27 SQL* Menu 27 Ядро Oracle 27 AUDIT_TRAIL 27 Словарь базы данных 28 Генератор последовательностей 29 Системная общая область (SGA) 30 Заключение 31 3. Изменения в версии 6 по сравнению с версией 5 32 Новая документация 32 Утилита SQL* DBA 33 Изменения в языке SQL 33 Новые или модифицированные структуры баз данных 35 Таблицы 35 Индексы 35 Кластеры 35 Табличные пространства ’ 36 Параметры обратной прокрутки 36 Временные сегменты 36 Хранение 36 ROWID 36 Новые или модифицированные файлы баз данных 37 Файлы баз данных 37 Файлы регистрации действий 37 Файлы INIT.ORA 37 Файлы управления 37 Контроль над транзакциями 38 Новые варианты замка 38 Новый алгоритм шифрования паролей 38 Генерация последовательностей 38 Коды сообщений об ошибках 38 ODL исчезнет 39 Словарь данных 39 Терминология 46 Заключение ..47 4. Структуры Oracle < 48 Структуры файлов 48 Файлы кодов СУРБД Oracle 49 Файлы базы данных 49
457 Файлы управления 51 Число файлов управления 52 Размер файлов управления 52 Файлы регистрации действий 52 Содержание файлов регистрации действий 54 Использование регистрации действий в варианте NOARCHIVELOG . .54 Использование регистрации действий в варианте ARCHIVELOG ..55 Конфигурирование файлов регистрации действий 56 Размер файлов регистрации действий ...56 Число файлов регистрации действий 56 Контрольные точки 57 Логические структуры базы данных 57 Табличные пространства . .58 Сегменты и экстенты 62 Структура объектов базы данных 68 Таблицы .; 68 Строки 68 Представления 69 Индексы 69 Первичные и внешние ключи 71 Кластеры 71 Структуры памяти 72 Общая область системы (ООС) 72 Общая область процесса 73 Контекстные области 73 Области программного обеспечения 74 Заключение 74 5. Администратор базы данных (АБД) 75 Типы АБД 76 Бюджет АБД в операционной системе 76 Пользователь АБД, называемый SYS 76 Пользователь АБД, называемый SYSTEM 77 Подключение по ключевому слову INTERNAL 78 Программа SQL*DBA 79 Системные привилегированные команды из SQL*DBA 80 Ввод команд SQL 80 Запуск командных файлов 81 Ввод команд с уровня операционной системы 81 SQL*DBA в распределенной среде 81 Наблюдение использования базы данных с помощью монитора ....81 Начальное создание базы данных 87 Запуск и выключение базы данных 91 Запуск и выключение 91 Сравнение сформированных баз данных с открытыми 91 Запуск экземпляра и базы данных 92 Раздельное формирование и открытие 93 Запуск только для администраторов базы данных 93 Запуск с автономными табличными пространствами 94 Автоматический запуск 94 Выключение экземпляра и базы данных 94 Файл параметров INIT.ORA 96 Переменные параметры INIT.ORA 97 Параметры кэш-словаря (КС) 98 Параметры общей кэш-памяти (GC) 98 Параметры, зависящие от операционной системы 99 Зависимые параметры 99 Включение и исключение пользователей 99 Восстановление базы данных 99 Отказ оператора 100 Отказ процесса 101 Отказ экземпляра 101 Отказ носителя данных 101
458 Типы восстановления 102 Прямая прокрутка при регистрации действий ...103 Обратная прокрутка с сегментами обратной прокрутки 103 Восстановление экземпляра 103 Восстановление носителя данных 104 Восстановление базы данных 104 Контрольные точки 105 Выполнение резервирования 105 Экспорт/Импорт 107 Экспорт 107 Импорт 108 Ревизия 108 Заключение 108 6. Языки SQL и SQL*Plus 109 Язык SQL 109 Типы данных .110 Пакет SQL’Plus 116 Синтаксис команд SQL в SQL’Plus 119 Синтаксис команд языка SQL*Plus 120 Редактирование команд языка SQL 121 Исправление ошибки 121 Включение новой строки 124 Присоединение текста к строке 124 Удаление строки 124 Запоминание и печать результатов 124 Сообщения HELP 125 Сообщения об ошибках 125 Прерывание изображения 125 Прекращение изображения 126 Выход из пакета SQL’Plus 126 Выполнение других программ . 126 Выполнение команды из файла 126 Команды языка SQL’Plus в командном файле 127 Команда EDIT 127 Использование SQL и SQL.Plus 128 Заключение 128 7. Операторы определения данных и манипулирования ими в языке SQL , 129 Создание базы данных 130 Создание табличного пространства 130 Создание таблицы 130 Использование имени таблицы в качестве префикса для имени столбца 132 Создание кластера 133 Создание индекса 133 Создание последовательности 134 Создание синонима 136 Изменение таблицы 137 Добавление столбца 138 Модификация столбца 139 Изменение других объектов базы данных 140 Изменение кластера 140 Изменение базы данных 141 Изменение индекса 141 Изменение последовательности 142 Изменение табличного пространства 142 Изменение пользователя 143 Копирование строк в таблицу . 143 Удаление файлов базы данных 144 Ликвидация кластера 144 Ликвидация связи базы данных 145 Ликвидация индекса 145
459 Ликвидация последовательности 145 Ликвидация синонима 146 Ликвидация таблицы 146 Ликвидация табличного пространства 146 Язык манипулирования данными (ЯМД) пакета SQL 147 Вставка 147 Обновление 149 Удаление 150 Выбор 151 Создание представления 152 Заключение 154 8. Предложения, функции, выражения и операции языка SQL ....155 Предложения 155 Предложение FROM 156 Предложение WHERE 156 Предложение ORDER BY (упорядочение) 157 Предложение GROUP BY 157 Предложение HAVING 158 Функции языка SQL 159 Функции строк символов 159 Числовые строчные функции 162 Календарные функции 163 Агрегатные функции (групповые функции) 165 Разнородные функции 168 Выражения 170 Логические выражения 170 Арифметические выражения 170 Выражения CHAR 171 Операторы 172 Количественные операторы 173 Качественные операции (логические операции) 173 Булевские операторы (AND и OR) 175 Старшинство операции 176 Заключение 177 9. Использование системы Oracle 178 Обработка транзакций 178 COMMIT (внесение данных с согласованием) 179 Точка сохранения 180 Обратная прокрутка 181 Использование псевдонимов 182 Соединения 182 Соединение представлений 183 Соединение в одном представлении более чем двух таблиц .... 184 Соединение таблиц с представлениями 184 Неуравнивающие содинения 184 Другие соединения 185 Соединение таблицы с самой собой 185 Подзапросы (вложенные команды SELECT) ...186 Возврат множества значений: ANY и ALL 187 Проверка существования 187 Возврат списка значений: IN и NOT IN 188 Возврат более одного столбца 188 Множественные подзапросы 189 Подзапросы, которые относятся более чем к одной таблице ...189 Соотносимые подзапросы (соотносимые вложенные операторы SELECT) 190 Подзапросы с использованием команды INSERT 192 Подзапросы с использованием предложения AS 192 Подзапросы обновления строк 192 Подзапросы для обновления значений 192 Заключение 192
460 10. Оптимизация производительности 193 Оптимизация в системах индивидуального пользования 194 Настройка при начальной установке системы 194 Переменные параметры для INIT.ORA 196 Хранение таблиц 196 Индексы 197 Эффективное создание индексов 197 Сочлененные индексы 198 Кластеры 200 Блоки кластеризированных данных 200 Ключ кластера 201 Создание кластеров 201 Определение размера логического блока для кластера 202 Настройка кластеров 203 Загрузка кластеров 203 Оптимизация операторов языка SQL 204 Оптимизация запросов 204 Оптимизация отрицаний . 205 Оптимизация операций OR 206 Оптимизация предложений ORDER BY 207 Оптимизация предложений ORDER BY 207 Оптимизация соединений 208 Обработка массивов 211 Написание операторов языка SQL для использования индексов ... .211 Одиночные индексы 213 Индексы и пустые значения 213 Несколько индексов по одной таблице 214 Выбор среди нескольких индексов 214 Пресечение использования индексов 215 Команда проверки правильности индекса 215 Заключение 216 11. Память и хранение 217 Поддержание файлов базы данных 217 Поддержание файлов регистрации действий 218 Добавление новых файлов регистрации действий 218 Ликвидация файлов регистрации действий 219 Переименование файлов регистрации действий 219 Поддержание сегмента обратной прокрутки 220 Создание нового сегмента обратной прокрутки 220 Общие/частные сегменты обратной прокрутки 221 Наблюдение сегментов обратной прокрутки 221 Изменение размера сегмента обратной прокрутки 221 Ликвидация сегмента обратной прокрутки 222 Поддержание табличного пространства 222 Создание нового табличного пространства 222 Расширение табличного пространства 223 Наблюдение использования памяти 224 Установка квот пользователя для хранения таблиц 224 Установка или изменение параметров хранения по умолчанию .. .224 Переименование файлов в табличном пространстве 225 Перевод табличного пространства в автономный режим 225 Перевод табличного пространства в оперативный режим .225 Ликвидация табличного пространства 226 Управление хранением таблиц и кластеров 226 Помещение таблицы в табличное пространство 227 Вычисление объема памяти, требуемой для таблицы 227 Наблюдение среднего объема используемой памяти 228 Увеличение параметров хранения таблиц 228 Управление хранение?* индексов 228 Расположение индексов р. табличных пространствах 228 Вычисление объема памяти, требуемой для индекса 229 Увеличение пара? ветров хранения' для индексов 229
461 Управление кластерами 229 Создание кластеров 230 Выбор параметра SIZE размера для кластера 230 Наблюдение объема памяти, используемой кластерами 231 Загрузка и ликвидация кластеров 231 Временные сегменты . 232 Заключение . 233 12. Защита 234 Доступ к базе данных . 235 Привилегия CONNECT 235 Привилегия RESOURCE 236 Привилегия АБД 236 Автоматическое начало сеанса 237 Исключение псльзовагелей, изменение привилегий и паролей . . . .238 Пользователь, именуемый PUBLIC 238 Доверие группе PUBLIC доступа к таблицам и представлениям . .239 Синонимы PUBLIC . 239 Доверие ограниченного доступа 239 Доверие доступа к представлениям 240 Присваивание табличных пространств по умолчанию 241 Установка квот табличного пространства для пользователей 242 Отмена доступа к табличному пространству . .242 Изменение паролей 243 Исключение пользователей 243 Ревизия 243 Разрешение ревизии 244 Наблюдение деятельности 244 Таблица контрольного журнала (SYSAUDIT_TRAIL) 245 Ревизия таблиц и представлений 245 Варианты системной ревизии 247 Ревизия словаря данных . 247 Функция USERENV .. 248 Заключение 249 13. Блокировка 250 Явные и неявные замки 250 Замки данных (замки ЯМД) 252 Режимы блокировки для замков данных 252 Замки словаря 255 Внугренние замки и защелки 256 Блокировка таблиц 256 Блокировка на уровне строк в режиме разделения строк 257 Согласованность чтения 258 Блокировка данных по умолчанию 258 Блокировка по умолчанию запросов 259 Блокировка по умолчанию для команд UPDATE и DELETE ... .260 Пресечение блокировки по умолчанию 260 Оператор установки транзакций только чтения 261 Оператор LOCK TABLE блокировки таблицы 262 Пресечение блокировки по умолчанию посредством оператора SELECT FOR UPDATE . 263 Наблюдение замков средствами пакета SQL* DBA 263 Параметры SERIALIZABLE и TABLE_LOCKING для INIT.ORA ... .264 Блокировка в пакете SQL* Forms 266 Обнаружение тупиков 267 Изображение замков в системе ODS . 268 Общие рекомендации относительно блокировки 268 Заключение 269 14. Язык PL/SQL 270 Ограничители и идентификаторы в языке PL/SQL 271 Поток управления в языке PL/SQL 272 Операторы IF 272 Циклы 273
462 Курсоры 275 Атрибуты курсора 280 Команды языка SQL, которые не требуют явного курсора 281 Исключения 282 Исключения, определенные пользователем 282 Исключения, определенные изнутри 283 Транзакции 285 Функции языка PL/SQL 287 Функции сообщений об ошибках 287 Символьные функции 288 Числовые функции 288 Календарные функции 289 Функции преобразования 290 Смешанные функции 290 Заключение 290 15. SQL*Forms 291 Определения 291 Запуск SQL*Forms 292 Создание формы 293 Создание формы по умолчанию 293 Создание заказной формы 296 Модификация формы 297 Копирование, переименование или ликвидация формы 297 Удаление формы 298 Восстановление после ошибки 298 Выход из программы экранной живописи 299 Отмена функции 299 Перемещение курсора 299 Изменение текущего блока 299 Создание блока 300 Определение блока 300 Триггеры на уровне блока 301 Работа с триггерами на уровне блока 303 Определение триггера на уровне блока 304 Окно SPECIFY DEFAULT ORDERING 305 Окно SPECIFY BLOCK OPTIONS 305 Как создать и определить поле 307 Проверка правильности поля 307 Триггеры на уровне поля 308 Вызов триггеров на уровне поля 309 Окно SPECIFY ATTRIBUTES 309 Атрибуты поля 310 Окно SPECIFY' SQL STATEMENT 313 Окно SPECIFY VALIDATION 313 Триггеры клавиш 314 Названные пользователем триггеры 314 Как работают триггеры 315 Результаты этапа 316 Следствия этапа 316 Результаты триггера 317 Атрибуты этапа триггера 317 Как программа SQL*Forms обрабатывает этапы триггера 319 Режим запроса 320 Метки успеха и отказа 321 Команды языка SQL в триггерах 322 Как команды языка SQL действуют в триггерах 323 Изображение результатов запроса 323 Выбор данных в поле 324 Текущий и контекстный блоки, запись и поле 325 Блокировка таблиц и записей 325 Использование столбца ROWID 326
453 Команды языка SQL’Forms в трштерах 326 Команда #EXEMACRO 328 Вложенные макрокоманды .....................................332 Ограничения, налагаемые на употребление кодов функций 332 Вызов одной формы из другой 333 Команда #COPY 335 Команда #ERASE 335 Команда #HOST 335 Команды выхода пользователя в триггерах 336 Написание выхода пользователя 337 Вызов выхода пользователя из триггера 337 Заключение 338 16. SQL*Report ...... .339 Форматер текстов (RPF) 339 Команды RPF 340 Использование RPF 341 Таблица по умолчанию 341 Форматирование таблицы 342 Работа с RPF 343 Табличные отчеты 345 Другие команды форматирования: .349 Исполнение RPF 353 Переключатели 353 Генератор отчетов системы Oracle (RPT) 355 Генерация отчета .356 Структура отчета .357 Вложенные отчеты 358 Операторы языка SQL* Report 358 Описательные операторы 359 Операторы макроопределений 364 Операторы исполнения макросов 366 Операторы управления программой 368 Арифметические операторы 371 Разнородные операторы 372 Заключение 374 17. Системы баз данных коллективного пользования 375 Системы разделяемого диска . 376 Распределенные базы данных 378 Клиенты и обслуживающие устройства (серверы) 379 Оптимизация производительности 380 Распределенная обработка . 380 Заключение 381 18. Проекция, соединения, функциональные зависимости и нормализация 382 Проекция 383 Естественные соединения 385 Функциональная зависимость 387 Правила вывода 388 Нормальные формы 390 Первая нормальная форма 390 Атрибуты 390 Более высокие нормальные формы 391 Усиливаемость и полнота .392 Алгоритм синтеза 396 Составные функциональные зависимости 397 Поэтапный синтез 397 Получение универсального ключа 400 Заключение 401 Приложение А. Зарезервированные слова 402 Приложение Б. Параметры для INXT.ORA .403 Глоссарий .420
Научное издание Джек Херш, Каролин Херш Работа с Oracle версии 6.0 Заведующий редакцией Э. Н.. Бадиков Ведущий редактор Т. Н. Шестакова Художник В. И. Кейдан Художественный редактор И. А. Шиляев Корректор В. Н. Николаева Технический редактор М. В. Глебова ИБ № 7943 Подписано к печати 10.08.93 г. Формат 60x881/16. Бумага офсетная №2. Печать офсетная. Гарнитура тайме. Объём 14,50 бум. л. Усл. печ. л. 28,42. Усл. кр.-отт. 28,92. Уч.-изд. л. 23,99. Изд. №6/8172. Тираж 5000 экз. Зак.1487СОЗО. Оригинал-макет подготовлен на персональном компьютере А. Н. Нарбековым и отпечатан на лазерном принтере в издательстве "Мир". Издательство "Мир” Министерства печати и информации Российской Федерации. 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2. Московская типография № 9 Министерства печати и информации Российской Федерации. 109033, Москва, Волочаевская ул., 40.
Евро-Азиатская группа пользователей ORACLE ЕАГПО (EAOUG) Группа учреждена по инициативе А/О ‘‘Корпорация LVS” - офигуюльного дистрибутора СУБД ORACLE в СНГ при активном участии Международной группы пользователей ORACLE (IOUG) и Европейской группы пользователей ORACLE (EOUG) в ноябре 1992 г. + Цель создания ЕАГПО: Информационное обслуживание программистов и пользователей ORACLE в СНГ, формирование условий, позволяющих создавать современные сосредоточенные и распределенные программные системы с помощью инстру¬ ментальных средств ORACLE (tools и CASE). + Членство в ЕАГПО: Замечательной чертой ЕАГПО является то, что в нее открыт путь как “легальным”, так и “нелегальным” пользователям ORACLE. Главный критерий - интерес к разработкам фирмы, стремление к их эффективному применению. Национальные и специальные группы пользователей ORACLE на территории СНГ могут вступать в ЕАГПО на основании соответствующего заявления, форма которого высылается по требованию. + Начиная с ноября 1992 года ЕАГПО открыла собственную электронную доску объявлений “ORACLE-Moscow”: Data phone: (095) 314-9985 v.32bis/V.42bis/MNP5 daily: 00:00 - 18:00 FidoNET: 2:5020/117 e-mail: (RFC-822) rom@lvs.msk.su Voice phone: (095) 330-16-06 Fax: (095) 330-36-93 SysOp: Victor Romanchuk Контактный, адрес: 117806 Москва, Профсоюзная ул 65, Корпорация LVS Тел: 335-56-69; Факс: (095) 330-36-93; E-mail: droz@lvs.msk.su
ДЖ. ХЕРШ. Н. ХЕРШ РАБОТА ORACLE ВЕРСИИ 6.0