ГУАП МЦИТ
ВВЕДЕНИЕ В СУБД «ORACLE» Учебное пособие и курс лабораторных работ
Часть 1
Космачёв В. М. Селезнёв Б.Н.
По...
76 downloads
255 Views
2MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ГУАП МЦИТ
ВВЕДЕНИЕ В СУБД «ORACLE» Учебное пособие и курс лабораторных работ
Часть 1
Космачёв В. М. Селезнёв Б.Н.
Под редакцией проф. Космачёва В.М. Санкт-Петербург 2005
ГУАП МЦИТ Введение в «ORACLE»
ВВЕДЕНИЕ В руководстве рассматриваются основы работы с ORACLE сервером (исключительно) средсвами Oracle SQL, Oracle PL/SQL как базовыми языками ORACLE. Сведения, используемые в разных лабораторных работах, вынесены в справочную часть в конце руководства. В настоящее время: • вызов консоли Oracle осуществляется посредством ярлыка “OraLabs” на рабочем столе (desktop’е) • лабораторные работы должны выполняться в директории (папке) “OraLabs”, которая находится в корневом директории логического диска “V:” (V:\ OraLabs) Каждый студент (бригада студентов) должн(а)каким-либо образом (например, с помощью команды SQL*Plus “HOST”) создать в V:\ OraLabs свою папку с коротким, уникальным именем. Правила формирования имени папки указываются преподавателем, например, имхо, можно использвать номер из журнала группы и т.п...
Форма описания синтаксиса Обязательные элементы заключены в фигурные скобки {}. Вы ДОЛЖНЫ вводить один из разделенных вертикальной чертой элементов. Необязательные элементы заключены в квадратные скобки []. Вы можете ввести один элемент из списка элементов, разделенных вертикальной чертой. Три точки после элемента означают, что предыдущий элемент может быть введен более одного раза. Фигурные, квадратные скобки и вертикальные черточки вводить НЕ НАДО. Списки параметров заключены в круглые скобки. Элементы списка параметров разделяются запятыми. Слова, написанные ПРОПИСНЫМИ БУКВАМИ обозначают ключевые слова. Слова, написанные строчными буквами, обозначают имена и выражения, которые могут быть различными. Терм “::=” означает “есть по определению”.
Под ред. проф. В.М.Космачёва
2
ГУАП МЦИТ Введение в «ORACLE»
Лабораторная работа №1 Среда отладки и исполнения.
1.1. SQL*Plus Приложение SQL*Plus - представляет собой интерпретатор для SQL и PL/SQL с интерфейсом командной строки. Это означает, что оно принимает от пользователя инструкции для доступа к базе данных и направляет их серверу Oracle, а результаты отображает на экране монитора. Примитивность пользовательского интерфейса SQL*Plus часто служит причиной того, что о нем отзываются пренебрежительно, а между тем это одно из самых удобных средств выполнения кода для Oracle. Здесь отсутствуют всякие забавные штучки и сложные меню.
Запуск SQL*Plus Приложение SQL*Plus можно запустить разными способами. • Как консольную программу. Программа выполняется из оболочки или командной строки • В качестве программы с псевдографическим пользовательским интерфейсом. Эта разновидность SQL*Plus доступна только в Microsoft Windows. •
Через SQL*Plus Worksheet. Графический пользовательский интерфейс Java с консольной версией SQL*Plus. Он поддерживает небольшой журнал инструкций, которые можно редактировать и повторно вызывать на выполнение.
• Через iSQL*Plus (в Oracle9i или более поздней версии). Программа выполняется из web-браузера машины, на которой работает HTTP-сервер Oracle и сервер zSQL*Plus. Для того чтобы запустить консольную версию SQL*Plus, нужно ввести команду sqlplusw в ответ на приглашение операционной системы. Это делается как в Unix, так и в Windows. Должно появиться окно (box) авторизации Oracle SQL*Plus, в котором надлежит заполнить поля , как указвано ниже.
Замечание. В настоящее время действительны имена s101 … s128 и s201 … s228. Пароль: stud, Строка связи: test
Если ввести команду sqlplusw /nolog то сразу должно появиться окно консоли Oracle SQL*Plus:
Под ред. проф. В.М.Космачёва
3
ГУАП МЦИТ Введение в «ORACLE»
Тогда подключаться к базе данных следует с помощью команды CONN[ECT], как показано ниже:
Ввод и выполнение команд Команды можно вводить как строчными, так и прописными буквами.При вводе команд SQL*Plus, SQL или PL/SQL вводите между словами хотя бы один пробел (или символ табуляции, а можно и <Enter >). Лишние пробелы, табуляция и переходы на новые строки можно использовать для облегчения последующего чтения команд. В ответ на приглашение можно вводить : • команды языка SQL, предназначенные для работы с информацией в БД; • блоки команд PL/SQL, предназначенные для работы с информацией в БД; • процедуры , функции и пакеты (хранимые процедуры выступают так-же как источник данных для клиентных приложений). • команды SQL*Plus, предназначенные для форматирования результатов запроса, или для установки параметров, редактирования и сохранения команд SQL и PL/SQL. Команды SQL, PL/SQL и SQL*Plus следует вводить в ответ на приглашение SQL> SQL*Plus сохраняет введенные Вами команды SQL и блоки PL/SQL в своем буфере (т.н. буфере SQL). Вы можете, если хотите, создать дополнительные буферы для хранения команд. Команды SQL нужно заканчивать: • символом ; (точка с запятой) в конце команды • символом / (наклонная черта) на отдельной строке • пустой строкой. Точка с запятой (;) вызовет выполнение команды. В конце последней строки введите ; <Enter> и команда выполнится. Если Вы нажмете <Enter> не введя предварительно ; , то SQL*Plus откроет новую строку и выведет на экран ее номер. Косая черта (/), стоящая на отдельной строке, также вызывает выполнение команды (последней, которая находится в буфере SQL ). После последней строки команды нажмите <Enter>, затем на открывшейся строке введите / и снова нажмите <Enter>. Терминатор косая черта имеет более сильное действие, чем терминатор точка с запятой. Поэтому при редактировании буфера SQL c помощью текстового редактора следите за отсуствием двух терминаторов одновременно. Ввод в буфер SQL нескольких команд SQL не оформленных в непоименнованный блок не разрешается Команды SQL*Plus служат для управлениея командами SQL и PL/SQL, а также для форматирования и печати результатов запросов. Для экономии времени многие команды SQL*Plus можно сокращать до одной или нескольких букв. Фактически данные команды есть средство настройки сервера для работы.
Идентификация пользователя Пользователь, имеющий доступ к базе данных , идентифицируется в ней по имени и паролю. Пользователь может владеть таблицами, представлениями данных и последовательностями. Используя команду: CONN[ECTION] UserName@stud , можно подключится к базе данных Oracle:
Под ред. проф. В.М.Космачёва
4
ГУАП МЦИТ Введение в «ORACLE»
Замечание. Имя пользователя UserName выдается каждому студенту препоодавателем и не меняется в течение всего курса лабораторных работ. На предложение “Введите пароль”/ “Enter password” следует ввести слово stud
Выход из SQL*Plus Для того чтобы выйти из SQL*Plus и вернуться в операционную систему, нужно выполнить команду EXIT. Формат команды: {QUIT | EXIT} [SUCCESS | FAILURE | WARNING | n | переменная]
Пример: SQL> EXIT SQL> QUIT SQL.SQLCODE
-- возвращает код результата последнего выполненного оператора в блоке
Если в момент выхода из приложения производилась запись выходных данных в файл, SQL*Plus прекратит ее и закроет этот файл. А что произойдет, если выйти из SQL*Plus, не сохранив изменения в базе данных? Обычно такие изменения производятся с помощью инструкций SQL или операторов PL/SQL (манипулирующих данными в базе данных), за которыми не следует явная инструкция COMMIT или ROLLBACK. Результат такой транзакции зависит от текущей установки команды AUTOCOMMIT. По умолчанию команда AUTOCOMMIT используется с атрибутом ON и все несохраненные изменения записываются в базу данных. Если же применить эту команду с атрибутом OFF, Oracle выполнит откат всех несохраненных изменений: SQL> SET AUTOCOMMIT OFF Для того чтобы разорвать соединение с базой данных, но остаться подключенным к SQL*Plus, нужно выполнить команду DISC[ONNECT], результат которой выглядит примерно так:
А зачем нужна команда DISC[ONNECT]? Если вы пишете сценарий (скрипт), который ,в ходе работы, изменяет параметры подключения к базе данных, то перед очередным подключением лучше разорвать предыдущее. В противном случае, если используется аутентификация, сценарий может автоматически подключиться к неверной учетной записи.
Под ред. проф. В.М.Космачёва
5
ГУАП МЦИТ Введение в «ORACLE»
Работа в SQL*Plus После успешной регистрации на Oracle сервере в командной строке, отмеченной приглашением SQL>, можно вводить инструкции, команды , операторы SQL*Plus, SQL, PL/SQL соответственно. Для удобства SQL*Plus предлагает пользователям PL/SQL применять команду EXEC[UTE], позволяющую не вводить команды BEGIN, END и завершающую косую черту. Консоль SQL*Plus – построчная, т.е. доступна только текущая строка консоли, отмеченная приглашением SQL>. Поэтому при реальной работе следует пользоваться SQL/TXT редактором (по умолчанию, NotePad/Блокнот). Редактор вызывается командой ED[ITOR] [FileName]
-- если FileName опущено, то в редактор загружается текущий буфер консоли
Имеется возможность переопределить редактор на более приемлемый. Содержимое буфрера консоли по умолчанию записывается в файл current_folder\afiedit.buf. Например:
После закрытия редактора содержимое файла current_folder\afiedit.buf будет возвращено в спул и станет доступным в SQL*Plus:
Под ред. проф. В.М.Космачёва
6
ГУАП МЦИТ Введение в «ORACLE»
Сохранить содержимое буфера консоли можно также командой SAVE FileName[.FileExt] Очистить экран и буфер экрана можно, нажав <Shift>+ (sqlplusw) Программы и скрипты следует создавать в редакторе (предпочтительно с поддержкой SQL), сохранять в файлах *.SQL и вызывать на выполнение командами: @FileName[.FileExt] или START FileName[.FileExt] @@FileName[.FileExt]
-- поиск файла производится в каталоге текущего исполняемого файла
GET FileName[.FileExt] Команды @, @@ и START загружают и сразу выполняют FileName, а GET – только загружает Команда SPOOL сохраняет результаты запросов в файле операционной системы . Также показывает текущее состояние буферизации.
Формат команды: SPO[OL] [{FileName[.FileExt] | OFF}]
-- где
• FileName[.FileExt] задает имя файла, в который будет производиться буферизация отображаемых выходных данных. По умолчанию LST или LIS в большинстве систем • OFF заставляет SQL остановить буферизацию. Из SQL*Plus можно выполнять команды операционной системы. Формат: HOST команда_ операционной_системы
Под ред. проф. В.М.Космачёва
7
ГУАП МЦИТ Введение в «ORACLE» Чтобы обеспечить передачу сервером на терминал вывода программы используйте Команда SQL*Plus SET SERVEROUTPUT {ON | OFF} включает / выключает передачу сервером на терминал вывода программы Команда SQL*Plus ECHO {ON | OFF} включает / выключает вывод на терминал самих команд. Чтобы буферировать вывод генерируемый командами из командного файла без отображения его на экране, используйте SET TERMOUT OFF. SET TERMOUT OFF не влияет на вывод команд, введенных интерактивно. Команда SQL*Plus SET LINESIZE n определяет ширину строки вывода (в символах) Команда SQL*Plus SET PAGESIZE n определяет высоту страницы вывода (в строках)
Вопросы и задания к Л.р. № 1 1. Что такое реляционная база данных ? 2. В чем разница между первичным ключом и уникальным ключом ? 3. Кто заложил теоретические основы языка SQL ? 4. Какая компания разработала прообраз языка SQL ? 5. Oracle – это : b)
Иерархическая база данных
c)
Сетевая база данных
d)
Реляционная база данных
e)
Объектно-ориентированная база данных
5. SQL*Plus – это: a)
Другое название языка SQL
b)
Расширение языка SQL, разработанное корпорацией Oracle
c)
Процедурно-ориентированный SQL
d)
Компиллятор SQL
e)
Командный интерпетатор SQL, PL/SQL с интерфейсом командной строки (CLI)
6. SQL*Plus позволяет: a)
Обработать любой оператор SQL
b)
Выполнять функции администрирования БД
c)
Форматировать выод в виде отчетов
d)
Принимать данные из файлов
e)
Все вышесказанное
7. Войти в Oracle, используя shortcut на рабочем столе. Под ред. проф. В.М.Космачёва
8
ГУАП МЦИТ Введение в «ORACLE» 8. Используя средства SQL*Plus, создать для себя уникальный рабочий директорий, сформировав имя (директория) согласно указаниям преподавателя 9. Используя средства SQL*Plus, вызвать редактор “Блокнот” (из SQL*Plus) и создать в своем рабочем директории файл lr1_10.sql, содержащий следущее: BEGIN DBMS_OUTPUT.PUT_LINE('Получилось !'); END; 10. Тремя способами вызвать на исполнение файл lr1_10.sql. Добиться появления в окне SQL*Plus сообщения 'Получилось !' 11. Вставить в файл lr1_10.sql (перед первой строкой) заголовок-комментарий типа – LR 1.10 12. Получить на экране вывод не только результатов работы программы, но и самого исходного текста. 13. Обеспечить экранный вывод в Ваш рабочий директорий в файл lr1_10 14. Выполнить еще раз файл lr1_10 и показать результат преподавателю. 15. Создайте в своем рабочем директории файл Logon.sql, в котором будут заданы требуемые настройки среды. 16. Для правильного завершения сеанса SQL*Plus следует ввести команду: f)
Alt_F4
g)
Ctrl_C
h)
End
i)
Quit
j)
Exit
Лабораторная работа № 2 Основные объекты Oracle К числу основных объектов Oracle отосятся: таблица, представление, пользователь, последовательность. • Таблица (TABLE) является базовой структурой реляционной модели.Вся информация в базе данных хранится в таблицах. Таблицы состоят из множества поименованных столбцов или атрибутов. Множество значений столбца определено спомощью ограничений целостности. Полное имя таблицы в базе данных состоит из имени схемы, в данной реализации совпадающем с именем пользователя, создавшего таблицу, и собственно имени таблицы. Таблица может быть пустой или состоять из одной или более строк значений атрибутов. Строки значений атрибутов таблицы называются также кортежами. • Представление (VIEW) - это поименованная, динамически поддерживаемая сервером выборка из одной или нескольких таблиц. Оператор SELECT, определяющий выборку, ограничивает видимые пользователем данные. Сервер гарантирует актуальность представления, то есть формирование представления (материализация соответствующего запроса) производится каждый раз при использовании представления. Используя представления, администратор ограничивает доступную пользователям часть базы данных только теми данными, которые реально необходимы. • Пользователь (USER) - объект, обладающий возможностью создавать и использовать другие объекты ORACLE, а также запрашивать выполнение функций сервера. К числу таких функций относятся организация сессии, изменение состояния сервера и базы данных, запрос на выполнение операторов SQL и др. Для упрощения решения задач идентификации и именования в базе данных ORACLE поддерживает объекты: последовательность и синоним. • Последовательность (SEQUENCE) - это объект, обеспечивающий генерацию уникальных номеров в условиях многопользовательского асинхронного доступа. Обычно элементы последовательности используются для вставки уникальных идентификационных номеров для элементов таблиц базы данных.
• Синоним (SYNONYM) - это альтернативное имя-псевдоним объекта ORACLE, который позволяет
пользователям базы данных иметь доступ к данному объекту. Синоним может быть частным и общим. Общий Под ред. проф. В.М.Космачёва
9
ГУАП МЦИТ Введение в «ORACLE» (public) синоним позволяет всем пользователям базы данных обращаться к соответствующему объекту по альтернативному имени. Для управления эффективностью доступа к данным Oracle поддерживает объекты: индекс, табличная область и кластер. • Индекс (INDEX) - это объект базы данных, создаваемый для повышения производительности выборки данных. Индекс создается для столбцов таблицы или для представления в пространстве базы данных и обеспечивает более быстрый доступ к данным базы данных за счет хранения прямых ссылок на место расположения строк, содержащих требуемые данные. • Табличная область (TABLESPACE) - именованная часть базы данных, используемая для распределения памяти для таблиц и индексов. • Кластер (CLUSTER) - объект, задающий способ совместного хранения данных нескольких таблиц, содержащих информацию, обычно обрабатываемую совместно. Кластеризация столбцов таблиц позволяет уменьшить время выполнения выборки. Строки таблиц, имеющие одинаковое значение в кластеризованных столбцах, хранятся в базе данных специальным образом. Для эффективного управления разграничением доступа к данным Oracle поддерживает объект роль. • Роль (ROLE) - именованная совокупность привилегий, которые могут быть предоставлены пользователям или другим ролям. ORACLE поддерживает несколько стандартных или предопределенных ролей. Для программирования алгоритмов обработки данных, реализации механизмов поддержки целостности базы данных Oracle использует объекты: процедура, функция, пакет и триггер. • Процедура (PROCEDURE) — это поименованный, структурированный набор переменных и операторов SQL и PL/SQL, предназначенный для решения конкретной задачи. • Функция (FUNCTION) — это поименованный, структурированный набор переменных и операторов SQL и PL/SQL, предназначенный для решения конкретной задачи и возвращающий значение переменной. • Пакет (PACKAGE) — это поименованный, структурированный набор переменных, процедур и функций, связанных единым функциональным замыслом. Например, ORACLE поставляет пакет DBMS_OUTPUT, в котором собраны процедуры и функции, предназначенные для организации ввода-вывода. • Триггер (TRIGGER) — это хранимая процедура, которая автоматически запускается тогда, когда происходит связанное с триггером событие. Обычно события связаны с выполнением операторов INSERT, UPDATE, DELETE в таблице.
Основные объекты Oracle создаются, модифицируются, уничтожаются средствами языка определения данных DDL (Data Definition Language), который является подмножеством языка SQL.
Таблицы Таблица является базовой структурой реляционной модели. Полное имя таблицы в базе данных состоит из имени схемы, как правило, совпадающем с именем пользователя, и имени таблицы. Оператор определения таблиц имеет следующий синтаксис: CREATE TABLE [схема.]имя_таблицы ( {ограничение_целостности_таблицы | имя_столбца тип_данных_столбца [DEFAULT выражение] [ограничение_целостности_столбца...]},...) [{CLUSTER имя_кластера(имя_столбца[,...]) | {PCTFREE целое | PCTUSED целое | INITRANS целое | MAXTRANS целое | TABLESРАСЕ имя_табличной_области | STORAGE размер памяти | { RECOVERABLE | UNRECOVERABLE}}...] [PARALLEL возможность_параллельной_обработки] [{ENABLE проверяемые_ограничения_целостности | DISABLE игнорируемые_ограничения_целостности}...] Под ред. проф. В.М.Космачёва
10
ГУАП МЦИТ Введение в «ORACLE» [AS запрос] [CACHE | NOCACHE] • DEFAULT указывает на то, что при вводе данных соответствующему столбцу будет присвоено значение, определенное переменной выражение, если в операторе INSERT не указано явно другое значение столбца. Тип данных выражение должен соответствовать типу данных столбца и выражение не должно содержать ссылок на другие выражения. • Ключевые слова PCTFREE, PCTUSED, INITRANS, MAXTRANS, TABLESPACE, STORAGE, RECOVERABLE, UNRECOVERABLE характеризуют пространство, распределяют его при работе с таблицей. • PCTFREE определяет процент пространства блока, который резервируется для модификации таблицы. Допустимые значения от 0 до 99. Значение по умолчанию 10, то есть при заполнении каждого блока 10% пространства остается не использованным. Это пространство используется для записи в него данных при выполнении в дальнейшем модификации строк таблицы. • PCTUSED определяет минимальный процент использования пространства блока, при котором в него вводятся данные, по умолчанию 40, то есть если в блоке занято менее 40% пространства, в него вводятся данные при выполнении операции вставки. Сумма значений параметров PCTFREE и PCTUSED не должна превышать 100. • INITRANS определяет начальное число параллельных транзакций, которые могут выполняться для модификации данных блока. Значение по умолчанию 1. • MAXTRANS определяет максимальное число параллельных транзакций, которые могут выполняться для модификации данных блока. В большинстве случаев явное задание этих параметров не требуется. • TABLESPACE определяет имя табличной области, в которой будет размещена таблица. Если начение параметра не определено, то таблица размещается в табличной области, заданной по умолчанию для пользователя, который является владельцем схемы, содержащей таблицу. • STORAGE определяет объем внешней памяти, выделяемый под таблицу. Для больших таблиц целесообразно явно выделять требуемую память, чтобы уменьшить число запросов на динамическое выделение пространства. • RECOVERABLE и UNRECOVERABLE. Для управления записью в журнальный файл контрольной информации используются ключевые слова RECOVERABLE, UNRECOVERABLE. Значение UNRECOVERABLE может быть использовано только с ключевым словом AS подзапрос, при этом операция создания таблицы выполняется быстрее за счет исключения записи управляющей информации в журнал. Но при этом автоматическое восстановление операции создания таблицы в случае сбоя становится невозможным. • CLUSTER указывает привязку столбцов таблицы к кластеру. Обычно столбцы кластера образуют из элементов первичного ключа. • ENABLE указывает на включение ограничений целостности для данной таблицы. Соответствующее ограничение целостности должно быть определено в данном предложении создания таблицы. По умолчанию все ограничения целостности, определенные в предложении, включаются. • DISABLE указывает на выключение ограничений целостности для данной таблицы. Соответствующее ограничение целостности должно быть определено в данном предложении создания таблицы. • AS запрос включает в создаваемую таблицу строки, являющиеся результатом выполнения запроса. Необходима определенная осторожность при использовании вставки строк через подзапрос и определение ограничений целостности в том же предложении. Если результат запроса не соответствует ограничениям целостности, то Oracle не создает таблицу и возвращает сообщение об ошибке. • CACHE указывает на то, что блоки, выбираемые из таблицы, помечаются в системном кеше, как наиболее используемые. Оно рекомендуется для маленьких таблиц, используемых для преобразования кодов в значения. По умолчанию используется NOCACHE, для которого выбранные блоки помещаются в конец таблицы частот обращений к кешу. • запрос - есть предложение SELECT. Столбцы, извлекаемые запросом, должны соответствовать столбцам, перечисленным в операторе CREATE TABLE. Тип данных и ширина столбцов создаваемой таблицы при этом получаются такими же, как у столбцов, извлекаемых запросом. Если столбцы в запросе имеют полностью определенные уникальные имена, то имена столбцов после CREATE TABLE можно опустить - они будут унаследованы от запроса. После создания таблицы в нее загружаются данные, извлеченные запросом. В запросе нельзя употреблять предложения ORDER BY и FOR UPDATE OF. Параметры элементы_таблицы, в случае использования запроса, могут содержать только имена столбцов. Чтобы добавить столбец или ограничение, следует использовать оператор ALTER TABLE...ADD. Чтобы модифицировать ограничение его нужно сначала удалить (ALTER TABLE DROP CONSTRAINT), а затем вновь добавить (ADD).
Под ред. проф. В.М.Космачёва
11
ГУАП МЦИТ Введение в «ORACLE»
Удалить таблицу | кластер можно командой DROP TABLE имя_таблицы DROP CLASTER имя_кластера
Типы данных столбца, как правило, следует применять следующие: • Строковые типы Тип CHARACTER — используется для хранения строк фиксированной длины.
Синтаксис: { CHARACTER[(длина)] | CHAR[(длина)] } Максимальное значение параметра длина — 255 символов. Типы VARCHAR и VARCHAR2 используется для хранения строк переменной длины.
Синтаксис: VARCHAR2[(длина)] Максимальная ширина столбца базы данных типа VARCHAR2 равна 4000 байт VARCHAR[(длина)] Максимальное значение параметра длина — 2000 символов.
Замечания. 1.
Рекомендуется использовать VARCHAR2
2.
Если длина строки не указана явно, она полагается равной единице во всех случаях
LONG[(длина)] Используется для хранения больших строк переменной длины. Если параметр длина не указан, то предполагается, что у строки длина 2 мегабайта, максимальная длина — 2 гигабайта. Тип LONG оставлен для совместимости с предыдущими версиями ORACLE. Вместо него рекомендуется использовать тип CLOB
• Числовые типы Тип NUMBER — используется для представления чисел с заданной точностью.
Синтаксис: NUMBER[ (точность [.масштаб] ) ] Если значение параметра точность не указано явно, оно полагается равным 38. Значение параметра масштаб по умолчанию предполагается равным 0. Значение параметра точность может изменяться от 1 до 38; значение параметра масштаб может изменяться от -84 до 128. Использование отрицательных значений масштаба означает сдвиг десятичной точки в сторону старших разрядов. Например, определение NUMBER(7,-3) означает округление до тысяч.
• Битовые строки Тип RAW — используется для хранения битовых строк переменной длины. Отличие типа RAW от типов CHAR, VARCHAR2 состоит в том, что для типов символьных строк ORACLE производит автоматическое преобразование данных при их передаче между клиентом и сервером.
Синтаксис: RAW[(длина)] Параметр длина измеряется в байтах. Максимальное значение — 255 байт. Тип LONG RAW — используется для хранения больших битовых строк переменной длины.
Синтаксис: LONG RAW [(длина)] Параметр длина измеряется в байтах. Если длина строки не указана явно, она полагается равной 2 мегабайтам. Максимальное значение параметра длина — 2 гигабайта символов. Для переменных типа LONG RAW невозможно построение индекса. Под ред. проф. В.М.Космачёва
12
ГУАП МЦИТ Введение в «ORACLE» Тип LONG RAW оставлен для совместимости с предыдущими версиями ORACLE. Вместо него рекомендуется использовать тип BLOB
• Типы дата и время Тип DATE используется для хранения даты и времени. Поддерживаются даты с 01.01. 4712 до нэ. до 31.12.4712 нэ. Для присваивания даты обычно используется функция ТО_DАТЕ( 'символьная_строка_даты', 'формат_даты' )
Синтаксис: DATE Замечание. Подробнее типы данных ORACLE рассматриваются ниже.
CONSTRAINT (Ограничения) Под ограничениями понимаются условия, накладываемые на таблицу При этом данные, не удовлетворяющие данному условию, не попадут в таблицу.
Синтаксис описания ограничений для таблицы: UNIQUE | PRIMARY KEY столбец, столбец,... CONSTRAINT имя_ограничения FOREIGN KEY столбец, столбец,... REFERENCES [схема.]таблица столбец, столбец,... CONSTRAINT имя_ограничения CHECK условие CONSTRAINT имя_ограничения
Синтаксис описания ограничений для столбца: столбец NULL | NOT NULL CONSTRAINT имя_ограничения UNIQUE | PRIMARY KEY CONSTRAINT имя_ограничения REFERENCES [схема.]таблица столбец CONSTRAINT имя_ограничения CHECK условие CONSTRAINT имя_ограничения Предложение, описывающее ограничение, позволяет определить диапазон допустимых значений одного столбца (ограничение для столбца) или группы столбцов (ограничение для таблицы). Каждый оператор INSERT, UPDATE и DELETE будет проверяться на соответствие правилам, установленных ограничением, и будет выполнен успешно только если он удовлетворяет этим правилам. Ограничения для таблиц являются частью глобального описания таблицы, типа: CREATE TABLE employee (PROJECT NUMBER, EMPLOYEE NUMBER, PRIMARY KEY (PROJECT, EMPLOYEE)) В свою очередь ограничения для столбцов являются локальными для указанных столбцов, к примеру, CREATE TABLE dept (DEPTNO NUMBER PRIMARY KEY,...) Ограничения описываются в операторах CREATE TABLE и ALTER TABLE. Оператор ALTER TABLE позволяет добавлять и уничтожать ограничения. Все определенные ограничения заносятся в словарь данных. Если Вы не дали ограничению имя, то оно будет названо SYS_Cn, где n -- целое число, используемое для обеспечения уникальности имени в базе данных. • Столбец, к которому относится ограничение NULL | NOT NULL разрешает |запрещает столбцу иметь пустое значение (NULL) • UNIQUE указывает, что все значения в этом столбце должны быть разными. Каждый такой столбец должен быть описан с атрибутом NOT NULL. и не должен быть первичным ключом, поскольку первичный ключ и так уникальный • PRIMARY KEY определяет столбец как первичный ключ • FOREIGN KEY столбец, столбец...REFERENCES [схема.]таблица столбец,столбец...-определяет столбец (или столбцы) как внешний ключ к [схема.]таблица столбец. Подразумеваемый столбец—первичный ключ таблицы. Под ред. проф. В.М.Космачёва
13
ГУАП МЦИТ Введение в «ORACLE» • CHECK условие -устанавливает условие, которому должно удовлетворять значение столбца. В описании условия CHECK для столбца можно ссылаться только на тот столбец, к которому оно относится. Условие CHECK для таблицы может ссылаться на несколько столбцов.
Пример. Чтобы описать таблицу staff (предполагается, что Вы [схема.] stud1_1), следует ввести: CREATE TABLE staff ( empno NUMBER NOT NULL PRIMARY KEY, ename CHAR(20) NOT NULL CHECK (ename = UPPER), job CHAR(10), mgr NUMBER REFERENCES stud1_1.staff(empno), hiredate DATE CHECK (hiredate >= SYSDATE - 7), sal NUMBER(10,2) CHECK (sal > 800), comm NUMBER(9,2) DEFAULT NULL, deptno NOT NULL REFERENCES stud1_1.dept(deptno) ) В системе определена таблица DUAL , которую можно использовать для вычисления выражений, работы с поледовательностями, отладки хранимых процедур и функций и мн.др., например: SELECT (5*2) FROM dual SELECT my_seq.CURRVAL INTO my_per FROM dual
-- для PL/SQL
Ограничение FOREIGN KEY/REFERENCES: • не дает выполниться операторам INSERT и UPDATE, если соответствующих значений нет в таблице, содержащей первичный ключ. • не позволяет выполниться оператору DELETE, если его результат приводит к нарушению ограничения REFERENCES. • должно ссылаться на столбец первичной таблицы (т.е. содержащей первичный ключ), определенный как PRIMARY KEY или UNIQUE. • если не указан столбец (столбцы), то ограничение будет использовать тот столбец первичного ключа, который определен как PRIMARY KEY. • может ссылаться только на таблицу. На представление данных или кластер ссылаться нельзя. • требует, чтобы таблица, хранящая первичный ключ, принадлежала Вам и чтобы Вы имели к доступ с правом REFERENCE либо к таблице, либо только к столбцам, на которые Вы ссылаетесь при описании ограничения. • никак не ограничивает использование тех же таблиц в описании других ограничений. • требует совпадения типов данных в столбце (столбцах) внешнего ключа и в столбце (столбцах), к которым описывается ограничение. • может ссылаться на ту же таблицу, что и в операторе CREATE TABLE. • в одном ограничении не может ссылаться на столбец более одного раза.
Ограничения могут описываться в команде CREATE TABLE, либо добавляться/отменяться командой ALTER TABLE. Например, запись CREATE TABLE tb2 (id number(4) primary key, fk number(4) REFERENCES tb1(id) ) Под ред. проф. В.М.Космачёва
14
ГУАП МЦИТ Введение в «ORACLE» эквивалентна паре записей: CREATE TABLE tb2 (id number(4) primary key, fk number(4) ) и ALTER TABLE tb2 ADD FOREIGN KEY(fk) REFERENCES tb1(id) Подробнее ограничения целостности будут рассмотрены ниже.
Псевдостолбцы Псевдостолбцы в SQL очень схожи с обыкновенными столбцами, за исключением того, что они не хранятся ни в одной таблице. Из псевдостолбцов можно извлекать данные, но нельзя добавлять, обновлять и удалять (т.е. нельзя делать INSERT, UPDATE и DELETE) . ПСЕВДОСТОЛБЕЦ
СОДЕРЖИТ
Последоват.NEXTVAL
Следующее сгенерированное число
Последоват.CURRVAL
последнее сгенерированное число
ROWID
уникальный идентификатор строки таблицы
ROWNUM
порядковый номер строки в результатах выборки из одной или нескольких таблиц
LEVEL
1= отец, 2= сын, 3= внук, и т.д.
Ключи • Первичным ключом (PRIMARY KEY) называется один или несколько столбцов, предназначенных для однозначной идентификации строк в таблице. Значения первичных ключей не должно изменяться и не должно быть пустым. • Внешним ключом (FOREIGN KEY) называется столбец, содержащий значения первичного ключа другой таблицы. Внешний ключ может принимать пустое значение. К примеру, если столбец DEPTNO является первичным ключом в таблице DEPT, то столбец DEPTNO в таблице EMP будет внешним ключом, т.к. он содержит ссылки на DEPTNO таблицы EMP. • Уникальный ключ (UNIQUE KEY) во всем аналогичен первичному, за исключением того, что он предназначается для обеспечения уникальности каждой записи, например, номера телефона или номера водительских прав. Первичный ключ может не содержать никакой полезной информации, а служить только для идентификации строк. В таблице может быть несколько первичных ключей.
Представление (VIEW) Представление есть виртуальная таблица не существующая реально но с которой можно обращаться как с обычной таблицей. В представлении объединены средства выборки данных и обработки информации. Формат команды создания: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW имя_предст альт_имя, альт_имя,... AS запрос [WITH CHECK OPTION] [WITH READ ONLY] [CONSTRAINT ограничение] • FORCE | NOFORCE позволяет создавать представление с учетом или без учета того, существуют ли применяемые в нем таблицы. Опция NOFORCE применяется по умолчанию и определяет необходимость существования таблиц, применяемых в представлении, до создания этого представления Под ред. проф. В.М.Космачёва
15
ГУАП МЦИТ Введение в «ORACLE» • Запрос - есть оператор SELECT (без предложений ORDER BY и FOR UPDATE OF),который определяет, из каких столбцов и строк будет состоять создаваемое представление данных. Может содержать алиасы столбцов • WITH CHECK OPTION - указывает, что следует не допускать вставки и обновления данных через данное представление данных, если они не будут “видны” через него. Это бывает полезно, когда представление данных основывается на других представлениях. • READ ONLY - позволяет запретить применение к этому представлению каких-либо операторов DML Представление данных можно использовать вместо настоящей таблицы в операторах SELECT, INSERT, UPDATE, DELETE, но при этом в операторе SELECT должны присутствовать: • объединение • предложения GROUP BY, CONNECT BY или STARTWITH • предложение DISTINCT, псевдо-столбцы (например, ROWNUM) или выра-жения в списке столбцов. Можно также обновлять вирт. таблицы, содержащие псевдо столбцы (с помощью оператора UPDATE), если не пытаться изменить их значения.
Пример CREATE VIEW ed AS SELECT e.empno, e.ename, d.deptno, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno; View created. SELECT column_name, updatable FROM user_updatable_columns WHERE table_name = ’ED’; COLUMN_NAME UPD; ––––––––––––––– ––– ENAME YES DEPTNO NO EMPNO YES
LOC NO Индекс Применяется для повышения скорости выборки и для сортировки (вместо сортировки ☺). Использовани индекса эффективно, если размер выборки, возвращаемой запросом, не превышает 25% (чем меньше, тем лучше). Oracle автоматически использует только те индексы, которые есть в наличии. Автоматически создаются индексы для главного ключа и для уникальных полей таблицы . Для всех остальных требуется создавать. Индекс также может быть использован для обеспечения уникальности значений. Индексировать данные можно максимум по 16 столбцам. Можно создавать несколько индексов к разным сочетаниям столбцов , однако следует помнить, что каждый индекс увеличивает время, затрачиваемое на обновление данных. Формат команды создания: CREATE [UNIQUE] INDEX [schema.]index_name ON { table_name (column_name [ASC|DESC] [, column_name[ASC|DESC]] [, ...]) | CLUSTER [schema.]cluster } [TABLESPACE tablespace_name] [STORAGE parameters] ; [INITRANS integer] [MAXTRANS integer] [PCTFREE integer] [NOSORT]
Под ред. проф. В.М.Космачёва
16
ГУАП МЦИТ Введение в «ORACLE» • UNIQUE - гарантирует, что в таблице никогда не будет строк с одинаковыми значениями во всех индексируемых столбцах. Ключ не обязателен. • index_name, table_name - имя создаваемого индекса и имя таблицы, к столбцам которой создается индекс. • column_name - имя столбца таблицы. • ASC/DESC - Индексы создаются в восходящем/нисходящем порядке (по умолчанию - ASC). • cluster - имя кластера, к которому создается индекс. • tablespace_name - имя области хранения, в которой будет храниться индекс. • PCTFREE - процент пространства в каждом индексном блоке, оставляемого пустым для дальнейших вставок и обновлений (по умолчанию 10). При указании 0 вставка не допустима • NOSORT - отключает сортировку строк перед созданием индекса (если строки уже отсортированы в восходящем порядке). Употребление этого параметра может значительно ускорить процесс создания индекса. Параметр NOSORT не может применяться при создании кластерного индекса. • Параметры INITRANS и MAXTRANS имеют такое же значение, как и в операторе CREATE TABLE. Индекс может быть создан на одном или нескольких столбцах. Если индекс содержит более одного столбца, он называется составным ключом. Индексы создаются автоматически при указании ограничения PRIMARY KEY в операторе создания таблицы. Если применяется фраза UNIQUE, то будет возвращено сообщение об ошибке при попытке вставить повторяющееся значение в столбце, на котором определен уникальный индекс. Индексы используются автоматически при указании индексированного столбца во фразе WHERE
Команда DESC[RIBE] объект позволяет получить описания объектов: таблиц, представлений и др. Обычному пользователю доступны следующие представления словаря данных, в которых отображается информация о таблицах, доступных пользователю: USER_TABLES -- Отображает информацию о таблицах, принадлежащих пользователю USER_CONSTRAINTS -- Отображает информацию об ограничениях ALL_TABLES -- Отображает информацию о всех таблицах, доступных пользователю
Пример. SQL> desc user_tables Имя Пусто? Т ип ----------------------------------------- -------- ---------------------------TABLE_NAME NOT NULL VARCHAR2(30) TABLESPACE_NAME VARCHAR2(30) CLUSTER_NAME VARCHAR2(30) ......... SQL> select table_name from user_tables 2 / TABLE_NAME -----------------------------BONUS CARRIAGE DEPT DUMMY EMP EXIBITION LOG ORGANIZATION PETS R1 Под ред. проф. В.М.Космачёва
17
ГУАП МЦИТ Введение в «ORACLE» SALGRADE TABLE_NAME -----------------------------TB1 TB2 14 строк выбрано
Изменения обьектов ALTER TABLE (модифицировать таблицу) ALTER TABLE польз.таблица ADD описание_столбца | ограничение_таблицы, описание_столбца | ограничение_для_таблицы,... MODIFY описание_столбца, описание_столбца,... DROP CONSTRAINT ограничение, ограничение,... PCTFREE целое PCTUSED целое INITRANS целое MAXTRANS целое STORAGE предложение BACKUP Оператор ALTER TABLE позволяет добавлять в таблицу столбцы и ограничения, изменять размер и тип данных существующих столбцов, изменять установки NULL/NOT NULL, удалять ограничения, изменять схему хранения таблицы и заносить в словарь данных информацию о том, что была создана резервная копия таблицы (т.е. был выполнен выполнен BACKUP).
Пример ALTER TABLE PriceList ADD Manufacturer VARCHAR(24) ALTER TABLE PriceList MODIFY Vendor varchar(16) ALTER TABLE PriceList DROP COLUMN Manufacturer
-- добавили столбец “Manufacturer” -- изменили столбец “Manufacturer” -- удалили столбец “Manufacturer”
ALTER SEQUENCE (изменить последовательность) ALTER SEQUENCE польз.последовательность INCREMENT BY целое MAXVALUE целое | NOMAXVALUE MINVALUE целое | NOMINVALUE CYCLE | NOCYCLE CACHE целое | NOCACHE ORDER | NOORDER Оператор ALTER SEQUENCE предназначен для: • изменения приращения при генерации последовательности чисел; • переустановки или удаления параметров MINVALUE или MAXVALUE; • включения или выключения характеристик CACHE и ORDER. Значение CACHE должно быть меньше разности между MINVALUE и MAXVALUE. Если Вы используете параметр CYCLE, то восходящая последовательность после достижения MAXVALUE выдаст MINVALUE, а нисходящая—после достижения MINVALUE выдаст MAXVALUE. Чтобы начать генерацию последовательности с нового числа надо удалить (DROP), а затем заново создать (CREATE) последовательность. Под ред. проф. В.М.Космачёва
18
ГУАП МЦИТ Введение в «ORACLE»
Удаление объектов DROP CLUSTER [схема.]кластер [INCLUDING TABLES] Удаляет указанный кластер из базы данных. Уничтожение кластера вызывает также уничтожение индекса кластера и освобождение занимаемого пространства в области хранения. INCLUDING TABLES вызывает уничтожение всех таблиц, входящих в кластер. Если эта фраза опущена, то таблицы должны быть удалены до уничтожения кластера. Удаление кластеризованной таблицы исключает ее из кластера. Таблицу нельзя просто “раскластеризовать”. Для этого нужно создать такую же таблицу, только без использования параметра CLUSTER. Например: CREATE TABLE new AS SELECT * FROM old Затем уничтожьте старую таблицу: DROP TABLE old и переименуйте новую: RENAME new TO old DROP INDEX [схема.]индекс Удаляет указанный индекс из базы данных. Чтобы сделать это, Вы должны либо быть владельцем индекса, либо иметь права DBA. Если имя [схема.] опущено, то подразумевается пользователь, выполняющий оператор. После уничтожения индекса освобождается все пространство, занимаемое им в области хранения. DROP SEQUENCE [схема.]последовательность Оператор DROP SEQUENCE удаляет из базы данных указанную последовательность. Чтобы удалить последовательность, Вы должны либо быть ее владельцем, либо иметь права DBA. Если имя [схема.] опущено, то подразумевается имя пользователя, выполняющего оператор. Единственный способ “перезапустить” последовательность - это уничтожить и заново создать ее. К примеру: предположим, что принадлежащая Вам последовательность POWERS находится на числе 288, а Вы хотите заново начать генерацию чисел с 12. Тогда нужно выполнить следующее: DROP SEQUENCE powers CREATE SEQUENCE powers . . START WITH 12 DROP [PUBLIC] SYNONYM [схема.]синоним Удаляет из базы данных указанный синоним. Слово PUBLIC нужно употреблять, если синоним доступен всем пользователям. Чтобы уничтожить общедоступный или чужой синоним, необходимо иметь права DBA. Для модификации синонима его следует уничтожить и создать заново. DROP TABLE [схема.]таблица Удаляет из базы данных указанную таблицу и всю хранящуюся в ней информацию. Чтобы уничтожить ,таблицу Вы должны быть либо ее владельцем, либо иметь права DBA. Все соответствующие индексы уничтожаются вместе с таблицей. Представления данных и синонимы, ссылающиеся на уничтоженную таблицу, остаются, но становятся ошибочными. Их нужно или тоже уничтожить, или откорректировать так, чтобы они стали действительными. Блоки в соответствующей области хранения, которые занимали данные и индексы таблицы, освобождаются (если таблица не была кластеризована). Оператор DROP CLUSTER INCLUDING TABLES уничтожает все таблицы, входящие в кластер. Небесполезно перед уничтожением таблицы просмотреть представление. данных USER_CROSS_REFS в словаре данных, чтобы найти все ссылки на подлежащую уничтожению таблицу. DROP VIEW [схема.]предст_данных Удаляет из базы данных указанное представление данных (виртуальную таблицу). Чтобы уничтожить представление данных нужно быть либо его владельцем, либо иметь права DBA. После уничтожения представления данных все ссылающиеся на него представления и синонимы остаются, но становятся недействительными. Их нужно либо удалить, либо откорректировать так, чтобы они стали действительными. Чтобы изменить представление данных, его Под ред. проф. В.М.Космачёва
19
ГУАП МЦИТ Введение в «ORACLE» следует уничтожить и создать заново. Альтернативный вариант - использование термов CREATE OR REPLACE Перед уничтожением представления необходимо просмотреть представлении данных USER_CROSS_REFS в словаре данных, чтобы найти все ссылки на подлежащее уничтожению представление
Вопросы и задания к Л.р. № 2 1. Для чего применяется оператор DESCRIBE ? 2. Что такое таблица ? 3. Из каких элементов состоит таблица ? 4. В чем разница между полями, содержащими значения 0 и NULL ? 5. С помощью оператора CREATE TABLE имя_таблицы AS SELECT может быть создана копия таблицы ? (Да/Нет) 6. Можно отменить команду DROP COLUMN и возвратить столбец в таблицу ? (Да/Нет) 7. Создайте таблицу people со столбцами • Dept (числовое 4 разряда) • Last_name (символьное 10 позиций) • Start_date (дата) • Salary (числовое 6 разрядов с двумя десятичными знаками) 9. Вставьте следующие данные в таблицу (применив подстановочный символ &): • 10, SMITH, SYSDATE, 10000 • 10, JONES, SYSDATE, 20000 • 20, KING,
SYSDATE, 15000 Под ред. проф. В.М.Космачёва
20
ГУАП МЦИТ Введение в «ORACLE» • 20, JONES, SYSDATE, 18000 • 20, LAMER, SYSDATE, 12000 10. Объясните, в чем ошибка и исправьте 11. Сохраните программу (скрипт) создани я и заполнения в свой рабочий директорий в файл CreatePeople.SQL 12. Используя оператор SELECT *, посмотрите содержимое 13. Используя оператор CREATE TABLE, создайте таблицу- копию, но с другим именем 14. Удалите таблицу-копию 15. Ограничения предназначены для (назвать пункт): a) Поддержания родительско-дочерних связей между таблицами b) Обеспечения наличия в поле только данных определенного типа c) Обеспечения уникальности данных таблицы d) Всего вышесказанного 16. Создайте ограничение первичного ключа на столбце dept 17. Создайте индекс на столбце last_name 18. Создайте представление people_sal, которое включает только last name и salary. Посмотрите его структуру. Чем оно отличается от исходной таблицы ? 19. Посмотрите содержимое представления people_sal 20. Отмените опцию AUTOCOMMIT, удалите все строки в таблице people и выдайте команду ROLLBACK. Убедитесь в том, что все строки восстановлены 21. Добавьте в таблицу people столбец birthday 22. Заполните столбец birthday (оператор UPDATE)
Лабораторная работа № 3 Язык Oracle SQL 3.1.Понятия языка Алиас Таблице или столбцу можно присвоить альтернативное имя (алиас), которое действие будет действительно только в пределах оператора, в котором оно определено. Если альтернативное имя стоит после имени столбца в списке оператора SELECT, то оно будет использоваться вместо настоящего имени как заголовок для данного столбца. SQL> SELECT ename “ИМЯ”, empno “НОМЕР”, sal “ОКЛАД” FROM emp WHERE job = ‘ANALYST’ ORDER BY NAME; Альтернативное имя таблицы можно использовать при соединении таблицы с самой собой в соотносящемся запросе. При создании курсора альтернативное имя создается другим способом - заданием после имени курсора перечисления новых имён полей ( указывать в скобках через запятую ) При использовании таблиц с одинаковыми именами полей требуется указание имени таблицы перед именем колонки таблицы. SQL>SELECT wkr.ename, wkr.sal, sup.ename, sup.sal FROM emp wkr, emp sup WHERE wkr.mgr = sup.empno Под ред. проф. В.М.Космачёва
21
ГУАП МЦИТ Введение в «ORACLE» AND wkr.sal > sup.sal;
Пустые значения Пустое значение означает, что данные не известны, отсутствуют или бессмысленны в данном контексте. Пустое значение могут иметь столбцы с любым типом данных, если они не были определены как NOT NULL. Пустые значения применяются в случаях, когда конкретные значения неизвестны или бессмысленны. Пустое_значение и значение_равное_нулю - представляют собой совершенно разные вещи. Все выражения, содержащие хотя бы одно пустое значение, равны также пустому значению. Для оперативной подстановки непустых значений вместо пустых следует использовать функцию NVL. Например, NVL(comm, 0) вернет значение comm, если оно не пустое, или 0, если оно пустое. При проверке на пустое значение надо использовать только операторы IS или IS NOT. Любой другой оператор при сравнении с пустым значением всегда вернет пустое значение. Групповые функции при вычислениях игнорируют пустые значения.
Разделители ()
оператор; служит для объединения параметров
+-*/
арифметические операторы
=
логические операторы
;
признак конца оператора SQL
%
признак системного атрибута PL/SQL
,
разделитель элементов в списке
.
ссылка на таблицу.имя_поля и запись.имя_поля в PL/SQL Точка на отдельной строке свидетельствует об окончании блока PL/SQL
@
ссылка на удаленную БД
@ имя_файла
выполняет командный файл
‘‘
ограничивает строки символов (‘еклмн оклжп чшц’)
““
позволяет писать в идентификаторах что угодно
:
простые переменные или переменные связи включающего языка
!= ~= ^= =
операторы сравнения в PL/SQL
>
ограничители имен циклов, блоков и меток (для GOTO) в PL/SQL
--
начало строки комментария в блоке PL/SQL
/*
начало многострочного комментария
*/
конец многострочного комментария
..
диапазон числового цикла FOR в PL/SQL
:=
присвоение значения переменной в PL/SQL
**
возведение в степень
||
объединение строк
Прочие термы Терм
Смысл или действие в SQL
(+)
Предыдущий столбец является столбцом избыточного соединения (в соединении таблиц).
(*)
Извлекать все столбцы таблицы (SELECT * FROM...). таблица.
*
Извлекать все столбцы указанной таблицы (SELECT таблица.* FROM...).
ALL
В запросе или группировании не отбрасывать повторяющиеся значения, а извлекать все.
DISTINCT
В запросе или группировании отбрасывать повторяющиеся данные. Подразумевается всегда ALL.
PRIOR
Используется в предложении START WITH ... древовидного запроса для определения отношения отец-сын. Под ред. проф. В.М.Космачёва
22
ГУАП МЦИТ Введение в «ORACLE»
DDL, DML и PL/SQL Будем считать, что команды Data Definition Language (CREATE, DROP, ALTER и др.) в блоке кода PL/SQL – применять нельзя. Это значит, что выполнять их можно только в SQL. Команды Data Manipulation Language (INSERT, UPDATE, DELETE) можно включать в блок кода PL/SQL. Приведем здесь краткий обзор базового синтаксиса команд DML. В языке SQL определены 4 инструкции DML: • INSERT — вставляет в таблицу одну или несколько новых строк; • UPDATE — обновляет в одной или нескольких существующих строках таблицы значения одного или нескольких столбцов; • DELETE — удаляет из таблицы одну или несколько строк • SELECT — выбирает данные из таблицы
INSERT Существуют две базовые разновидности инструкции INSERT • Вставка одной строки с явно заданным списком значений: INSERT INTO имя_таблицы [(столбец1, стопбец2,…стопбецN)] VALUES (значение1. значение2,…значение_N); • Вставка в таблицу одной или нескольких строк, определяемых инструкцией SELECT, которая извлекает данные из одной или нескольких других таблиц: INSERT INTO имя_таблицы [(столбец1, стопбец2,…стопбецN)] AS SELECT ...; Имена в списке столбцов могут быть перечислены в любом порядке.В столбцы, не указанные в списке, заносится пустое значение. Все столбцы с признаком NOT NULL должны быть указаны и иметь предназначающиеся для них значения. В предложении VALUES перечисляются конкретные значения столбцов в добавляемой строке. Каждый указанный столбец должен иметь соответствующего. ему значение в предложении VALUES. Типы данных значения и столбца должен быть совместимы или преобразуемы. Значения типа CHAR и DATE надо заключать в одинарные кавычки (‘абв’). Чтобы добавить строки из другой таблицы ,следует использовать подзапрос. Оператор SELECT в этом подзапросе должен извлекать значения для каждого перечисленного столбца.
UPDATE С помощью этой инструкции можно обновить один или несколько столбцов или одну или несколько строк таблицы. Ее синтаксис: UPDATE имя_таблицы SET столбец1 = значение1 [, столбец2 = значение_2, …столбецN = значениеN]) [WHERE условие]; если WHERE не задано, обновляются все строки таблицы. Примеры 1.Представление названий книг таблицы books в символах верхнего регистра: UPDATE books SET title = UPPER (title); 2.Выполнение процедуры, удаляющей компонент времени из даты издания книг, которые были написаны указанным в аргументе автором, и переводящей названия этих книг в символы верхнего регистра: CREATE OR REPLACE PROCEDURE remove_time (author_in IN VARCHAR2) IS BEGIN UPDATE books SET title = UPPER (title), date_published = TRUNC (date_published) WHERE author LIKE author_in; END;
DELETE Предназначена для удаления одной или нескольких или всех строк таблицы: Под ред. проф. В.М.Космачёва
23
ГУАП МЦИТ Введение в «ORACLE» DELETE FROM имя_таблицы [WHERE условие] Если WHERE не задано, удаляются все строки таблицы. Примеры. 1. Удаление всей информации о книгах из таблицы books: DELETE FROM books; 2. Удаление из таблицы books всей информации о книгах, изданных до определенной даты, с возвратом их общего количества: CREATE OR REPLACE PROCEDURE remove_books (date_in IN DATE, removal_count_out OUT PLS_INTEGER) IS BEGIN DELETE FROM books WHERE date_published < date_in: removal_count_out := SQL%ROWCOUNT; END: Конечно, инструкции DML в реальных приложениях обычно бывают гораздо сложнее. Например, большое количество столбцов может обновляться данными, сгенерированными вложенным запросом. В Огас1е9i имя_таблицы можно заменить табличной функцией, возвращающей результирующий набор строк, с которым работает инструкция DML.
SELECT (Выбрать) SELECT [ALL] | [DISTINCT]{* | column_name [alias] [, column_name [alias] [,...] | [function] | [arithmetic_expression] } FROM {[схема.]таблица[, таблица alias [, ...] | подзапрос} [WHERE {условие | подзапрос }] [CONNECT BY условие][ START WITH условие] [GROUP BY выражение, выражение...] [HAVING условие] [{UNION | INTERSECT | MINUS SELECT...}] [{ORDER BY выражение | ASC | DESC,...}] [FOR UPDATE OF столбец, столбец...] [NOWAIT]; • Выражение SELECT включает в себя список столбцов возвращаемых запросом • Выражение FROM включает в себя список таблиц для выполнения запроса. • Выражение WHERE устанавливает условие поиска, если необходимо вернуть не все строки, а только ту часть, которая описана условием поиска. • Выражение GROUP BY позволяет создать итоговой запрос, разбитый на группы • Выражение HAVING определяет условие возврата групп и используется только совместно с GROUP BY • Выражение ORDER BY определяет порядок сортировки результирующего набора данных • В операторе SELECT обязательно должно присутствовать выражение FROM.. Остальные выражения используются по мере необходимости. • Оператор SELECT извлекает данные из столбцов одной или нескольких таблиц. • Оператор SELECT сам по себе называется запросом. Если он используется как предложение внутри другого оператора, то он называется подзапросом. • При совместном использовании нескольких предложений они должны быть записаны в указанном выше порядке. Оператор выборки можно прочитать примерно так: SELECT (выбрать) все столбцы (если используется оператор *) или конкретно перечисленные столбцы WHERE (для которых) выполняются или не выполняются определенные условия. Такая фраза WHERE может содержать другой запрос SQL. Для выборки одного или нескольких столбцов из таблицы можно указать имя столбца после фразы SELECT. Имя каждого последующего столбца должно быть отПод ред. проф. В.М.Космачёва
24
ГУАП МЦИТ Введение в «ORACLE» делено от предыдущего запятой. Фраза WHERE позволяет ограничить число строк, возвращаемых запросом, или выполнить выборку только определенных строк. Поскольку Oracle — это реляционная база данных, одни таблицы можно связать с другими с использованием фразы WHERE. Для выборки столбцов из двух или нескольких таблиц, содержащих взаимосвязанные данные, можно связать между собой столбцы с одним и тем же типом данных (и, в случае необходимости, согласовать типы данных с помощью функции. Если столбцы соединяемых таблиц имеют одинаковые имена, то ссылки на таблицы должны быть уточнены для указания того, к каким таблицам принадлежат эти столбцы. Пример. SELECT ename,dname FROM emp,dept WHERE emp.deptno =10 AND emp.deptno=dept.deptno; Здесь выбираются столбцы ename, dname из таблиц emp,dept соответсвенно. Связь по полю deptno. Oracle поддерживает следующие операторы сравнения: =
равно
!=
не равно
>
больше
=
больше или равно
=op1 и START MYFILE CLERK 7900 Каждый параметр, получивший значение из аргументов команды START, автоматически описывается командой SQL*Plus DEFINE
Вопросы и задания к Л.р. № 3 1. Какими командами SQL создаются объекты ORACLE ? 2. Какими командами SQL удаляются объекты ORACLE ? 3. Какими командами SQL модифицируются объекты ORACLE ? 4. Какой командой можно добавить / удалить столбец ORACLE ? 5. Какой командой можно добавить / удалить строку ? 6. Какими командами SQL выбираются данные из таблиц ORACLE ? 7. Какими командами SQL выполняется откат к предыдущему состоянию базы данных ? 8. Какими командами SQL выполняется закрытие транзакции ? 9. Какими командами SQL выполняется запись изменений в базу данных ? 10. В чем разница между подстановочными символами & и && ? 11. Увеличте оклад каждого сотрудника в отделе 10 на 10% 12. Написать и отладить (один) командный файл People1 для созданной ранее таблицы People, в котором: • Выводится таблица вида Фамилия
Принят
Оклад Под ред. проф. В.М.Космачёва
27
ГУАП МЦИТ Введение в «ORACLE» ------------
---------
--------
• С консоли по запросу задается сортировка по фамилии • С консоли по запросу задается сортировка по окладу • То же самое, но с консоли без запроса
Лабораторная работа № 4 Оператор SELECT (выбрать) В ланной работе подробнее рассматриваются свойства оператора SELECT как базового оператора языка SQL
Формат оператора: a) вразумительная форма: SELECT список_возвращаемых_столбцов FROM список_таблиц [WHERE условие]
• Выборка (возвращаемый запросом набор данных) будет упорядочен по списку_возвращаемых_столбцов • список_возвращаемых_столбцов может содержать выражения, функции, констант; список столбцов может содержать псевдостолбцы, выражения, функции, константы и тп.
• список_таблиц – таблицы, из которых производится выборка • при наличии WHERE условие – выбираются записи, для которых значние выражения условие = ИСТИНА (TRUE)
b) подробная форма Под ред. проф. В.М.Космачёва
28
ГУАП МЦИТ Введение в «ORACLE» SELECT [ALL] | [DISTINCT]{* | column_name [alias] [, column_name [alias] [,...] | [function] | [arithmetic_expression] } FROM {[схема.]таблица[, таблица alias [, ...] | подзапрос} [WHERE {условие | подзапрос }] [CONNECT BY условие][ START WITH условие] [GROUP BY выражение, выражение...] [HAVING условие] [{UNION | INTERSECT | MINUS SELECT...}] [{ORDER BY выражение | ASC | DESC,...}] [FOR UPDATE OF столбец, столбец...] [NOWAIT]; • Выражение SELECT включает в себя список столбцов возвращаемых запросом • Выражение FROM включает в себя список таблиц для выполнения запроса. • Выражение WHERE устанавливает условие поиска, если необходимо вернуть не все строки, а только ту часть, которая описана условием поиска. • Выражение GROUP BY позволяет создать итоговой запрос, разбитый на группы • Выражение HAVING определяет условие возврата групп и используется только совместно с GROUP BY • Выражение ORDER BY определяет порядок сортировки результирующего набора данных • В операторе SELECT обязательно должно присутствовать выражение FROM.. Остальные выражения используются по мере необходимости. • Оператор SELECT извлекает данные из столбцов одной или нескольких таблиц. • Оператор SELECT сам по себе называется запросом. Если он используется как предложение внутри другого оператора, то он называется подзапросом. • При совместном использовании нескольких предложений они должны быть записаны в указанном выше порядке. Оператор выборки можно прочитать примерно так: SELECT (выбрать) все столбцы (если используется оператор *) или конкретно перечисленные столбцы WHERE (для которых) выполняются или не выполняются определенные условия. Такая фраза WHERE может содержать другой запрос SQL. Для выборки одного или нескольких столбцов из таблицы можно указать имя столбца после фразы SELECT. Имя каждого последующего столбца должно быть отделено от предыдущего запятой. Фраза WHERE позволяет ограничить число строк, возвращаемых запросом, или выполнить выборку только определенных строк. Поскольку Oracle — это реляционная база данных, одни таблицы можно связать с другими с использованием фразы WHERE. Для выборки столбцов из двух или нескольких таблиц, содержащих взаимосвязанные данные, можно связать между собой столбцы с одним и тем же типом данных (и, в случае необходимости, согласовать типы данных с помощью функции. Если столбцы соединяемых таблиц имеют одинаковые имена, то ссылки на таблицы должны быть уточнены для указания того, к каким таблицам принадлежат эти столбцы. Пример. SELECT ename,dname FROM emp,dept WHERE emp.deptno =10 AND emp.deptno=dept.deptno; Здесь выбираются столбцы ename, dname из таблиц emp,dept соответсвенно. Связь по полю deptno. Oracle поддерживает следующие операторы сравнения: =
равно
!=
не равно
>
больше
=
больше или равно
=op1 и 10000 и SET ESCAPE / SQL> DEFINE _page = ‘Страница /&P2’ Теперь в колонтитулах будет печататься “Страница” и номер страницы. Число 2 в данном случае устанавливает колво разрядов поля для номера страницы = 2. Вместо слова ‘Страница’ можно использовать любой текст. Ширину поля номера страницы тоже можно задавать произвольно. Заметьте, что перед амперсандом (&) должен стоять ESCAPEсимвол, чтобы SQL*Plus не воспринял его как символ подстановки значения переменной. ESCAPE-символ задается командой SET ESCAPE. SQL*Plus воспринимает команду TTITLE как старую если сразу после нее не следует одно из предложений, использующихся в современной команде. Пример: Если нужно установить верхний колонтитул как дату и номер страницы на 1-й строке, слово MARKETING на 2-й и PERSONNEL REPORT на 3-й, то следует ввести: SQL> TTITLE ‘MARKETING | PERSONNEL REPORT’
Функции форматирования данных ФОРМАТ
ВОЗВРАЩАЕТ
DECODE(exp, str1,ret1, str2,ret2, …notfound)
ret1, если exp = str1’, ret2, если exp = str2 или notfound, если не обнаружено ни одного совпадения. Если параметра notfound нет, то в случае отсутствия совпадений возвращается пустое значение.
DUMP(выражение, формат, начало, длина)
Выражение в заданном формате: 8=восьмеричный, 10= дес., 16=шестнадцатеричный,17=символьный. ‘начало’ и ‘длина’ указывают, какую часть выражения надо обработать. Что бы изобразить все выражение опустите ‘начало’ и ‘длину’.
GREATEST(выраж1, выраж2, выраж3...)
Наибольшее из перечисленных значение выражения. Возвращаемое значение будет преобразовано в такой же тип данных, как и ‘выраж1’
LEAST(выраж1, выраж2, выраж3...)
Наименьшее из перечисленных значение выражения. Возвращаемое значение будет преобразовано в такой же тип данных, как и ‘выраж1’
NVL(выраж1, выраж2)
‘выраж1’, если его значение не пусто и ‘выраж2’ в противном случае. Типы данных возвращаемого значения должен соответствовать типу данных ‘выраж1’
UID
Уникальное целое число, идентифицирующее пользователя
USER
Возвращает имя текущего пользователя
USERENV(‘ENTRYID’)
доступный идентификатор ревизионной записи
USERENV(‘LANGUAGE’)
язык, установленный параметром LANGUAGE в файле INIT.ORA
USERENV(‘SESSIONID’)
идентификатор ревизионного сеанса пользователя
USERENV(‘TERMINAL’)
идентификатор терминала в ОС
VSIZE(выражение)
число байтов, использованное для хранения ‘выражения’ во внутреннем Под ред. проф. В.М.Космачёва
33
ГУАП МЦИТ Введение в «ORACLE» представлении ORACLE Замечание. Функции DUMP, GREATEST и LEAST нельзя использовать в PL/SQL.
BTITLE (Определение заголовок отчёта в конце) BTI[TLE] [специф_формата [текст | переменная] ...] | [OFF | ON] Команда BTITLE размещает и форматирует заданные заголовки в конце каждой страницы отчета, или показывает текущие определения BTITLE. SQL*PLUS определяет новый формат BTITLE, если правильная спецификация формата следует непосредственно за именем команды (LEFT,SKIP,COL, и т.д.). Пример Чтобы установить нижний заголовок “CORPORATE PLANING DEPARTMENT” выровненным влево и дату справа, введите: SQL> BTITLE LEFT ‘CORPORATE PLANING DEPARTMENT’ 2 RIGHT ‘11 MAR 1988’ Чтобы установить нижний заголовок “CONFIDENTIAL” в колонке 50 и дату через 6 пробелов, введите: SQL> BTITLE COL 50 ‘CONFIDENTIAL’ TAB 6 ‘11 MAR 97’
CLEAR (очистить) CL[EAR] опция ( очистить установки ) Команда CLEAR сбрасывает или очищает текущее значение или установку указанных параметров. Опция представляет одну из следующих фраз: BRE[AKS] Удаление описания прерывания, которое установлено командой BREAK. BUFF[ER] Очистка буфера. CLEAR BUFFER аналогична CLEAR SQL, если вы не используете несколько буферов COL[UMNS] Сбрасывает атрибуты вывода всех столбцов, установленные командой COLUMN, к их установкам по умолчанию. Для сброса атрибутов вывода одного столбца , используйте фразу CLEAR команды COLUMN COMP[UTES] Удаляет все описания COMPUTE установленные командой COMPUTE. SCR[EEN] Очистка экрана. SQL Очистка буфера SQL. CLEAR SQL аналогична CLEAR BUFFER, если вы не используете несколько буферов TIMI[NG] Удаление всех областей хронометрирования, созданных командой TIMING. Пример: SQL> CLEAR BREAKS SQL> CLEAR COLUMNS
Форматирование вывода результатов запросов. В настоящем разделе показано применение команд SQL и SQL*Plus для фортирования вывода результатов запросов. В буфере SQL программы SQL*Plus может одновременно находиться только одна команда. Для представления данных столбцов в требуемом формате, включения в числовые поля знаков денежной единицы (S) и запятых, а также изменения заголовков столбца применяется команда COLUMN программы SQL*Plus. Команда COLUMN определяет атрибуты вывода для всех указанных столбцов, такие как: • текст для заголовка столбца • выравнивание заголовка столбца • формат для данных NUMBER • свертка данных столбца при выводе Также показывает текущие атрибуты вывода для одного или всех столбцов. Формат команды COLUMN COL[UMN] [{column | expr} [option ...] ] Под ред. проф. В.М.Космачёва
34
ГУАП МЦИТ Введение в «ORACLE» Для показа текущих атрибутов вывода для одного заданного столбца или выражения введите COLUMN с именем столбца или выражения. Чтобы отобразить атрибуты вывода для всех столбцов, введите COLUMN без параметров. Рассмотрим перечень описаний терминов или фраз: {column | expr} Идентифицирует элемент данных (обычно, имя столбца) из команды SELECT, на который ссылается команда COLUMN. Если вы используете выражение (expr) в команде COLUMN, вам необходимо его задавать в таком же виде, в каком оно задается в команде SELECT. Если выражение в команде SELECT равно a+b, например, вы не можете использовать b+a или (a+b) в команде COLUMN для ссылки на выражение из команды SELECT. Если вы выбираете столбцы с одинаковыми именами из разных таблиц, команда COLUMN воздействует на оба этих столбца. А именно, команда COLUMN для столбца ENAME воздействует на все столбцы с именами ENAME, на которые вы ссылаетесь в течение данного сеанса. COLUMN игнорирует предшествующее имя таблицы в команде SELECT. Чтобы отформатировать столбцы по разному, присвойте уникальный алиас каждому столбцу внутри команды SELECT (не используйте фразу ALIAS команды COLUMN) и введите команду COLUMN для каждого алиаса. ALI[AS] alias Присваивает указанный алиас столбцу, который можно использовать для ссылки на столбец в командах BREAK, COMPUTE, COLUMN CLE[AR] Сбрасывает атрибуты вывода столбцов к их значениям по умолчанию FOLD_A[FTER] n Вставляет возврат каретки после каждого заголовка столбца и после каждой записи в столбце. Вы должны ввести n; значение n не влияет на формат. FOLD_B[EFORE] n Вставляет возврат каретки до каждого заголовка столбца и до каждой записи в столбце.Вы должны ввести n; значение n не влияет на формат. FOLD_BEFORE n имеет такой же эффект, как и NEWLINE. FOR[MAT] format Назначает формат вывода для указанного столбца. Спецификация формата д.б. текстовой константой (такой как A10 или $9,999), но не переменной. По умолчанию ширина столбца типа CHAR является такой, как она определена в БД или равна длине заголовка столбца (выбирается максимальное). По умолчанию ширина столбца типа LONG равна значению переменной SET LONG. Чтобы изменить ширину CHAR или LONG столбцов, используйте FORMAT An. Если вы указали ширину меньшую чем заголовок, то SQL*PLUS обрежет заголовок. SQL*PLUS форматирует CHARданные выравнивая их влево. Если значение не помещается в отведенную для него ширину, то SQL*PLUS сворачивает или усекает строку символов, в зависимости от установки SET WRAP. По умолчанию ширина неотформатированных DATE-столбцов в SQL есть A9. Чтобы изменить формат DATE-солбца, используйте SQLфункцию TO_CHAR в вашей SQL-команде SELECT. Когда вы используете TO_CHAR, ORACLE автоматически позволяет делать очень широкий столбец, так как SQL*PLUS автоматически устанавливает ширину столбца равной 80 символов. Затем Вы должны использовать команду SQL*PLUS COLUMN для восстановления ширины столбца. Чтобы изменить ширину DATE-столбца в n, используйте FORMAT An. Если вы указали ширину меньшую чем заголовок, то SQL*PLUS обрежет заголовок. Замечание: Другие SQL-вычисления могут привести к подобным эффектам; в таком случае используйте SQL*PLUS команду COLUMN для сброса ширины столбца. Ширина NUMBER-столбца по умолчанию равна значению SET NUMWIDTH. Чтобы изменить ширину, используйте FORMAT с параметром как показано в таблице Параметры строки FORMAT ПАРАМЕТР
ПРИМЕР
ОПИСАНИЕ
9
9999
Задает ширину вывода посредством количества введенных цифр.
0
0999
Вывод ведущих нулей.
0
9990
Вывод нуля вместо пробела,когда значение равно нулю.
$
$9999
Перед числом выводится знак доллара.
B
B9999
Показ нулевого значения пробелом.
MI
9999MI
Вывод “-“ после отрицательного числа.
PR
9999PR
Вывод отрицательного числа в угловых скобках.
Запятая
9,999
Вывод запятой в указанной позиции. Под ред. проф. В.М.Космачёва
35
ГУАП МЦИТ Введение в «ORACLE» Точка
99.99
Выравнивание по указанной десятичной точке.
V
999V99
Умножает число на 10n, где n- это количество “9” после “V”.
EEEE
9.999EEEE
Вывод в экспоненциальном формате (формат должен содержать четыре “E”)
DATE
DATE
Выводит число как дату в формате MM/DD/YY
SQL*PLUS форматирует NUMBER-данные выравнивая их вправо. Ширина поля выбирается равной или ширине заголовка или длине формата плюс один пробел для знака (выбирается большее). SQL*PLUS никогда не обрезает заголовок NUMBER-столбца. Если ширины, отведенной для столбца, не хватает для вывода числа, то SQL*PLUS выводит звездочки (*), оповещая нас о переполнении. Для всех числовых форматов SQL*PLUS округляет числа до указанного количества значащих цифр. Когда формат не задан, по умолчанию ширина числовых данных берется из переменной NUMWIDTH (см команду SET). HEA[DING] text Определяет заголовок столбца. Если вы не используете фразу HEADING, заголовком столбца по умолчанию является имя столбца или выражения. Если текст содержит пробелы или знаки пунктуации, вы должны заключить его в одиночные или двойные кавычки. Каждый символ HEADSEP (по умолчанию ‘|’) начинает новую строку. Например, COLUMN ENAME HEADING ‘Employee|Name’ Задает двух строковый заголовок. Смотри переменная HEADSEP команды JUS[TIFY] {L[EFT] | C[ENTER] | C[ENTRE] | R[IGHT]} Выравнивает заголовок. Если вы не используете фразу JUSTIFY, NUMBER -столбец выравниваются вправо, а другиевлево. LIKE {expr | alias} Копирует атрибуты вывода другого столбца или выражения (атрибуты которой уже заданы другой командой COLUMN). LIKE копирует только те атрибуты, которого не заданы в текущей команде COLUMN. NEWL[INE] Вывод значения столбца начинает с новой строки. NEWLINE имеет такой же эффект, что и FOLD_BEFORE n. NEW_V[ALUE] variable Определяет переменную, в которую помещается значение столбца. Вы можете ссылаться на эту переменную в команде TTITLE. Используйте NEW_VALUE для вывода значения столбца или даты в верхнем заголовке. Вы должны включить данный столбец в BREAK-команду с действием SKIP PAGE. NEW_VALUE полезна при получении основных/детальных отчетов, в которых существует новая главная запись для каждой страницы. Для основных /детальных отчетов вы должны также включить данный столбец во фразу ORDER BY. NOPRI[NT] | PRI[NT] Управляет печатью столбца NUL[L] text Управляет выводом текста для пустых значений столбцов. Если вы не используете фразу NULL в команде COLUMN, SQL*PLUS выводит пробелы или текст, который вы задали для NULL, используя команду SET- там, где встречается пустые значения для данного столбца. (SET NULL задает текст, выводимый для всех пустых значений всех столбцов, если это не отменено для конкретного столбца фразой NULL команды COLUMN.) OLD_V[ALUE] variable Определяет переменную, в которую помещается значение столбца. Вы можете ссылаться на эту переменную в команде BTITLE. Используйте OLD_VALUE для вывода значения столбца или даты в нижнем заголовке. Вы должны включить данный столбец в BREAK-команду с действием SKIP PAGE. OLD_VALUE полезна при получении основных/детальных отчетов, в которых существует новая главная запись для каждой страницы. Для основных /детальных отчетов вы должны также включить данный столбец во фразу ORDER BY. Подробнее о выводе значений столбца в верхний заголовок смотри COLUMN NEW_VALUE. В описании TTITLE смотри о том, как надо ссылаться на переменные в заголовках. ON | OFF Управляет состоянием атрибутов вывода для столбца. OFF отключает атрибуты для столбца, но не влияет на описание атрибутов. ON восстанавливает атрибуты в прежнее положение. WRA[PPED] | WOR[D_WRAPPED] | TRU[NCATED]
Под ред. проф. В.М.Космачёва
36
ГУАП МЦИТ Введение в «ORACLE» Определяет, как SQL*PLUS будет обращаться с CHAR-строками, которые слишком широки для столбца. WRAPPED сворачивает конец строки на следующую линию. WORD_WRAPPED функция аналогична WRAPPED, но при свертке слова переносятся на другую строку полностью. TRUNCATED при выводе обрезает конец строки. Замечание Вы можете вводить любое количество команд COLUMN для одного или нескольких столбцов. Все установленные атрибуты столбцов действуют до конца сеанса, или пока вы не отключите атрибуты фразой OFF. Таким образом, команды COLUMN, которые вы ввели, управляют атрибутами столбцов для множества команд SELECT. Для различных столбцов эта команда может быть введена любое число раз. Также, любое число команд COLUMN может быть введено для одного и того же столбца, и их фразы будут применены совместно. Если эти несколько команд COLUMN применяют одну и ту же фразу для того же столбца, управление осуществляется с помощью последней. Примеры: 1.Чтобы сделать столбец ENAME шириной в 20 символов и двух строчный заголовок EMPLOEYY NAME, введите: SQL> COLUMN ENAME FORMAT A20 HEADING ‘EMPLOYEE | NAME’ 2.Чтобы отформатировать столбец SAL таким образом, чтобы он выводил миллионы долларов, округлялся до центов, использовал запятую для разделения тысяч, и выводил $0.00, когда число равно нулю, вы должны ввести: SQL> COLUMN SAL FORMAT $9,999,990.99 3.Чтобы присвоить алиас NET столбцу содержащему длинное выражение, вывести результат в формате долларов, и вывести для пустых значений, вы можете ввести: SQL> COLUMN SAL+COMM+BONUS-EXPENSES-INS-TAX ALIAS NET SQL> COLUMN NET FORMAT $9,999,999.99 NULL ‘’ Заметим, что в данном примере спецификация столбца разделена на две команды. Первая определяет алиас NET, а вторая использует NET для задания формата. Также заметим, что в первой команде вы должны задать выражение точно так же, как вы будете использовать его в командах SELECT. Иначе, SQL*PLUS не найдет описание данного столбца. 4. Чтобы ‘свернуть’ длинное значение в столбце REMARKS, вы можете ввести: SQL> COLUMN REMARKS FORMAT A20 WRAP 5. Для того, чтобы распечатать текущую дату и наименование каждой профессии в верхнем заголовке, введите следующее. (Вопрос создания переменной с текущей датой в вашем LOGIN файле рассматривался в главе “Вывод текущей даты в заголовках” темы “Определение заголовков и размерностей страниц”.) SQL> COLUMN JOB NOPRINT NEW_VALUE JOBVAR SQL> COLUMN TODAY NOPRINT NEW_VALUE DATEVAR SQL> BREAK ON JOB SKIP PAGE ON TODAY SQL> TTITLE CENTER ‘Job Report’ RIGHT DATEVAR SKIP 2 -LEFT ‘Job: ‘ JOBVAR SKIP 2 SQL> SELECT TO_CHAR(SYSDATE, ‘MM/DD/YY’) TODAY/ 2 ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO 3 FROM EMP WHERE JOB IN (‘CLERK’,’SALESMAN’) 4 ORDER BY JOB, ENAME; 5. Форматирование заголовков (вариат1) COLUMN ename FORMAT A16 HEADING ‘Фамилия | Имя | Отчество’ COLUMN job FORMAT A16 HEADING ‘Должность’ COLUMN sal FORMAT $9999.99 HEADING ‘Оклад’ SELECT ename,job,sal FROM emp WHERE deptno = 10; 6. Форматирование заголовков (вариат2) COLUMN “Фамилия,Имя,Отчество” FORMAT A24 COLUMN “Должность” FORMAT A10 COLUMN “Оклад” FORMAT $9999.99 SELECT ename “Фамилия,Имя,Отчество”, job “Должность”, sal “Оклад” FROM emp WHERE deptno = 10; Под ред. проф. В.М.Космачёва
37
ГУАП МЦИТ Введение в «ORACLE» Опция FORMAT позволяет выбрать нужные размеры полей и применить числовую маску. Здесь также заслуживает внимание то, как оформлены поля заголовка, а также то, что столбец ename содержит символ канала |. Если в тексте заголовка находится какой-либо специальный символ или пробел, этот текст должен быть заключен в одинарные кавычки. Символ канала разбивает заголовок на строки
COMPUTE (Рассчитать) COMP[UTE] [функция ...OF {expr | столбец| алиас} ...ON {expr | столбец| алиас | REPORT | ROW}] Команда COMPUTE вычисляет и печатает итоги, используя стандартные вычисления над подмножеством выбранных записей. COMPUTEбез параметров показывает все определения COMPUTE.
Функции для операций COMPUTE Функция Операция Тип параметра функции AVG Среднее непустых значений NUMBER COU[NT] Счетчик ненулевых значений все типы MAX[IMUM] Максимальное значение NUMBER,CHAR MIN[IMUM] Минимальное значение NUMBER,CHAR NUM[BER] Счетчик записей все типы STD Среднеквадратичное отклонение непустых значений NUMBER SUM Сумма непустых значений NUMBER VAR[IANСE] Дисперсия непустых значений NUMBER Если вы укажите больше однойфункции, то разделите их пробелами.
OF {expr | столбец| алиас} ... Определяет столбец или выражение, которое вы хотите использовать при вычислениях. Вы должны также задать данный столбец в команде SELECT, иначе SQL*PLUS проигнорирует вашу команду COMPUTE. Если вы не хотите, чтобы вычисляемое значение для указанного столбца появлялось на экране, подавите эту печать фразой NOPRINT команды COLUMN. Используйте пробелы для разделения нескольких выражений, столбцов или алиасов внутри фразы OF. Чтобы сослаться в SELECT на выражение или функцию из фразы OF, заключите ссылку на выражение или функцию в кавычки. Имя столбца или алиаса заключать в кавычки не надо. ON {выраж | столбец| алиас | REPORT | ROW} Определяет событие, которое SQL*PLUS будет использовать как прерывание. COMPUTE выводит вычисляемое значение и начинает повторное вычисление, когда происходит данное событие (также, когда изменяется значение выражения, после выборки новой записи, или заканчивается отчет). Если несколько команд COMPUTE ссылаются на один и тот же столбец во фразе ON, то действует только последняя команда COMPUTE. Чтобы сослаться в SELECT на выражение или функцию из фразы ON, заключите ссылку на выражение или функцию в кавычки. Имя столбца или алиаса заключать в кавычки не надо. Чтобы вывести все описания COMPUTE, введите COMPUTE без параметров. Для проведения вычислений необходимо, чтобы выполнялись следующие условия: • Выражение, столбец, или алиас столбца, на который вы ссылаетесь во фразе ON, должны быть заданы в команде SELECT. • Выражение, столбец, или алиас столбца, на который вы ссылаетесь во фразе ON, должны быть заданы в последней команде BREAK. • Если вы задаете ROW или REPORT во фразе ON, также необходимо задать ROW или REPORT в последней команде BREAK. • Одно или более выражений, столбцов, или алиасов столбцов, которые вы задаете во фразе OF, необходимо задать в команде SELECT. Под ред. проф. В.М.Космачёва
38
ГУАП МЦИТ Введение в «ORACLE» Примеры Чтобы вычислить промежуточные суммы окладов для профессий “clerk”, ”analyst”, ”salesman”, введите: SQL> BREAK ON JOB SKIP 1 SQL> COMPUTE SUM OF SAL ON JOB SQL> SELECT JOB, ENAME, SAL 2 FROMEMP 3 WHERE JOB IN (‘CLERK’,’ANALYST’,’SALESMA’) 4....OREDER BY JOB, SAL; Чтобы вычислить средний и максимальный оклады в отделах продавцов, введите: SQL> BREAK ON DNAME SKIP 1 SQL> COMPUTE AVG MAX OF SAL ON DNAME SQL> SELECT DNAME, ENAME, SAL 2 FROMDEPT, EMP 3 WHERE DEPT.DEPTNO=EMP.DEPTNO 4 AND DNAME IN (‘ACCOUNTING’,’SALESMAN’) 5 ORDER BY DNAME;
SPOOL (Установить протоколирование работы) SPO[OL] [имя_файла[.расширение] | OFF |OUT Команда SPOOL сохраняет результаты запросов в файле операционной системы и, обычно, посылает данный файл на принтер. Также показывает текущее состояние буферизации. имя_файла[.расширение] -- Задает имя файла, в который будет производиться буферизация отображаемых выходных данных. Если вы не указали расширение, SPOOL использует расширение по умолчанию (LST или LIS в большинстве систем). OFF -- Заставляет SQL остановить буферизацию. OUT Останавливает буферизацию и посылает файл на принтер. Введите SPOOL без параметров, чтобы вывести текущее состояние буферизации. Чтобы буферировать вывод генерируемый командами из командного файла без отображения его на экране, используйте SET TERMOUT OFF. SET TERMOUT OFF не влияет на вывод команд, введенных интерактивно. Примеры: Чтобы начать запись отображаемых данных в файл с именем DIARY, введите: SQL> SPOOL DIARY Чтобы закрыть, введите: SQL> SPOOL OFF
TTITLE (Создать заголовок отчёта) TTI[TLE] [формат [текст | переменная] ...] |
Команда TTITLE помещает и форматирует указанный заголовок вверху каждой страницы отчета, или выводит текущее определение TTITLE. Если вы не указали фразу printspec перед текстом, TTITLE выровнит текст влево. Для вывода текущего определения TTITLE, введите TTITLE без параметров. Описание данных терминов и фраз действительно и для команды BTITLE. Текст -- Задает текст заголовка. Текст необходимо поместить в одиночные кавычки, если в нем больше одного слова. Переменная. -- Задает пользовательскую переменную или одну из следующих системных переменных: • SQL.LNO (текущий номер строки) • SQL.PNO (текущий номер страницы) Под ред. проф. В.М.Космачёва
39
ГУАП МЦИТ Введение в «ORACLE» • SQL.RELEASE (текущий номер реализации ORACLE) • SQL.SQLCODE (текущий код ошибки) • SQL.USER (текущее имя пользователя) Чтобы вывести одно из этих значений, используйте соответствующее имя в заголовке. Можно форматировать переменную фразой FORMAT, где формат состоит из одной или нескольких следующих фраз, используемых для размещения и форматирования текста: OFF Выключает заголовок (запрещает его вывод) не влияя на его описание. ON Включает заголовок (разрешает его вывод). Когда вы описали верхний заголовок, SQL*PLUS автоматически устанавливает TTITLE в ON. COL n Перемещение в столбец n текущей строки. “Колонка” в данном контексте означает позицию печати, но не столбец таблицы. S[KIP] [n] Пропуск n строк; если вы опустили n, пропускается одна строка; если n=0, то возврат в начало текущей строки. TAB n Пропуск n столбцов (перемещение назад, если вы задали отрицательное число). “Колонка” в данном контексте означает позицию печати,но не столбец таблицы. LE[FT] Выравнивание влево CE[NTER] Выравнивание по центру R[IGHT] Выравнивание вправо LEFT, CENTER и RIGHT используют значение SET LINESIZE для вычисления позиции, в которую необходимо поместить данные. BOLD Печатает данные полужирным шрифтом. SQL*PLUS показывает полужирную печать на терминале повторением данных на трех последовательных строках. FORMAT симв Задает модель формата, которая определяет формат для последующих элементов данных. Модель формата должна быть символьной константой, такой как А10 или $999- но не переменной. Если тип данных модели формата не соответствует типу элемента данных, фраза FORMAT не оказывает влияния на данный элемент. Если данное несоответствие обнаружено, то SQL*PLUS печатает числовые значения, используя формат по умолчанию для числовых значений или формат заданный фразой SET NUMFORMAT. Данные типа DATE выводятся в формате по умолчанию. SQL*PLUS интерпретирует TTITLE в новом формате, если допустимая фраза printspec (LEFT, SKIP,COL, и т.д.) следует непосредственно за именем команды. Смотри описание COLUMN NEW_VALUE для печати столбцов и дат в верхнем заголовке. Вы можете использовать любое количество констант и переменных в printspec. SQL*PLUS будет выводить константы и переменные в указанном вами порядке, позиционируя и форматируя каждую константу и переменную в соответствии с предшествующей фразой printspec. Примеры: Чтобы определить верхний заголовок: “Данные месяца” выровненным влево, дату по центру и справа номер страницы, и вывести “В тысячах” полужирным шрифтом в центре следующей строки, введите: SQL> TTITLE LEFT ‘Данные месяца’ CENTER ‘11 Mar 88’ RIGHT ‘Стр:’ FORMAT 999 SQL.PNO SKIP CENTER BOLD -‘В тысячах’ Под ред. проф. В.М.Космачёва
40
ГУАП МЦИТ Введение в «ORACLE» В результате будет следующий заголовок: Данные месяца 11 Mar 88 Стр: 1 В тысячах Чтобы подавить вывод заголовка без изменения его описания, введите: SQL> TTITLE OFF
Функции преобразования TO_CHAR(выражение,формат) TO_DATE(char, формат) TO_NUMBER(char) CHARTOROWID(char) ROWIDTOCHAR(ROWID) CONVERT(char, new, source) HEXTORAW(char) RAWTOHEX(raw)
Превращает численное выражение или выражение с использованием дат в символьное представление по образцу, заданному форматом. Преобразует дату из char в значение типа DATE, используя указанный формат. Преобразует число из CHAR в значение типа NUMBER. Преобразует символьные значения в значения для ROWID Преобразует значение ROWID в символьное. Переводит char из исходной системы кодировки символов в другую систему кодировки. Преобразует шестнадцатеричные числа в двоичные бесформатные значения (тип данных RAW). Преобразует бесформатные (двоичные) данные в символьное (шестнадцатеричное) представление.
Форматирование чисел В параметрах преобразования TO_CHAR можно использовать след. элементы описания формата в SQL. Элемент
Пример
Описание
9
99999
Число девяток задает ширину поля.
0
099
Вывести перед числом незначащие нули
$
$999
Перед числом вывести знак доллара ($).
B
B99
Изображать нули как пробелы, а не как ‘0’
MI
999MI
Вывести минус после отрицательного числа
PR
999PR
Заключить отрицательное число в угловые скобки ()
,
9,999
Вывести запятую в указанном разряде
.
9.999
Вывести точку в указанном разряде
V
99V99
Умножить значение на 10 столько раз, сколько есть девяток после ‘V’
E
9.99EEEE
Вывести число в экспоненциальном формате
DATE
DATE
Записывает дату в численном виде (в формате ММ/ДД/ГГ)
Форматирование дат и времени Элемент
Значение в TO_CHAR
CC или SCC
Век ил -век до н.э.
YYYY или SYYYY
Год или -год до н.э.
YYY или YY или Y
Последние 3,2,1 цифры года
Y,YYY
Год с запятой в указанном месте
YEAR или SYEAR
Произношение года
AD или BC
Индикатор до н.э.—AD (anno Domini) или BC (before Christ)
A.D. или B.C.
Индикатор до н.э.—A.D. (anno Domini) или B.C. (before Christ) Под ред. проф. В.М.Космачёва
41
ГУАП МЦИТ Введение в «ORACLE» AM или PM
Индикатор меридиана
A.M. или P.M.
Индикатор меридиана с точками
HH или HH12
Часы (1-12)
HH24
Часы (0-23)
MI
Минуты (00-59)
SS
Секунды (00-59)
SSSSS
Число секунд после полуночи (0-86399)
Q
Квартал (1-4)
MM
Месяц (01-12)
MONTH
Название месяца (длина поля - 9 символов)
MON
3-х буквенное название месяца (ЯНВ)
WW
Неделя года (1-52)
W
Неделя месяца (1-5)
DDD
День года (1-366)
DD
День месяца (1-31)
D
Номер дня недели (номер) (1-7)
DAY
Название дня (длина поля - 9 символов)
DY
3-х буквенное сокращение названия дня (Птн)
J
Юлианская дата: число дней считая с 1 Января 4712 г. до н.э. Модификаторы формата
Модификаторы регистра букв в SQL: MON = APRIL
Mon = April
mon = april
DAY = FRIDAY
Day = Friday
day = friday
Элемент
Смысл
fm
Префикс, вызывающий подавление дополнения пробелами в форматах MONTH и ему подобных, что приводит к получению результ. строк переменной длины. Подавление остается в силе вплоть до следующего использования fm, восстанавливающего дополнение пробелами.
TH
производит числительное (DDth для 5th)
SP
произношение числа (ddSP для пяти)
THSP, SPTH
произношение числительного (DdthSP для Fifth)
‘string’
Вставляет строку в результирующую.
Построчные символьные функции ASCII(строка) CHR(n) INITCAP(симв) INSTR (симв1,симв2,m,n) LENGTH(симв) LOWER(симв) LPAD (симв1,n,симв2) LTRIM(симв, s) NLSSORT(симв)
Вычисляет код в 1-ом символе строки по таблице сортирующей последовательности Возвращает символ, имеющий код (ASCII или EBCDIC) равный n Делает 1-ую букву каждого слова в строке прописной, а остальные буквы строчными Возвращает позицию n-ного вхождения подстроки симв2в строкусимв1. Поиск подстроки симв2 начинается с поз. m. Пустые n и m задаются как 0 Возвращает длину строки симв. Возвращает строку симв, преобразовав все буквы в строчные Добавляет n строк симв2 перед строкой симв1 Удаляет начальные символы из строки симв вплоть до 1-го символа, не принадлежащего множеству s. Пустое s задается как ‘’ Выдает сортирующую последовательность для симв Под ред. проф. В.М.Космачёва
42
ГУАП МЦИТ Введение в «ORACLE» REPLACE (симв,find, new) RPAD (симв1,n,симв2) RTRIM(симв,set) SOUNDEX (симв) SUBSTR (char , c, n) TRANSLATE (char, find, new) UPPER(char) ABS(n) CEIL(n) FLOOR(n) MOD(m,n) POWER(m,n) ROUND(m,n) SIGN(n) SQRT(n) TRUNC(m,n)
Заменяет каждое вхождение find на new. Чтобы удалить find, опустите new. Для одиночных символов используйте функцию TRANSLATE Добавляет n раз симв2 после симв1 Удаляет символы в конце симв., начиная с символа, не принадлежащего множеству set. Пустое множество set задается как ‘’ Возвращает строку, фонетически эквивалентную симв Возвращает n символов строки char, начиная с символа c Заменяет в char каждый find на new Возвращает char, преобразовав все буквы в прописные Возвращает абсолютное значение(n) Возвращает наименьшее целое число, большее или равное n Возвращает наибольшее целое число, меньшее или равное n Возвращает результат деления m на n. Если n=0, то возвращает m Возвращает m в n-ной степени. n должно быть целым числом Возвращает m, округленное до n (необязательный. параметр) десятичных разрядов Возвращает: -1 если n отрицательно. 1, если n положительно или 0, если n = 0 Возвращает квадратный корень n “Сжимает” m до n (необязательный. параметр) разрядов. -n добавляет к целому числу n нулей
.
2.3. Язык PL/SQL Язык SQL – непроцедурный. Для реального программирования корпорация Oracle разработала процедурное расширение языка SQL, которое называется PL/SQL. PL/SQL является процедурным, объектно ориентированным языком, позволяющим создавать новые типы, классы и объекты. (Объектные возможности в данном курсе серъезно не рассматриваются)
DDL, DML и PL/SQL Будем считать, что команды Data Definition Language (CREATE, DROP, ALTER и др.) в блоке кода PL/SQL – применять нельзя. Это значит, что выполнять их можно только в SQL. Команды Data Manipulation Language (INSERT, UPDATE, DELETE) можно включать в блок кода PL/SQL. Приведем здесь краткий обзор базового синтаксиса команд DML. В языке SQL определены 4 инструкции DML: • INSERT — вставляет в таблицу одну или несколько новых строк; • UPDATE — обновляет в одной или нескольких существующих строках таблицы значения одного или нескольких столбцов; • DELETE — удаляет из таблицы одну или несколько строк • SELECT — выбирает данные из таблицы
INSERT Существуют две базовые разновидности инструкции INSERT • Вставка одной строки с явно заданным списком значений: INSERT INTO имя_таблицы [(столбец1, стопбец2,…стопбецN)] VALUES (значение1. значение2,…значение_N); • Вставка в таблицу одной или нескольких строк, определяемых инструкцией SELECT, которая извлекает данные из одной или нескольких других таблиц: INSERT INTO имя_таблицы [(столбец1, стопбец2,…стопбецN)] AS SELECT ...; Имена в списке столбцов могут быть перечислены в любом порядке.В столбцы, не указанные в списке, заносится пустое значение. Все столбцы с признаком NOT NULL должны быть указаны и иметь предназначающиеся для них значения. В предложении VALUES перечисляются конкретные значения столбцов в добавляемой строке. Каждый указанный столбец должен иметь соответствующего. ему значение в предложении VALUES. Типы данных значения и столбца должен быть совместимы или преобразуемы. Значения типа CHAR и DATE надо заключать в одинарные Под ред. проф. В.М.Космачёва
43
ГУАП МЦИТ Введение в «ORACLE» кавычки (‘абв’). Чтобы добавить строки из другой таблицы ,следует использовать подзапрос. Оператор SELECT в этом подзапросе должен извлекать значения для каждого перечисленного столбца.
UPDATE С помощью этой инструкции можно обновить один или несколько столбцов или одну или несколько строк таблицы. Ее синтаксис: UPDATE имя_таблицы SET столбец1 = значение1 [, столбец2 = значение_2, …столбецN = значениеN]) [WHERE условие]; если WHERE не задано, обновляются все строки таблицы. Примеры 1.Представление названий книг таблицы books в символах верхнего регистра: UPDATE books SET title = UPPER (title); 2.Выполнение процедуры, удаляющей компонент времени из даты издания книг, которые были написаны указанным в аргументе автором, и переводящей названия этих книг в символы верхнего регистра: CREATE OR REPLACE PROCEDURE remove_time (author_in IN VARCHAR2) IS BEGIN UPDATE books SET title = UPPER (title), date_published = TRUNC (date_published) WHERE author LIKE author_in; END;
DELETE Предназначена для удаления одной или нескольких или всех строк таблицы: DELETE FROM имя_таблицы [WHERE условие] Если WHERE не задано, удаляются все строки таблицы. Примеры. 1. Удаление всей информации о книгах из таблицы books: DELETE FROM books; 2. Удаление из таблицы books всей информации о книгах, изданных до определенной даты, с возвратом их общего количества: CREATE OR REPLACE PROCEDURE remove_books (date_in IN DATE, removal_count_out OUT PLS_INTEGER) IS BEGIN DELETE FROM books WHERE date_published < date_in: removal_count_out := SQL%ROWCOUNT; END: Конечно, инструкции DML в реальных приложениях обычно бывают гораздо сложнее. Например, большое количество столбцов может обновляться данными, сгенерированными вложенным запросом. В Огас1е9i имя_таблицы можно заменить табличной функцией, возвращающей результирующий набор строк, с которым работает инструкция DML.
SELECT (Выбрать) SELECT [ALL] | [DISTINCT]{* | column_name [alias] [, column_name [alias] [,...] | [function] | [arithmetic_expression] } FROM {[схема.]таблица[, таблица alias [, ...] | подзапрос} [WHERE {условие | подзапрос }] [CONNECT BY условие][ START WITH условие] Под ред. проф. В.М.Космачёва
44
ГУАП МЦИТ Введение в «ORACLE» [GROUP BY выражение, выражение...] [HAVING условие] [{UNION | INTERSECT | MINUS SELECT...}] [{ORDER BY выражение | ASC | DESC,...}] [FOR UPDATE OF столбец, столбец...] [NOWAIT]; Оператор SELECT извлекает данные из столбцов одной или нескольких таблиц. Оператор SELECT сам по себе является запросом. Если он используется как предложение внутри другого оператора, то он называется подзапросом. В операторе SELECT обязательно должно присутствовать предложение FROM. Остальные предложения не являются необходимыми. При совместном использовании нескольких предложений они должны быть записаны в указанном выше порядке. Оператор выборки можно прочитать примерно так: SELECT (выбрать) все столбцы (если используется оператор *) или конкретно перечисленные столбцы WHERE (для которых) выполняются или не выполняются определенные условия. Такая фраза WHERE может содержать другой запрос SQL. Для выборки одного или нескольких столбцов из таблицы можно указать имя столбца после фразы SELECT. Имя каждого последующего столбца должно быть отделено от предыдущего запятой. Фраза WHERE позволяет ограничить число строк, возвращаемых запросом, или выполнить выборку только определенных строк. Поскольку Oracle — это реляционная база данных, одни таблицы можно связать с другими с использованием фразы WHERE. Для выборки столбцов из двух или нескольких таблиц, содержащих взаимосвязанные данные, можно связать между собой столбцы с одним и тем же типом данных (и, в случае необходимости, согласовать типы данных с помощью функции. Если столбцы соединяемых таблиц имеют одинаковые имена, то ссылки на таблицы должны быть уточнены для указания того, к каким таблицам принадлежат эти столбцы. Пример. SELECT ename,dname FROM emp,dept WHERE emp.deptno =10 AND emp.deptno=dept.deptno; Здесь выбираются столбцы ename, dname из таблиц emp,dept соответсвенно. Связь по полю deptno. Oracle поддерживает следующие операторы сравнения: =
равно
!=
не равно
>
больше
=
больше или равно
=op1 и select sysdate from dual; SYSDATE 15-NOV-2004 SQL>select sysdate+20 "sysd+20" from dual; sysd+20 05-DEC-2004 SQL>select sysdate-20 "sysd-20" from dual; sysd-20 26-OCT-2004
Метод %TYPE Предопределенный метод %TYPE позволяет определить тип переменной, совпадающий с типом атрибута некоторой таблицы, например: V_ENAME EM.ENAME%TYPE; V MIN BALANCE EM.BALANCE%TYPE := 10 В этом примере объявляется переменная VENAME того же типа, что и поле ENAME в таблице ЕМ, а переменная V_MIN_BALANCE того же типа, что поле BALANCE в таблице ЕМ. Однако для колонок NOT NULL нельзя пользоваться этим методом.
Составные типы К составным типам относятся: PL/SQL записи, PL/SQL таблицы, таблица записей.
Записи Запись — это группа родственных данных, каждое из которых имеет имя и тип. PL/SQL запись содержит скаляр, запись или поле из PL/SQL таблицы.
Синтаксис команды создания PL/SQL записи: TYPE type_name is record ( field_declaration[, field_declaration]...);
-- Создание типа type_name,
field_declaration есть field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE } [[not null] {:=default | expr}] где f ield_name — имя поля, f ield_type — его тип, expr — начальное значение identifier type_name;
. . . .
-- Создание переменной типа type_name Под ред. проф. В.М.Космачёва
49
ГУАП МЦИТ Введение в «ORACLE»
Пример 2.3.7 TYPE emp_record_type IS RECORD ( ename varchar2(10), job varchar2(9), sal number(7,2) ); emp_record emp_record_type;
Метод %ROWTYPE Предопределенный метод %ROWTYPE может применяться как ко всей таблице, так и ее отдельным полям (атрибутам). При использовании этого метода с таблицей или представлением объявляется запись той же структуры, что и таблица или представление. При этом поля записи имеют имена и типы полей таблицы или представления.
Пример 2.3.8 DECLARE Emp_record emp%ROWTYPE; После такого описания запись EMP_RECORD имеет те же поля, что и запись ЕМР. Использование %ROWTYPE имеет ряд преимуществ: • число и тип колонок базы данных может быть неизвестен; • число типов колонок базы данных может меняться; • этот атрибут полезен, когда колонка определяется с помощью SELECT утверждения. Если метод %ROWTYPE применяется к отдельными полям (атрибутам), происходит объявление переменной того же типа, что и столбец в таблице, например: dept_record dept%ROWTYPE Оператором DECLARE можно создать PL/SQL таблицу следующим образом: TYPE type_name IS TABLE OF {column_type|variable%TYPE |table.column%TYPE}[not null] [INDEX BY binary_integer]; identifier type_name;
Пример 2.3.9 TYPE ename_table_type IS TABLE OF emp.ename%type INDEX BY binary_integer; ename_table ename_table_type;
Пример 2.3.10 DECLARE TYPE ename_table_type IS TABLE OF emp.e name%TYPE INDEX BY binary_integer; TYPE hiredate_table_type IS TABLE OF date INDEX BY binary_integer; ename_table ename_table_type; hiredate_table hiredate_table_type; BEGIN ename_table(l) := 'Cameron' ; hiredate_table(8):=SYSDATE+7; END; Следующие функции облегчают работу с таблицами: Под ред. проф. В.М.Космачёва
50
ГУАП МЦИТ Введение в «ORACLE» EXISTS(n) — возвращает TRUE, если n-ый элемент в таблице существует; COUNT — возвращает количество элементов в данный момент в PL/SQL таблице; FIRST and LAST — возвращает первый и последний (самый маленький или самый большой) индексы в PL/SQL таблице; PRIOR(n) — возвращает значение индекса, предшествующего индексу n в PL/SQL таблице; NEXT — возвращает значение индекса, следующего за индексом n в PL/SQL таблице; EXTEND(n,i) — увеличивает размер таблицы, присоединяет n копий i-ro элемента PL/SQL таблицы; TRIM(n) — удаляет n элементов из конца PL/SQL таблицы; DELETE(n) — удаляет n элементов из PL/SQL таблицы. Например, следующим образом можно определить таблицу, каждый элемент которой является записью: DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY binary_integer; dept_table dept_table_type;
Пример 2.3.11 DECLARE TYPE e_table_type IS TABLE OF emp.ename%TYPE INDEX BY binary_integer; e_tab e_table_type; В заключение повторим, что составной тип в PL/SQL есть: • PL/SQL запись; • PL/SQL таблица; • PL/SQL таблица записей. При определении составного типа необходимо использовать предопределенный метод %ROWTYPE
Пример 2.3.12 DEPT_RECORD DEPT%ROWTYPE; EMP_RECORD EMP%ROWTYPE; DEPTRECORD содержит ту же информацию, что и поле DEPT таблицы, аналогично EMP_RECORD содержит ту же информацию, что и записи ЕМР таблицы.
2.3.3. Структура программы на PL/SQL Язык PL/SQL является составной частью во многих продуктах Oracle. Сервер Oracle включает поддержку языка PL/SQL, предоставляя пользователю возможность создавать и использовать на сервере процедуры и триггеры базы данных, выполняющие задачи конкретного приложения. Программы, созданные на языке PL/SQL, могут работать совместно в различных частях прикладной системы, построенной на средствах Oracle. Например, в приложении, использующем работу с формами, триггер может вызывать для выполнения некоторого действия хранимую процедуру. Всякая программа на PL/SQL состоит из трех блоков: описаний, исполнительного и блока обработки исключительных ситуаций. Исполнительный блок может быть структурирован с использованием операторных скобок BEGIN и END. Синтаксически программа на PL/SQL оформляется следующим образом: Под ред. проф. В.М.Космачёва
51
ГУАП МЦИТ Введение в «ORACLE» [DECLARE] -- объявления BEGIN -- операторы [EXCEPTION] -- исключения END; В PL/SQL существует блоки трех типов: безымянный блок, процедурный блок (PROCEDURE), функция (FUNCTION). 1. Безымянный блок [DECLARE] -- объявления BEGIN -- операторы [EXCEPTION] -- исключения END; 2. PROCEDURE PROCEDURE name IS BEGIN -- операторы [EXCEPTION] -- исключения END; 3. FUNCTION FUNCTION name RETURN datatype IS BEGIN -- операторы [EXCEPTION] -- исключения END; В блоке DECLARE описываются переменные, константы и определяемые пользователем типы данных: Identifier [CONSTANT] datatype [NOT NULL] [:=DEFAULT | expr]; CONSTANT — это ограничение на переменную, которая не меняется в программе, но должна быть инициализирована. Две переменные в разных блоках могут иметь одинаковые имена, переменным внутри одного блока не рекомендуется давать те же имена, что и имена столбцов в таблицах в этом блоке.
Под ред. проф. В.М.Космачёва
52
ГУАП МЦИТ Введение в «ORACLE»
Пример 2.3.13 DECLARE Emp NUMBER(4); BEGIN SELECT emp INTO emp FROM em WHERE ename =’Smith'; END; Такое применение переменной EMP разрешено, так как таблица ЕМ определена в другом блоке. Первый оператор BEGIN отмечает начало тела основной программы. В тело программы могут быть вложены другие блоки, ограниченные операторными скобками BEGIN и END. В блоке EXCEPTION определяются фрагменты программного кода для обработки исключительных ситуаций в программе. Последний оператор END указывает конец тела программы. В любые части программы на PL/SQL можно включать комментарии. Текст, который начинается с символов "—" и продолжается до конца текущей строки, рассматривается как комментарий. Строка, начинающаяся с ключевого слова RЕМ, также рассматривается как комментарий. В блоке программы PL/SQL, ограниченном операторами DECLARE и BEGIN, описываются переменные и константы. Любая переменная или константа должна иметь один из допустимых в Oracle типов. Константа идентифицируется ключевым словом CONSTANT и отличается от переменной тем, что попытка изменить ее значение приводит к сообщению об ошибке. Присваивание значений переменным осуществляется оператором ": =". Рассмотрим пример простейшей программы, в которой определяются переменные и выполняются действия по вычислению ЕХР(2)и ЕХР(З). Команды установки переменных окружения SERVEROUTPUT и ECHO определяют режим вывода на терминал пользователя. Системная процедура DBMS_OUTPUT.PUT_LINE обеспечивает вывод данных на терминал пользователя, а функция ЕХР вычисляет экспоненту. Символ "/" указывает на завершение текста процедуры и является командой к интерпретации и выполнению процедуры
Пример 2.3.14 SQL>set serveroutput on; SQL>set echo on; SQL>DECLARE 2
Headerl CONSTANT VARCHAR2(20):=’кспонента двух равна’;
3
Header2 CONSTANT VARCHAR2(20):=’Экспонента трех равна’;
4
Arg NUMBER:=2;
6
BEGIN
7
DBMS_OUTPUT.PUT_LINE(Headerl || Exp(Arg));
8
Arg:=Arg+l;
9
DBMS_OUTPUT.PUT_LINE(Header2 || Exp(Arg));
10
END;
11
/
— здесь задается начальное значение аргумента
2.3.4. Управление выполнением программы Оператор ветвления IF В PL/SQL предусмотрено несколько операторов, с помощью которых можно управлять выполнением программы. Oracle использует следующий синтаксис конструкции ветвления в PL/SQL: IF условие1 THEN операторы1;
— ветвь 1
[ELSIF условиеK THEN операторыK;]
— ветвьK
[ELSE операторыN;]
— ветвь альтернативы Под ред. проф. В.М.Космачёва
53
ГУАП МЦИТ Введение в «ORACLE» — операторы альтернативы END IF;
Оператор ветвления CASE При большом количестве ветвлений и/или необходимости присваивания значений удобно применить оператор CASE:
Простой оператор CASE: CASE выражение WHEN результат1 THEN значение1 WHEN результатK THEN значениеK [ELSE] значениеN END CASE;
Поисковый оператор CASE: CASE WHEN выражение1 THEN значение1 WHEN выражение2 THEN значение2
. . . WHEN выражениеN THEN значениеK [ELSE] значениеN END CASE;
Выражения CASE – используются внутри выражений когда нужно присвоить значение Синтаксис Простое_выражение_CASE:= CASE выражение WHEN результат1 THEN значение1
. . . WHEN результатK THEN значениеK [ELSE] значениеN END; Поисковое_выражение_CASE:= CASE WHEN выражение1 THEN значение1 WHEN выражение2 THEN значение2
. . . WHEN выражениеN THEN значениеK [ELSE] значениеN END;
Пример DECLARE RobertCDnum NUMBER(2); RobertCDname VARCHAR2(64); BEGIN Под ред. проф. В.М.Космачёва
54
ГУАП МЦИТ Введение в «ORACLE» RobertCDnum:=&INPUT_DATA; RobertCDname := CASE RobertCDnum WHEN 1 THEN ‘Shine’ WHEN 2 THEN ‘Princesse de Rien’ WHEN 3 THEN ‘Celle qui tue’ WHEN 4 THEN ‘Unutma (Noublie pas)’ ELSE ‘Not yet’ END; DBMS_OUTPUT.PUT_LINE(TO_CHAR(RobertCDnum) || RobertCDname); END;
Оператор цикла В PL/SQL есть три типа оператора цикла: LOOP, FOR LOOP, WHILE LOOP: LOOP Операторы EXIT [WHEN условие] ; END LOOP; Последовательность операторов между LOOP и END LOOP многократно повторяется до тех пор, пока условие не примет значение TRUE. Условие может принимать одно из трех значений: TRUE, FALSE,NULL. Этот оператор выполняется, по крайней мере, хотя бы один раз, если будет отсутствовать EXIT, то последовательность операторов будет выполняться бесконечно. Если условие принимает значение TRUE, то будет выполняться следующий за LOOP оператор FOR counter IN [REVERSE] lower_bound .. upper_bound LOOP Оператор1.; ОператорK; END LOOP; REVERSE означает изменение параметра цикла от верхней границы до нижней границы, при этом нижняя граница в операторе цикла опять стоит первой. Объявлять параметр цикла counter в операторе DECLARE нет необходимости, он по умолчанию объявляется как целый, lower_bound — нижняя граница изменения параметра цикла, upper_bound — верхняя граница изменения параметра цикла WHILE условие LOOP Оператор1; ОператорK; END LOOP; Последовательность операторов между LOOP и END LOOP повторяется до тех пор, пока условие имеет значение TRUE. Условие проверяется до выполнения последовательности операторов, если условие принимает значение FALSE, то последовательность операторов перестает выполняться. Этот оператор может ни разу не проработать, если условие перед выполнением оператора имеет значение FALSE.
МЕТКИ Метки следует использовать для структурирования программы и более гибкого управления выходом из вложенных циклов. Синтксис метки: Например FOR emp_rec IN emp_cur LOOP . . . . Под ред. проф. В.М.Космачёва
55
ГУАП МЦИТ Введение в «ORACLE» END LOOP All_emp;
Упражнения 1. Используя три формы цикла, вычислить и вывести число, факториал которого является наименьшим числом, большим заданной константы (например, 106). Для преобразования числа в строку использовать встроенную функцию TO_CHAR(число).
2.3.5. Учебная база данных В следующих разделах будем рассматривать PL/SQL на примере следующей базы данных (табл. 2.1-2.6).
Таблица 2.1. Отношение STUDENT (Студент) ST_ID SURNAME NAME
— идентификатор студента, — фамилия студента, — имя студента,
STIPEND KURS CITY BIRTHDAY
— стипендия, которую получает студент, — курс, на котором учится студент, — город, в котором живет студент, — дата рождения студента,
FAC_ID
— идентификатор факультета, на котором учится студент.
Таблица 2.2. Отношение LECTURE (Преподаватель) LECT_ID SURNAME NAME FAC_ID
— идентификатор преподавателя, — фамилия преподавателя, — имя преподавателя, — идентификатор факультета, на котором работает преподаватель.
Таблица 2.3. Отношение SUBJECT (Предмет обучения) SUBJ_ID SUBJ_NAME HOUR SEMESTR
— идентификатор предмета обучения, — наименование предмета обучения, — количество часов, отводимых на изучение предмета, — семестр, в котором изучается данный предмет
Таблица 2.4. Отношение UNIVERCITY (Факультеты) FAC_ID FAC_NAME RATING
— идентификатор факультета, — название факультета, — рейтинг факультета
Таблица 2.5. Отношение EXAM_MARKS (Экзаменационные оценки) EXAM_ID ST_ID SUBJ_ID MARK EXAM_DATE
— идентификатор экзамена, — идентификатор студента, — идентификатор предмета обучения, — экзаменационная оценка, — дата экзамена.
Таблица 2.6. Отношение SUBJLECT (Учебные дисциплины преподавателей) LECT_ID — идентификатор преподавателя, SUBJ_ID — идентификатор предмета обучения
2.3.6. Курсоры Ключевым понятием языка PL/SQL является курсор. Для выполнения предложений SQL и хранения их результатов ORACLE использует рабочие области, называемые ЛИЧНЫМИ ОБЛАСТЯМИ SQL. Конструкт PL/SQL, называемый КУРСОРОМ, позволяет вам обращаться к личной области SQL по имени и извлекать из нее информацию. Под ред. проф. В.М.Космачёва
56
ГУАП МЦИТ Введение в «ORACLE» Есть два вида курсоров: НЕЯВНЫЕ и ЯВНЫЕ. PL/SQL неявно объявляет курсор для любого предложения манипулирования данными SQL, в том числе для запроса, возвращающего только одну строку. Для запросов, возвращающих более одной строки, вы можете явно объявить курсор, чтобы обрабатывать возвращаемые строки по одной. Таким образом, каждое SQL утверждение, выполняемое сервером ORACLE, имеет индивидуальный курсор, связанный с: • неявным курсором, объявленным для всех DML-утверждений; • явным курсором, объявленным и поименованным программистом. Явный курсор — это поименованный запрос, содержащий некоторое фиксированное число строк в выборке. Чаще всего курсор содержит данные одной строки выбираемой таблицы. По существу, курсор является окном, через которое пользователь получает доступ к информации базы данных. Курсоры, в частности, могут использоваться для присваивания конкретных значений переменным программы. Объявление курсора: CURSOR cursor_name IS select_statement;
Например: DECLARE CURSOR c1 IS SELECT empno, ename, job FROM emp WHERE deptno = 20; Множество строк, возвращаемых многострочным запросом, называется АКТИВНЫМ МНОЖЕСТВОМ. Его размер равен числу строк, удовлетворяющих вашим условиям поиска. Как показывает рис.1.3, явный курсор "указывает" на текущую строку в активном множестве. Это позволяет вашей программе обрабатывать строки по одной за раз.
Рис.1.3. Обработка запроса Запрос:
SELECT empno, ename, job FROM emp WHERE deptno = 20;
Активное множество:
Курсор ──>
7369
SMITH
CLERK
7566
JONES
MANAGER
7788
SCOTT
ANALYST
7876
ADAMS
CLERK
7902
FORD
ANALYST
Текущая строка
Обработка многострочного запроса напоминает обработку файла. Например, программа на языке COBOL открывает файл, обрабатывает записи, а затем закрывает файл. Аналогично, программа PL/SQL открывает курсор, обрабатывает строки, возвращенные запросом, а затем закрывает курсор. Точно так же, как указатель файла отмечает текущую позицию в открытом файле, курсор отмечает текущую позицию в активном множестве. Рассмотрим подробнее работу явного курсора: • DECLARE
- Создает именованную SQL область
• OPEN
- Определяет активное множество
• FETCH
- Передает текущий ряд в переменную
• EMPTY
- Проверка на существование ряда, возврат к FETCH , если ряды существуют
• CLOSE
- Реализовать активное множество
При этом должны выполняться следующие правила: • нельзя включать INTO в предложение курсора; Под ред. проф. В.М.Космачёва
57
ГУАП МЦИТ Введение в «ORACLE» • если требуется использовать последовательность, то необходимо применить ORDER BY в предложении курсора.
Рис.1.4. Управление курсором OPEN Курсор ──> Активное множество FETCH
Курсор ──>
CLOSE
7369
SMITH
CLERK
7566
JONES
MANAGER
7788
SCOTT
ANALYST
7876
ADAMS
CLERK
7902
FORD
ANALYST
Текущая строка
Курсор ──>
Предложение OPEN выполняет запрос, ассоциированный с курсором, идентифицирует активное множество и позиционирует курсор перед его первой строкой. Предложение FETCH извлекает текущую строку и продвигает курсор к следующей строке. После того, как обработана последняя строка, предложение CLOSE закрывает курсор. Рассмотрим пример доступа к информации, хранимой в базе данных, с использованием курсоров. Пусть в базе данных хранится таблица LECTURE, сформированная предложениями: CREATE TABLE LECTURE (LECT_ID NUMBER, SURNAME VARCHAR2(30), NAME VARCHAR2(10), FAC_ID NUMBER); INSERT INTO LECTURE VALUES(1, 'Иванов’, 'Иван’, 100); INSERT INTO LECTURE VALUES(2, 'Петров', 'Петр’, 400); INSERT INTO LECTURE VALUES(3, 'Сидоров', 'Юрий’, 100); Опишем курсор Cur1, ориентированный на получение данных из таблицы LECTURE: DECLARE CURSOR Curl IS SELECT * FROM LECTURE; Первым шагом, необходимым для работы с курсором, является открытие курсора, которое выполняется командой: OPEN Curl; Выборка данных из курсора может быть выполнена в набор переменных подходящих типов, командой FETCH, имеющей следующий синтаксис: FETCH cursor_name INTO [fvariablel, variable2,...] | [record_name]; При этом должны соблюдаться следующие правила: • значения текущей строки записываются в переменные; • команда FETCH должна содержать то же самое количество переменных, которое содержит и курсор; • каждая переменная должна соответствовать колонкам; Например: FETCH Curl INTO Argl, Arg2, Arg3, Arg4; Полностью процедура получения данных из таблицы LECTURE представлена в примере.
Пример 2.3.19 SQL> set serveroutput on; SQL> set echo on; SQL> set terrnout on; SQL> DECLARE Argl NUMBER;
— Переменная для первого аргумента
Arg2 VARCHAR2(30);
— Переменная для второго аргумента
АгgЗ VARCHAR2(10);
— Переменная для третьего аргумента
Arg4 NUMBER;
— Переменная для четвертого аргумента Под ред. проф. В.М.Космачёва
58
ГУАП МЦИТ Введение в «ORACLE» CURSOR Curl IS SELECT * FROM LECTURE;
— Определение курсора
BEGIN OPEN Curl; FOR I IN 1..3 LOOP
-- Курсор должен быть открыт
FETCH Curl INTO Argl,Arg2, Arg3,Arg4; DBMSJDUTPUT.PUT_LINE(TO_CHAR(Argl); END LOOP; CLOSE Cur1; END; / В данной программе неудачно управление счетчиком, поскольку цикл настроен на получение конкретного числа строк, которых может и не быть в таблице. В PL/SQL для курсоров предусмотрены специальные методы %NOTFOUND и %FOUND, принимающие противоположные булевские значения. Метод %NOTFOUND вращает значение TRUE, если выборка в курсор пустая, то есть не содержит строки. После открытия курсора, но до первой команды FETCH, методы %FOUND, %NOTFOUND принимают неопределенное значение (UNKNOWN). Незнание этого факта может привести к достаточно распространенной ошибке. При организации цикла с использованием оператора WHILE и выполнением проверки на истинность %FOUND на входе, цикл не будет выполнен ни разу, несмотря на наличие данных в таблице Метод %ROWCOUNT возвращает число строк, выбранных после открытия курсора. Бывает полезно использование метода %ISOPEN логического типа, возвращающего TRUE, если курсор открыт: этот метод применяется перед использованием команды FETCH для проверки -- открыт ли курсор или нет. Обратите внимание на повторный вывод последней строки. Попытайтесь исправить организацию цикла для устранения повторного вывода. Курсор может содержать параметр, синтаксис такого курсора имеет следующий вид: CURSOR cursor_name [(parametr_name datatype,...)] IS select_statement; параметр добавляется при открытии курсора; каждый раз рекомендуется открывать курсор, когда меняется активное множество элементов. DECLARE CURSOR emp_cursor (p_deptno number, p_job varchar2) IS SELECT empno,ename FROM emp WHERE (deptno=p_deptno)AND(job = p_job); BEGIN OPEN emp_cursor(10,'clerk'); Оператор определения курсора может содержать параметрический запрос. Значения параметра задаются при открытии курсора. После выбора всех строк из таблицы курсор должен быть закрыт, синтаксис команды: CLOSE cursor name; Если возникнет необходимость, курсор может быть повторно открыт, однако, после закрытия курсора нельзя пользоваться командой FETCH В большинстве случаев, требующих явного курсора, вы можете использовать курсорные циклы FOR вместо предложений OPEN, FETCH и CLOSE, чтобы упростить кодирование. Курсорный цикл FOR неявно объявляет индекс своего цикла как запись %ROWTYPE, открывает курсор, итеративно извлекает строки данных из активного множества в поля записи, и закрывает курсор после того, как все строки обработаны. Базовый синтаксис: FOR record_name IN {cursor_name | (select_expr) } LOOP
. . . . END LOOP; При этом: • объявлять record_name, открывать и закрывать курсор -- не следует Под ред. проф. В.М.Космачёва
59
ГУАП МЦИТ Введение в «ORACLE» • при использовании (select_expr) объявлять курсор – так же не следует • частое использовании (select_expr) снижает читабельность реальной программы В следующем примере курсорный цикл FOR неявно объявляет запись emp_rec как принадлежащую типу c1%ROWTYPE: DECLARE CURSOR c1 IS SELECT ename, sal, hiredate, deptno FROM emp; BEGIN FOR emp_rec IN c1 LOOP salary_total := salary_total + emp_rec.sal; END LOOP; END;
Упражнения 2. С учетом сказанного, создать новый вариант программы выборки строк таблицы LECTURE с использованием курсоров, лишенный указанных выше недостатков. (Применить циклы LOOP и WHILE LOOP ) 3. Применить цикл FOR LOOP с явным объявлением кусора 4. Применить цикл FOR LOOP с подзапросом (SELECT)
2.3.7. Обработка исключительных ситуаций Большинство развитых языков программирования обладает встроенными механизмами обработки исключительных ситуаций. Соответствующие языковые средства предусмотрены и в PL/SQL. При возникновении в системе предопределенной или описанной пользователем ситуации происходит автоматическая передача управления в нужный фрагмент блока EXCEPTION программы на PL/SQL, где и происходит предусмотренная обработка возникшей исключительной ситуации. Некоторые предопределенные исключительные ситуации PL/SQL представлены в таблице 2.7. Полный перечень исключительных ситуаций может быть найден в руководстве по языку PL/SQL.
Таблица 2.7. Некоторые исключительные ситуации Имя исключительной ситуации
Описание предопределенной исключительной ситуации
LOGIN_DENIED
Неуспешное подключение к серверу (например, введен неверный пароль)
NOT_LOGGED_ON
Попытка выполнить действие без подключения к серверу ORACLE
INVALID_CURSOR
Ссылка на недопустимый курсор или недопустимая операция с курсором
NO_DATA_FOUND
Не найдены данные, соответствующие оператору SELECT INTO
DUP_VAL_ON_INDEX
Попытка вставить значение-дубликат в столбец с ограничением на уникальность значения
TOO_MANY_ROWS
Оператор SELECT INTO возвращает более одной строки в переменную
VALUE_ERROR
Арифметическая ошибка, ошибка преобразования или усечения
TIMEOUT_ON_RESOURCE Блокировка по времени при ожидании ресурса ZERO_DIVIDE
Деление на ноль
INVALID_NUMBER
Неудачная попытка преобразования к типу NUMBER
STORAGE_ERROR
Внутренняя ошибка языка, устанавливается, если PL/SQL недостаточно памяти
Под ред. проф. В.М.Космачёва
60
ГУАП МЦИТ Введение в «ORACLE» PROGRAM_ERROR
Внутренняя ошибка PL/SQL
CURSOR_ALREADY_OPEN Попытка открыть курсор, который уже открыт
Рассмотрим пример программы с обработкой исключительных ситуаций. В тексте программы пропущен оператор открытия курсора, поэтому при обращении к методу %FOUND неоткрытого курсора возникнет исключительная ситуация INVALID_CURSOR
Пример 2.3.22 SQL>DECLARE Argl LECTURE.LECTURE_ID%TYPE; Arg2 LECTURE.SURNAME%TYPE; АгдЗ LECTURE.NAME%TYPE; Arg4 LECTURE.FAC_ID%TYPE; Cursor Curl IS SELECT * FROM LECTURE; BEGIN FETCH Curl INTO Argl,Arg2,АгдЗ,Arg4; WHILE Curl%FOUND LOOP FETCH Curl INTO Argl,Arg2,АгдЗ,Arg4; END LOOP; EXCEPTION WHEN INVALID_CURSOR THEN DBMS_OUTPUT.PUT_LINE(‘Ошибка приложения.He открыт курсор’); END; / Для обработки исключительных ситуаций, не входящих в перечень стандартных, можно использовать специальный обработчик PL/SQL OTHERS или описать пользовательскую исключительную ситуацию и запрограммировать ее обработку. Ключевое слово OTHERS блока EXCEPTION определяет механизм универсальной обработки исключительных ситуаций, не вошедших в список ситуаций, обрабатываемых явно в блоке EXCEPTION. Введем в текст программы запрещенную операцию деления на ноль и обработаем данную исключительную ситуацию в списке OTHERS. (На самом деле в ORACLE предопределена исключительная ситуация ZERO_DIVIDE, но в данном примере это не важно, а важно то, что ее нет в списке блока EXCEPTION.)
Пример 2.3.23 SQL> DECLARE Argl LECTURE.LECTURE_ID%TYPE; Arg2 LECTURE SURNAME%TYPE; Arg3 LECTURE.NAME%TYPE; Arg4 LECTURE.FAC_ID%TYPE; Cursor Curl IS SELECT * FROM LECTURE; Arg5 NUMBER:=1; BEGIN Arg5:=Arg5/0.0; WHILE Curl%FOUND LOOP FETCH Curl INTO Argl,Arg2,Arg3,Arg4,Arg5; END LOOP; EXCEPTION Под ред. проф. В.М.Космачёва
61
ГУАП МЦИТ Введение в «ORACLE» WHEN INVALID_CURSOR THEN DBMS_OUTPUT.PUT_LINE(‘Ошибка приложения. He открыт курсор’); WHEN OTHERS THEN DBMS OUTPUT.PUT_LINE (‘Heдиагностированная ошибка приложения’); END; / Исключительная ситуация, определяемая пользователем, должна быть описана в блоке DECLARE программы. Используется следующий синтаксис описания исключительной ситуации: имя__исключительной_ситуации EXCEPTION; В программе условие возникновения исключительной ситуации определяется стандартными средствами, обычно операторами IF..THEN. После обнаружения условий возникновения исключительной ситуации она генерируется оператором RAISE, который имеет следующий синтаксис: RAISE имя_исключительной ситуации; Оператор RAISE генерирует исключительную ситуацию и передает управление на соответствующий обработчик исключительной ситуации, который определен в блоке EXCEPTION. В качестве примера в роли исключительной ситуации рассмотрим превышение значения Argl порога, равного 20.
Пример 2.3.24 SQL>DECLARE Argl LECTURE.LECTURE_ID%TYPE; Arg2 LECTURE.SURNAME%TYPE; Arg3 LECTURE.NAME%TYPE; Arg4 LECTURE.FAC_ID%TYPE; Special_case EXCEPTION; Cursor Curl IS SELECT * FROM LECTURE; BEGIN
—Пользовательская исключительная ситуация
OPEN Curl; FETCH Curl INTO Argl,Arg2,Arg3,Arg4; WHILE Curl%FOUND LOOP FETCH Curl INTO Argl,Arg2,Arg3,Arg4; IF Argl>20 THEN RAISE Special_case; END IF; END LOOP; EXCEPTION WHEN Special_case THEN DBMSJDUTPUT.PUT_LINE('Пользовательекая Исключительная ситуация'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(‘He диагностированная ошибка'); END; /
Упражнения 5. Сделать выборку из таблицы STUDENT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о студентах, живущих в Москве. 6. Сделать выборку из таблицы SUBJECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о предметах во 2-ом семестре. 7. Сделать выборку из таблицы UNIVERSITY с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о факультетах с рейтингом большим 200. 8. Сделать выборку из таблицы EXAM_MARKS с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения сведений об экзаменах, сданных в определенную дату. 9. Сделать выборку из таблицы SUBJLECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о преподавателях, читающих предмет с данным номером. Под ред. проф. В.М.Космачёва
62
ГУАП МЦИТ Введение в «ORACLE» 10. Сделать выборку из таблицы STUDENT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о студентах, живущих в Москве, и использовать пользовательскую исключительную ситуацию для исключения среди выбранных студентов тех, у которых стипендия меньше 200. 11. Сделать выборку из таблицы SUBJECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о предметах во 2-ом семестре с использованием пользовательской исключительной ситуации для исключения из полученного списка предметов с количеством часов 72. 12. Сделать выборку из таблицы EXAM_MARKS с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения сведений об экзаменах, сданных в определенную дату, и исключить с помощью пользовательской исключительной ситуации данные об оценках, полученных по заданному номеру предмета. 13. Сделать выборку из таблицы SUBJLECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о преподавателях, читающих предмет с данным номером, и исключить из полученного множества данные с помощью пользовательской исключительной ситуации о преподавателях с заданной фамилией.
2.3.8. Создание пользовательских процедур и функций Подпрограммы (процедуры и функции) в PL/SQL бывают хранимые и локальные. Хранимые подпрограммы во многом отличаются от локальных.Если подпрограмма должна будет вызываться из многих блоков, то ее делают хранимой, она хранится в базе данных. Короткие процедуры и функции рекомендуется объявлять локально в блоке, если они вызываются только из одного конкретного фрагмента программы. Хранимые подпрограммы (процедуры и функции) хранятся в базе данных в откомпилированном виде и могут вызываться из любого блока. В этом разделе будем рассматривать хранимые подпрограммы. Хранимые процедуры и функции — это объекты базы данных и, следовательно, они создаются командой CREATE и уничтожаются командой DROP. При создании процедуры и функции должны быть определены: имя объекта, перечень и тип параметров и логика работы процедуры или функции, описанные на языке PL/SQL Чтобы создать процедуру или функцию, необходимо иметь системные привилегии CREATE PROCEDURE. Для создания процедуры, функции или пакета в схеме, отличной от текущей схемы пользователя, требуются системные привилегии CREATE ANY PROCEDURE. После определения имени новой процедуры или функции необходимо задать ее имена, типы и виды параметров. Для каждого параметра должен быть указан один из видов параметра — IN, OUT или IN OUT. Вид параметра IN предполагает, что значение параметра должно быть определено при обращении к процедуре и не изменяется процедурой. Попытка изменить в теле процедуры параметр вида IN приведет к сообщению об ошибке. Вид параметра OUT предполагает изменение значения параметра в процессе работы процедуры, то есть параметр вида OUT — это возвращаемый параметр. Параметр IN OUT — это параметр, которому при вызове должно быть присвоено значение, которое может быть изменено в теле процедуры. Параметры процедур или функций имеют виды, присвоенные по умолчанию Дополнительно к определениям, необходимым для процедуры, в определении функции должен быть указан тип данных единственного возвращаемого функцией значения. Возврат значения функции выполняется командой PL/SQL RETURN. Оператор определения процедуры ORACLE использует следующий синтаксис: CREATE [OR REPLACE] PROCEDURE [схема.]имя_процедуры [ (имя_параметра[{IN | OUT | IN OUT}] тип_данных [,имя_параметра[{IN | OUT | IN OUT}] тип_данных...])] {IS | AS} Ключевое слово OR REPLACE указывает на безусловное замещение старого текста процедуры. Если ключевое слово OR REPLACE не указано, и процедура определена, то замещения старого значения кода процедуры не происходит, и возвращается сообщение об ошибке. В описании переменных процедуры не используется ключевое слово DECLARE. Блок определения данных начинается сразу после ключевого слова IS (или AS, по выбору пользователя). Рассмотрим пример создания процедуры, которая заносит в таблицу значения, зависящие от числового параметра. Пусть таблица сформирована предложением: CREATE TABLE SUBJLECT(LECT_ID NUMBER, SUBJ_ID NUMBER);
Пример 2.3.25 SQL>CREATE OR REPLACE PROCEDURE InsRec ( Argl IN NUMBER, Arg2 IN NUMBER ) IS Под ред. проф. В.М.Космачёва
63
ГУАП МЦИТ Введение в «ORACLE» Coeff CONSTANT NUMBER:=0.5; BEGIN INSERT INTO SUBJLECT VALUES(Coeff*Argl, Coeff*Arg2); END; / Исполнение созданной процедуры INSREC может быть выполнено оператором EXEC языка PL/SQL. Последующая выборка из таблицы SUBJLECT иллюстрирует изменения в базе данных, осуществленные вызовом процедуры InsRec. SQL> EXEC InsRec (240,120); Чтобы уточнить выявленные в процессе синтаксического анализа ошибки, можно воспользоваться командой PL/SQL SHOW ERRORS. Эта команда показывает ошибки, обнаруженные в процессе выполнения CREATE PROCEDURE, CREATE FUNCTION, CREATE PACKAGE, CREATE PACKAGE BODY, CREATE TRIGGER. Если команда SHOW ERRORS используется без параметров, то возвращаются ошибки последней компилированной процедуры, функции, пакета, тела пакета или триггера. Рассмотрим пример обнаружения и исправления ошибки. В процедуре, представленной выше, добавим ошибочный оператор, изменяющий значение параметра вида IN, который не должен изменяться.
Пример 2.3.26 SQL>CREATE OR REPLACE PROCEDURE InsRec (Argl IN NUMBER, Arg2 IN NUMBER) IS 2 Coeff CONSTANT NUMBER:=0.5; 3 BEGIN 4 Argl:=Argl+200;
-- ОШИБКА
5 NSERT INTO SUBJLECT VALUES(Coeff*Argl, Coeff*Arg2); 6 END; Протокол выполнения: SQL>SHOW ERRORS
Errors for PROCEDURE InsRec: LINE/COL ERROR 4/1 PLS-00363: expression 'Arg1’ cannot be used as an assignment target 4/1 PL/SQL: Statement ignored Напомним, что функции PL/SQL отличаются от процедур тем, что возвращают в вызывающую среду результат. Оператор определения функции ORACLE использует следующий синтаксис: CREATE [OR REPLACE] FUNCTION [схема.]имя_функции [ (имя_параметра[{IN | OUT | IN OUT}] тип_данных [, имя_параметра[{IN | OUT | IN OUT}] тип_данных...])] RETURN тип_данных {IS | AS} Описание типа данных для возвращаемого функцией значения требуется обязательно. При описании переменных функции так же, как и при описании переменных процедуры, не используется ключевое слово DECLARE. Блок определения данных начинается сразу после ключевого слова IS (или AS, по выбору пользователя). Рассмотрим пример создания функции, которая вычисляет сумму значений атрибутов, таких, что один из атрибутов попадает в заданный параметрами функции интервал. Пусть таблица сформирована предложением как, в примере 2.3.25.
Под ред. проф. В.М.Космачёва
64
ГУАП МЦИТ Введение в «ORACLE»
Пример 2.3.27 SQL>CREATE OR REPLACE FUNCTION SumRecInt (Argl IN NUMBER, Arg2 IN NUMBER) 2 RETURN NUMBER 3 IS 4 Sum_Var NUMBER:=0.0; 5 BEGIN 7 SELECT Sum(LECT_ID) INTO Sum_Var FROM SUBJLECT WHERE SUBJ_ID BETWEEN Argl AND Arg2; 8 RETURN Sum_Var; 9 END; / FUNCTION CREATED Если характер использования приложений изменился, то для освобождения ресурсов базы данных может потребоваться уничтожить процедуру или функцию. В собственной схеме пользователю не требуются дополнительные привилегии для уничтожения процедуры или функции. Для уничтожения процедуры или функции в схеме другого пользователя необходимо наличие привилегии DROP ANY PROCEDURE. Для уничтожения {процедуры | функции} ORACLE использует следующий синтаксис: DROP {PROCEDURE | FUNCTION} [схема.]имя_процедуры Например SQL>DROP FUNCTION SumRecInt Function dropped;
Упражнения 14. Описать процедуру, которая заносит данные в таблицу STUDENT в зависимости от параметров процедуры, вызвать эту процедуру. 15. Описать процедуру, которая заносит данные в таблицы STUDENT и EXAM_MARKS с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру. 16. Описать процедуру, которая заносит данные в таблицы STUDENT и SUBJECT с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру. 17. Описать процедуру, которая заносит данные в таблицы STUDENT и UNIVERSITY с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру. 18. Описать процедуру, которая заносит данные в таблицу LECTURE в зависимости от параметров процедуры, вызвать эту процедуру. 19. Описать и вызвать функцию, которая вычисляет сумму баллов для студентов, номера которых находятся в заданном интервале в таблице EXAM_MARKS. 20. Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, максимальный балл по заданному предмету (с некоторым номером) в таблице EXAM_MARKS. 21. Описать и вызвать функцию, которая определяет для студентов с заданной фамилией сумму баллов по заданному предмету в таблице EXAM_MARKS. 22. Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, максимальный балл по заданному названию предмета. 23. Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, средний балл по заданному названию предмета.
2.3.9. Пакеты PL/SQL Модуль — это конструкция PL/SQL, которая позволяет хранить связанные объекты в одном месте. Модули бывают только хранимыми и никогда локальными. Модуль — это именованный раздел объявлений. Все, что может входит в раздел объявлений блока, может входить и в модуль: типы, переменные, процедуры, функции, курсоры. Размещение Под ред. проф. В.М.Космачёва
65
ГУАП МЦИТ Введение в «ORACLE» их в модуле полезно, так как это позволит ссылаться на них из других блоков PL/SQL. В модулях можно описывать и глобальные переменные для PL/SQL. Процедуры, функции и глобальные переменные, объединенные общим функциональным замыслом, часто оформляют в виде единого объекта базы данных — пакета. Особенностью пакетов PL/SQL является раздельная компиляция и хранение интерфейсной и исполнительной частей пакета. Пакет как объект состоит из двух частей: спецификации пакета и тела пакета. В спецификации пакета хранится описание процедур, функций, глобальных переменных, констант и курсоров, которые доступны для внешних приложений. В теле пакета определяются все процедуры, функции и переменные, включая те, которые не были определены в спецификации пакета. Процедуры, функции и переменные, определенные в теле пакета, но не описанные в его спецификации, являются локальными. Внешние по отношению к пакету приложения не имеют права на использование локальных объектов пакета. Локальные объекты предназначены исключительно для использования только процедурами и функциями самого пакета. Особенностью пакетов PL/SQL является поддержка перегружаемых функций и процедур. Процедуры или функции могут иметь одинаковое имя, но различный по типу или количеству набор аргументов. В момент обращения к конкретной процедуре или функции по числу и типу передаваемых аргументов автоматически определяется требуемая процедура или функция, которая и исполняется. Поддержка перегружаемых процедур, в частности, используется в стандартном пакете DBMS_OUTPUT для единой формы обращения к процедуре PUT_LINE для вывода данных различных типов. Напомним, что для создания пакета пользователь должен иметь привилегию CREATE PROCEDURE. Создание пакета в схеме другого пользователя требует наличия привилегии CREATE ANY PROCEDURE.
Синтаксис оператора определения интерфейсной части (спецификации) пакета: CREATE [OR REPLACE] PACKAGE [схема.]имя_пакета {IS | AS} спецификация_пакета_на_PL/SQL Ключевое слово OR REPLACE указывает на безусловное замещение старого текста спецификации пакета. Если ключевое слово OR REPLACE не указано, и пакет определен в системе, то замещения старого значения спецификации пакета не происходит, и возвращается сообщение об ошибке. Спецификация пакета начинается с описания констант и переменных. При описании переменных пакета ключевое слово DECLARE не используется.
Пример 2.3.28 Рассмотрим пример создания спецификации пакета, которая состоит из описания константы, функции и процедуры. CREATE OR REPLACE PACKAGE РАС IS PAC_CONST CONSTANT NUMBER:=20; FUNCTION MUL(Argl NUMBER, Arg2 NUMBER) RETURN NUMBER; PROCEDURE AUDIT; END;
/ Синтаксис оператора определения исполнительной части (тела) пакета: CREATE [OR REPLACE] PACKAGE BODY [схема.]имя_пакета {IS | AS} cneцификaция_naкema_нa_PL/SQL Ключевое слово OR REPLACE указывает на безусловное замещение старого текста спецификации пакета. Если ключевое слово OR REPLACE не указано, и пакет определен в системе, то замещения старого значения спецификации пакета не происходит, и возвращается сообщение об ошибке. Определение тела пакета начинается с описания констант и переменных. Константы и переменные, описанные в спецификации пакета, являются глобальными и в теле пакета повторно не описываются. При описании констант и переменных пакета ключевое слово DECLARE не используется. При описании функций и процедур пакета в отличие от описаний одиночных функций и процедур оператор CREATE не используется. Рассмотрим пример создания тела пакета, спецификация которого приведена выше. Пусть функция пакета MUL выполняет умножение аргументов на константу пакета, а процедура AUDIT фиксирует факт обращения к функции MUL записью в таблицу значения счетчика обращений и текущей даты. Предполагается, что таблица TabAUD с Под ред. проф. В.М.Космачёва
66
ГУАП МЦИТ Введение в «ORACLE» соответствующими типами данных атрибутов к моменту создания тела пакета создана. Протокол создания тела пакета приведен ниже.
Пример 2.3.29 SQL>CREATE OR REPLACE PACKAGE BODY РАС IS 2 PAC_COUNT NUMBER:=0; 3 FUNCTION MUL(Argl NUMBER, Arg2 NUMBER) 4 RETURN NUMBER IS 5 BEGIN 6 AUDIT; 7 RETURN Argl* PAC_CONST+Arg2*PAC_CONST; 8 END; 9 PROCEDURE AUDIT IS 10 BEGIN 11 РАС COUNT:=PAC_COUNT+1; 12 INSERT INTO TabAUD VALUES (PAC COUNT, SYSDATE); 13 COMMIT; 14 END; 15 END; 16 / Package body created. Константа или переменная, описанная в спецификации пакета, может быть доступна из пользовательской программы (если процедуре или функции такой доступ разрешен). Чтобы обратиться к глобальной переменной или константе пакета, нужно указать в качестве префикса имя пакета Ниже приведен пример, иллюстрирующий возможность доступа к глобальной константе пакета и невозможность доступа к частной переменной пакета. SQL>EXEC DBMSJDUTPUT.PUT LINE{РАС.PAC_CONST); 20.0 PL/SQL procedure successfully completed. SQL>EXEC DBMS_OUTPUT.PUT_LINE(РАС.PAC_COUNT); begin dbms_output. put_line (рас. pac_count) ; end; ERROR at line 1; ORA-06550: line I, column 34: PLS-00302: component ‘PAC_COUNT' must be declared ORA-06550: line I, column 7: PL/SQL: Statement ignored Чтобы вызвать процедуру или функцию пакета, в вызове нужно указать в качестве префикса имя пакета. В заключение рассмотрим пример использования функции созданного пакета: SQL>EXEC DBMS_OUTPUT.PUT_LINE(PAC.MUL(111,222)) ; PL/SQL procedure successfully completed. При использовании переменных пакета инициализация локальных переменных пакета происходит при запуске сервера Oracle. В данном случае, после останова и повторного запуска сервера, счетчик обращений PAC_COUNT будет установлен в нулевое состояние. Если по смыслу решаемой задачи требуется независимое от остановов сервера приращение счетчика, можно воспользоваться таким объектом, как последовательность. Для освобождения ресурсов сервера может потребоваться уничтожить пакет. В собственной схеме пользователю не требуются дополнительные привилегии для уничтожения пакета. Для уничтожения пакета в схеме другого пользователя необходима привилегия DROP ANY PROCEDURE.
Под ред. проф. В.М.Космачёва
67
ГУАП МЦИТ Введение в «ORACLE»
Cинтаксис: DROP PACKAGE [BODY] [схема.]имя пакета Необязательное ключевое слово BODY указывает, что уничтожается только тело пакета. Если ключевое слово BODY опущено, то удаляется и спецификация, и тело пакета. Параметр имя_пакета задает имя уничтожаемого пакета SQL > DROP PACKAGE РАС; Package dropped
Упражнения 24. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество студентов, получающих стипендию, заданную параметром. Процедура подсчитывает число обращений к функции и заносит это число, размер стипендии, количество студентов, получающих ее, в новую таблицу, созданную заранее. 25. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество студентов, живущих в городе, заданном параметром. Процедура подсчитывает количество обращений к функции и заносит это количество, название города, количество студентов, живущих в этом городе, в новую таблицу, созданную заранее. 26. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество предметов, по которым получена оценка, заданная параметром, более чем у 20 человек. Процедура подсчитывает число обращений к функции и заносит это число, оценку и количество предметов в новую таблицу, созданную заранее. 27. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество факультетов с рейтингом, заданным параметром. Процедура подсчитывает количество обращений к функции и заносит это количество, величину рейтинга, количество факультетов с этим рейтингом в новую таблицу, созданную заранее. 28. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество преподавателей, работающих на факультетов, заданным параметром. Процедура подсчитывает количество обращений к функции и заносит это количество, номер факультета, количество преподавателей в новую таблицу, созданную заранее. 29. Создать пакет, состоящий из функции с параметрами, процедуры без параметров. Функция подсчитывает количество предметов, прочитанных в семестре, номер которого задан параметром, с количеством часов, заданным другим параметром. Процедура подсчитывает число обращений к функции и зансит это число, номер семестра, количество часов и количество предметов в новую таблицу, созданную заранее,
2.3.10. Триггеры базы данных Триггер базы данных — это процедура PL/SQL, которая автоматически запускается при возникновении определенных событий, связанных с выполнением операций вставки, удаления или модификации данных таблицы. Событие, управляющее запуском триггера, описывается в виде логических условий. Когда возникает событие, соответствующее условиям триггера, сервер ORACLE автоматически запускает триггер, то есть интерпретирует код программы триггера, записанный на языке PL/SQL. Обычно триггеры используют для выполнения сложных проверок ограничений целостности, многоаспектных проверок выполнения правил разграничения доступа и т.п. Триггер запускается при выполнении одной из трех операций изменения содержимого таблицы: INSERT, DELETE или UPDATE. Триггер может запускаться и несколькими операторами, но хотя бы один оператор из тройки должен быть обязательно указан в условии запуска триггера. Если перечень операторов, запускающих триггер, включает оператор UPDATE, то для условий срабатывания могут быть указаны конкретные изменяемые столбцы. Код триггера может выполняться либо до, либо после тех операторов, которые инициировали запуск триггера. Например, если триггер запускается для проверки полномочий пользователя на право выполнения операции, то, конечно, нужно использовать триггер с запуском до выполнения операции (с ключевым словом BEFORE). Если триггер применяется для формирования данных для аудиторской записи, то разумно использовать триггер с запуском после выполнения операции (с ключевым словом AFTER). Код триггера может быть ассоциирован либо с операцией над таблицей в целом, либо с каждой строкой, над которой выполняется операция. В зависимости от этого триггеры подразделяют на операторные триггеры и строчные триггеры. Операторные триггеры обычно используют для проверки правил разграничения доступа, оперирующих таблицей в целом, а строчные триггеры часто используют для проверки ограничений целостности при вставке строк. Условие запуска строчного триггера может быть уточнено дополнительным логическим условием. Под ред. проф. В.М.Космачёва
68
ГУАП МЦИТ Введение в «ORACLE» Чтобы создать триггер, необходимо иметь системные привилегии CREATE TRIGGER. Для создания триггера в схеме, отличной от текущей схемы пользователя, требуются системные привилегии CREATE ANY TRIGGER.
Синтаксис оператора определения триггера: CREATE [OR REPLACE] TRIGGER [схема.]имя_триггера {BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF имя_столбца[,имя_столбца...]]} [OR {INSERT | DELETE | UPDATE [OF имя_столбца[,имя_столбца...]]}...] ON [схема.]{имя_таблицы | имя_представления} [FOR EACH ROW] [WHEN условие] спецификации_пакета_на_PL/SQL Ключевое слово OR REPLACE указывает на безусловное замещение старого текста триггера. Если ключевое слово OR REPLACE не указано, и триггер определен в системе, то замещения старого значения триггера не происходит, и озвращается сообщение об ошибке. Ключевые слова BEFORE или AFTER указывают на выполнение кода триггера либо до, либо, соответственно, после операторов манипулирования данными, инициировавших запуск триггера. Ключевые слова INSERT, DELETE или UPDATE определяют конкретный оператор, запускающий триггер. Для оператора UPDATE могут быть указаны столбцы, изменение которых запускает триггер. Если конкретные столбцы не указаны, то триггер запускает изменение любого столбца. Необязательное ключевое слово OR присоединяет дополнительный оператор, запускающий триггер. Ключевое слово ON задает имя таблицы или представления, ассоциированного с триггером. Необязательное ключевое слово FOR EACH ROW определяет триггер как строчный. Необязательное ключевое слово WHEN задает дополнительное логическое условие, сужающее область действия триггера. Прежде чем перейти к примеру, построения триггера, приведем некоторые дополнительные сведения об обработке исключительных ситуаций в ORACLE. Процедура RAISE_APPLICATION_ERROR применяется для подключения к механизму обработки ошибок пользовательских точек входа. С ее помощью можно обработать до 1000 определяемых пользователем ошибок с номерами в диапазоне от20000 до -20999. Вызов процедуры RAISE_APPLICATION_ERROR приводит к генерации исключительной ситуации и завершению выполнения вызвавшей процедуру программы (сравните с рассмотренным выше оператором PL/SQL RAISE). При этом в среду, вызвавшую программу, возвращается номер и текстовое сообщение о типе ошибки. Рассмотрим пример триггера, который выполняется, если значение вводимого атрибута "уклоняется по модулю" от среднего значения для текущего состояния таблицы больше, чем на 30. Пусть таблица Tab1 сформирована предложениями: CREATE TABLE Tabl (Atl NUMBER); INSERT INTO Tabl VALUES(10); INSERT INTO Tabl VALUES(30); INSERT INTO Tabl VALUES(50); Протокол создания триггера представлен ниже. При срабатывании триггера предусмотрена генерация стандартной обработки ошибки, которой присваивается номер -20002 с соответствующим диагностирующим сообщением. Обратите внимание на предопределенную переменную :new.Atl, содержащую (по ее смыслу) вводимое значение атрибута Atl.
Пример 2.3.30 SQL>CREATE OR REPLACE TRIGGER TRIG_TBI BEFORE INSERT ON Tabl FOR EACH ROW DECLARE StatAvg NUMBER; StatN NUMBER; BEGIN SELECT COUNT(Atl),SUM(Atl) INTO StatN, StatAvg Под ред. проф. В.М.Космачёва
69
ГУАП МЦИТ Введение в «ORACLE» FROM Tabl; IF (ABS(StatAvg-StatN*(:new.Atl))>30*StatN) THEN RAISE_APPLICATION_ERROR(-20002, 'Слишком большое уклонение'); END IF; END; / Trigger created. Работу механизма триггера проиллюстрируем на примере. При вводе значения, достаточно близкого к среднему (в данном случае 40), триггер не запускается, и "ничего не происходит". При вводе значения атрибута, равного 90, соответствующая статистика указывает на большое уклонение, происходит срабатывание триггера, и новая строка не включается. Операция выборки подтверждает ожидаемое изменение в таблице. SQL>insert into tabl values(40); 1 row created. SQL>insert into tabl values (90); insert into tabl values(90) ERROR at line 1: ORA-20002: Слишком большое уклонение ORA-06512: at "SYSTEM. TRIG_TBI", line 9 ORA-04088: error during execution of trigger ‘SYSTEM .TRIG_TBI' SQL>SELECT * FROM tabl; Следующий пример иллюстрирует возможность обработки исключительной ситуации средствами пользовательской исключительной ситуации, В данном случае создается триггер, который при превышении заданного порога уклонения вводимохх) значения атрибута выводит диагностическое сообщение. При этом данные в таблицу вводятся.
Пример 2.3.31 SQL>CREATE OR REPLACE TRIGGER TRIG_TB2 BEFORE INSERT ON Tabl FOR EACH ROW DECLARE StatAvg NUMBER; StatN NUMBER; Special_case EXCEPTION;
—Пользовательская исключительная ситуация
BEGIN SELECT COUNT(Atl),SUM(Atl) INTO StatN, StatAvg FROM Tabl; IF (ABS(StatAvg - StatN*(:new.Atl))>30) THEN RAISE Special_case; END IF; EXCEPTION WHEN Special_case THEN DBMS__QUTPUT.PUT_LINE('Слишком большое уклонение'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(‘He диагностированная ошибка триггера ') ; END; / Под ред. проф. В.М.Космачёва
70
ГУАП МЦИТ Введение в «ORACLE» Trigger created. При вводе значения атрибута, равного 90, происходит срабатывание триггера TRIG_TB2. Выводится диагностическое сообщение, и вводится новая строка. Представленная операция выборки подтверждает ожидаемое изменение в таблице. SQL> insert into tabl values (90); Слишком большое уклонение В отличие от процедур, функций и пакетов сервер ORACLE не хранит код триггера в виде скомпилированного блока PL/SQL. При первом запуске триггера его код считывается из словаря данных, компилируется, и скомпилированная версия сохраняется в области SGA. Поэтому для часто используемых триггеров целесообразно код, отвечающий за процедурную часть триггера, включать в хранимую процедуру, а в теле триггера оставлять только запись условий запуска и вызовы соответствующих процедур и функций. На предложения языка SQL, включенные в код триггера ORACLE, наложены следующие ограничения. Тело триггера не может включать в себя явное использование управляющих операторов COMMIT, ROLLBACK и SAVEPOINT, операторов языка определения данных CREATE, ALTER и DROP, операторов, управляющих разграничением доступа GRANT и REVOKE, а также неявное выполнение перечисленных операторов через вызовы процедур и функций. Строчный триггер срабатывает один раз для каждой строки. Внутри триггера можно обращаться к строке, обрабатываемой в данный момент. Для этого служат две псевдозаписи — :OLD и :NEW, синтаксически они рассматриваются как записи, хотя записями не являются, поэтому их называют псевдозаписями. Тип обеих псевдозаписей определяется как Активирующая_таблица&ROWТУРЕ ; Псевдозапись :OLD не определена для операторов INSERT, a псевдозапись :NEW — для оператора DELETE, при этом ошибка генерироваться не будет, но значения полей обеих записей будут NULL значениями. Двоеточие перед :NEW и :OLD обязательно, это двоеточие используется для ограничения переменных привязки. Операции, которые выполняются над записями, не могут быть выполнены над псевдозаписями. :OLD и :NEW нельзя передавать процедурам и функциям, принимающим аргументы типа Активирующая_таблица&ROWТУРЕ ;
Упражнения 30. Создать триггер, который считает среднюю стипендию и выдает диагностическое сообщение при ревышении заданного порога уклонения вводимого значения атрибута в зависимости от средней стипендии, при этом происходит заполнение некоторой таблицы. 31. Создать триггер, который считает средний балл в заданный день и выдает диагностическое сообщение при превышении заданного порога уклонения вводимого значения атрибута в зависимости от среднего балла, при этом происходит заполнение некоторой таблицы. 32. Создать триггер, который определяет границы изменения номеров предметов и выдает диагностическое сообщение при превышении заданного порога уклонения вводимого значения атрибута, при этом происходит заполнение таблицы. 33. Создать триггер, который определяет границы изменения номеров преподавателей и выдает диагностическое сообщение при превышении заданного порога уклонения вводимого значения атрибута, при этом происходит заполнение некоторой таблицы. 34. Создать триггер, который вычисляет средний рейтинг университетов и выдает диагностическое сообщение при превышении заданного порога уклонения вводимого значения атрибута в зависимости от величины среднего рейтинга, при этом происходит заполнение некоторой таблицы. 35. Создать триггер, который определяет границы изменения номеров лекторов в зависимости от номеров читаемых курсов и выдает диагностическое сообщение при превышении заданного порога уклонения вводимого значения атрибута, при этом происходит заполнение некоторой таблицы.
2.5. Последовательности Последовательность — это объект базы данных, генерирующий неповторяющиеся целые числа. Числа, создаваемые последовательностью, могут: • Возрастать постоянно • Возрастать до определенного предела Под ред. проф. В.М.Космачёва
71
ГУАП МЦИТ Введение в «ORACLE» • При достижении определенного предела, начинать возрастать заново с начального значения. Последовательность может создавать цепочки как увеличивающихся чисел, так и уменьшающихся, можно задавать и приращение значений последовательности. Для создания последовательности требуется привилегия CREATE SEQUENCE. Для создания последовательности в схеме другого пользователя необходимо иметь привилегию CREATE ANY SEQUENCE. Оператор определения последовательности имеет следующий синтаксис: CREATE SEQUENCE [схема.]имя_последовательности [INCREMENT BY приращение] [START WITH начальное_значение] [MAXVALUE наибольшее_значение | NOMAXVALUE] [MINVALUE наименьшее_значение | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE число_элементов | NOCACHE] [ORDER | NOORDER] • INCREMENT BY определяет интервал между последовательными номерами. Если этот параметр имеет отрицательное значение, то последовательность убывающая, если положительное — то последовательность возрастающая. Значением по умолчанию является 1, параметр приращения может быть любым целым • START WITH параметром начальное_значение задает первый генерируемый номер. Если этот параметр отсутствует, то для возрастающих последовательностей первый генерируемый номер равен значению параметра MINVALUE, а для убывающей последовательности MAXVALUE. • MAXVALUE параметром наибольшее_значение задает максимальное значение, которое будет генерироваться последовательностью. Это число должно быть больше, чем началъное_значение и наименьшее_значение. Это число может быть любым числом с количеством знаков, не превышающим 28. Отсутствие верхней границы указывается ключевым словом NOMAXVALUE, которое определяет для убывающих последовательностей значение -1, а для возрастающих последовательностей 1027. • MINVALUE параметром наименьшее_значение задает минимальное число, которое будет генерироваться последовательностью. Это число должно быть меньше чем начальное_значение и наибольшее_значение. Это число может быть любым числом с количеством знаков, не превышающем 28. Отсутствие нижней границы указывается ключевым словом NOMINVALUE, которое определяет для убывающих последовательностей значение 1026, а для возрастающих последовательностей 1. • NOCYCLE является значением, используемым по умолчанию, и означает завершение генерирования последовательности по достижении конца последовательности. Если при определении последовательности указан параметр CYCLE, то после достижения очередным членом последовательности значения наибольшее_значение (для возрастающих последовательностей) выдается значение параметра наименьшее_значение. Если параметры наименьшее _значение и наибольшее_значение не указаны, то используются их значения по умолчанию. • CACHE указывает на использование техники кеширования, что обеспечивает более быструю генерацию элементов последовательности. число элементов определяет количество элементов области кеша, это число не должно превышать разницы между MAXVALUE и MINVALUE. • ORDER обеспечивает генерацию последовательных элементов точно в порядке поступления запросов. Одна последовательность может использоваться для генерации первичных ключей для нескольких таблиц. Если два пользователя обращаются к одной последовательности, то каждый из них не видит последовательные номера, сгенерированные для другого пользователя. При использовании последовательности: • для выбора следующего номера - использовать вызов типа my_seq.NEXTVAL • для выбора текущего номера - вызов тип my_seq.CURRVAL • для выбора в переменную PL/SQL - вызов типа SELECT my_seq.CURRVAL INTO my_per FROM DUAL • из последовательности my_seq выбирается новое значение в переменную my_per Псевдостолбец NEXTVAL используется для генерирования очередного номера из указанной последовательности. Обращение имеет к NEXTVAL синтаксис: Имя_последовательности.NEXTVAL; Под ред. проф. В.М.Космачёва
72
ГУАП МЦИТ Введение в «ORACLE» Псевдостолбец CURVAL используется для ссылки на текущее значение последовательного номера, до ссылки на CURVAL в текущем сеансе NEXTVAL должен быть использован хотя бы один раз. Обращение к CURVAL имеет синтаксис: Имя_последовательности.CURVAL;
Пример Рассмотрим пример создания последовательности с именем SEQ1.Начальный элемент последовательности определен 2, параметры наибольшее_значение и наименьшее_значение определены равными 3 и 1 соответственно, параметр цикла равен 2, параметр кеширования равен 2: SQL>CREATE SEQUENCE Seq1 MAXVALUE 3 MINVALUE 1 START WITH 2 CYCLE CACHE 2; SQL>SELECT SEQ1.NEXTVAL FROM Dual; NEXTVAL 2 SQL>SELECT SEQ1.NEXTVAL FROM Dual; NEXTVAL 3 SQL>SELECT SEQ1.NEXTVAL FROM Dual; NEXTVAL 1 Этот пример показывает циклическое образование элементов последовательности . Псевдостолбец NEXTVAL обычно используется для итерации значений первичных ключей. Для получения текущего значения используется псевдостолбец CURVAL. Пусть таблица сформирована предложением SQL>CREATE TABLE Tab1 (Atl NUMBER PRIMARY KEY); Рассмотрим пример, иллюстрирующий применение псевдостолбцов последовательности: SQL>INSERT INTO Tab1 VALUES (Seq1.NEXTVAL); Этим действием мы добавили строку в таблицу. SQL>SELECT Seq1.CURVAL FROM Dual; CURVAL 1 Для удаления последовательности используется команда DROP SEQUENCE. Для выполнения данной операции необходимо быть владельцем последовательности либо иметь привилегию DROP ANY SEQUENCE. Оператор удаления последовательности имеет следующий синтаксис: DROP SEQUENCE [схема.]имя_последовательноси Пример уничтожения последовательности: DROP SEQUENCE Seq1;
Упражнения 36. Создать таблицу STUDENT и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы SUBJECT. 37. Создать таблицу SUBJECT и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы STUDENT. 38. Создать таблицу LECTURE и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы STUDENT. 39. Создать таблицу UNIVERCITY и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы STUDENT. Под ред. проф. В.М.Космачёва
73
ГУАП МЦИТ Введение в «ORACLE» 40. Создать таблицу EXAM_MARKS и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы UNIVERCITY. 41. Создать таблицу SUBJLEC и заполнить ее с использованием последовательностей. Создать связь с другим пользователем и прочитать у него первичный ключ таблицы UNIVERCITY.
3. ЗАДАЧИ ПО РАЗРАБОТКЕ ПРОСТЫХ БАЗ ДАННЫХ В этом разделе представлены варианты заданий для выполнения лабораторных работ. В каждом варианте задания описаны требования, предъявляемые к проектируемой базе данных. В конце раздела приведен пример выполнения лабораторной работы.
3.1. Варианты заданий 1. База данных хроники восхождений в альпинистском клубе. В базе данных должны записываться даты начала и завершения каждого восхождения, имена и адреса участвовавших в нем альпинистов, название и высота горы, страна и район, где эта гора расположена. Дайте выразительные имена таблицам и полям, в которые могла бы заноситься указанная информация. Написать пакет, состоящий из процедур и функций, которые позволил бы выполнить следующие действия с базой данных: 1) для каждой горы показать список групп, осуществлявших восхождение, в хронологическом порядке; 2) предоставить возможность добавления новой вершины, с указанием названия вершины, высоты и страны местоположения; 3) предоставить возможность изменения данных о вершине, если на нее не было восхожения; 4) показать список альпинистов, осуществлявших восхождение в указанный интервал дат; 5) предоставить возможность добавления нового альпиниста в состав указанной группы; 6) показать информацию о количестве восхождений каждого альпиниста на каждую гору; 7) показать список восхождений (групп), которые осуществлялись в указанный пользователем период времени: 8) предоставить возможность добавления новой группы, указав ее название, вершину, время начала восхождения; 9) предоставить информацию о том, сколько альпинистов побывали на каждой горе. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
2. База данных медицинского кооператива Базу данных использует для работы коллектив врачей. В таблицы должны быть занесены имя, пол, дата рождения и домашний адрес каждого пациента. Всякий раз, когда врач осматривает больного, явившегося к нему на прием, или сам приходит к нему на дом, он записывает дату и место, где проводится осмотр, симптомы, диагноз и предписания больному, проставляет имя пациента, а также свое имя. Если врач прописывает больному какое-либо лекарство, в таблицу заносится название лекарства, способ его приема, словесное описание предполагаемого действия и возможных побочных эффектов. Создать пакет, состоящий из функций и процедур, позволяющих: 1) по заданной дате определить количество вызовов в этот день; 2) определить количество больных, заболевших данной болезнью; 3) по заданному лекарству определить его побочный эффект; 4) предоставить возможность добавления нового лекарства с описанием его свойств з БД. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
3. База данных Городской Думы. В базе хранятся имена, адреса, домашние и служебные телефоны всех членов Думы. В Думе работает порядка сорока комиссий, все участники которых являются членами Думы. Каждая комиссия имеет свой профиль, например, вопросы образования, проблемы, связанные с жильем и так далее. Данные по каждой из комиссий включают: ее нынешний состав и председатель, прежние председатели и члены этой комиссии, участвовавшие в ее работе за прошедшие 10 лет, даты включения и выхода из состава комиссии, избрания ее председателей. Члены Думы могут заседать в нескольких комиссиях. В базу заносятся время и место проведения каждого заседания комиссии с указанием Под ред. проф. В.М.Космачёва
74
ГУАП МЦИТ Введение в «ORACLE» депутатов и служащих Думы, которые участвуют в его организации. Создать пакет с процедурами и функциями, которые позволяют выполнять следующие действия: 1) показать список комиссий, для каждой ее состав и председателя; 2) предоставить возможность добавления нового члена комиссии; 3) показать список членов муниципалитета, для каждого из них список комиссий, в которых он участвовал и/или был председателем; 4) предоставить возможность добавления новой комиссии, с указанием председателя; 5) для указанного интервала дат и комиссии выдать список ее членов с указанием количества пропущенных заседаний; 6) предоставить возможность добавления нового заседания, с указанием присутствующих; 7) по каждой комиссии показать количество проведенных заседаний в указанный период времени. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
4. База данных рыболовной фирмы. Фирме принадлежит небольшая флотилия рыболовных катеров. Каждый катер имеет "паспорт", куда занесены его название, тип, водоизмещение и дата постройки. Фирма регистрирует каждый выход на лов, записывая название катера, имена и адреса членов команды с указанием их должностей (капитан, боцман и т.д.), даты выхода и возвращения, а также вес пойманной рыбы отдельно по сортам (например, трески). За время одного рейса катер может посетить несколько банок. Фиксируется дата прихода на каждую банку и дата отплытия, качество выловленной рыбы (отличное, хорошее, плохое). На борту улов не взвешивается. Написать запросы, осуществляющие операции: 1) для каждого катера вывести даты выхода в море с указанием улова; 2) предоставить возможность добавления выхода катера в море с указанием команды; 3) для указанного интервала дат вывести для каждого сорта рыбы список катеров с наибольшим уловом; 4) для указанного интервала дат вывести список банок, с указанием среднего улова за этот период; 5) предоставить возможность добавления новой банки с указанием данных о ней; 6) для заданной банки вывести список катеров, которые получили улов выше среднего; 7) вывести список сортов рыбы и для каждого сорта список рейсов с указанием даты выхода и возвращения, количества улова; 8) для выбранного пользователем рейса и банки добавить данные о сорте и количестве пойманной рыбы; 9) предоставить возможность пользователю изменять характеристики выбранного катера; 10) предоставить возможность добавления нового катера; 11) для указанного сорта рыбы и банки вывести список рейсов с указанием количества пойманной рыбы. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
5. База данных фирмы, проводящей аукционы. Фирма занимается продажей с аукциона антикварных изделий и произведений искусства. Владельцы вещей, выставляемых на проводимых фирмой аукционах, юридически являются продавцами. Лица, приобретающие эти вещи, именуются покупателями. Получив от продавцов партию предметов, фирма решает, на котором из аукционов выгоднее представить конкретный предмет. Перед проведением очередного аукциона каждой из выставляемых на нем вещей присваивается отдельный номер лота, играющий ту же роль, что и введенный ранее шифр товара. Две вещи, продаваемые на различных аукционах, могут иметь одинаковые номера лотов. В книгах фирмы делается запись о каждом аукционе. Там отмечаются дата, место и время его проведения, а также специфика (например, выставляются картины, написанные маслом и не ранее 1900 г.). Заносятся также сведения о каждом продаваемом предмете: аукцион, на который он заявлен, номер лота, продавец, отправная цена и краткое словесное описание. Продавцу разрешается выставлять любое количество вещей, а покупатель имеет право приобретать любое количество вещей. Одно и то же лицо или фирма может выступать и как продавец, и как покупатель. После аукциона служащие фирмы, проводящей аукционы, записывают фактическую цену, уплаченную за проданный предмет, и фиксируют данные покупателя. Создать пакет, состоящий из процедур и функций, позволяющий осуществить следующие операции: 1) для указанного интервала дат вывести список аукционов с указанием наименования, даты и места проведения; Под ред. проф. В.М.Космачёва
75
ГУАП МЦИТ Введение в «ORACLE» 2) добавить на указанный пользователем аукцион на продажу предмет искусства с указанием начальной цены; 3) вывести список аукционов, с указанием суммарного дохода от продажи, отсортированных по доходу; 4) для указанного интервала дат, вывести список предметов, которые были проданы на аукционах в этот период времени; 5) предоставить возможность добавления факта продажи на указанном аукционе заданного предмета; 6) для указанного интервала дат вывести список продавцов с указанием общей суммы, полученной от продажи предметов в этот промежуток времени; 7) вывести список покупателей, которые сделали приобретения в указанный интервал дат; 8) предоставить возможность добавления записи о проводимом аукционе (место, время); 9) для указанного места, вывести список аукционов; 10) для указанного интервала дат вывести список продавцов, которые принимали участие в аукционах, проводимых в этот период времени; 11) предоставить возможность добавления и изменения информации о продавцах и покупателях; 12) вывести список покупателей с указанием количества приобретенных предметов в указанный период времени. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
6. База данных библиотеки. Разработать информационную систему обслуживания библиотеки, которая содержит следующую информацию: названия книг, ФИО авторов, наименования издательств, год издания, количество страниц, количество иллюстраций, стоимость, название филиала библиотеки или книгохранилища, в которых находится книга, количество имеющихся в библиотеке экземпляров конкретной книги, количество студентов, которым выдавалась конкретная книга, названия факультетов, в учебном процессе которых используется указанная книга. Необходимо составить пакет из процедур и функций, который позволяет: 1) для указанного филиала посчитать количество экземпляров указанной книги, находящихся в нем; 2) для указанной книги посчитать количество факультетов, на которых она используется в данном филиале, и вывести названия этих факультетов; 3) предоставить возможность добавления и изменения информации о книгах в библиотеке; 4) предоставить возможность добавления и изменения информации о филиалах; 5) предусмотреть разработку триггеров, срабатывающих на пользовательские исключительные ситуации; Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
7. База данных по учету успеваемости студентов. База данных должна содержать данные о контингенте студентов (фамилия, имя, отчество, год поступления, форма обучения (дневная/вечерняя/заочная), номер или название группы); об учебном плане (название специальности, дисциплина, семестр, количество отводимых на дисциплину часов, форма отчетности (экзамен/зачет)); о журнале успеваемости студентов (год/семестр, студент, дисциплина, оценка). Разработать пакет, состоящий из процедур и функций, позволяющий: 1) для указанной формы обучения посчитать количество студентов этой формы обучения; 2) для указанной дисциплины получить количество часов и формы отчетности по этой дисциплине; 3) предоставить возможность добавления и изменения информации о студентах, об учебных планах, о журнале успеваемости при этом предусмотреть курсоры, срабатывающие на некоторые пользовательские исключительния; 4) предоставить возможность добавления и изменения информации о журнале успеваемости. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
8. База данных для учета аудиторного фонда университета База данных должна содержать следующую информацию об аудиторном фонде университета. Наименование корпуса, в котором расположено помещение, номер аудитории, расположение аудитории в корпусе, ширина и длина аудитории в метрах, назначение и вид помещения, подразделение университетаэ за которым Под ред. проф. В.М.Космачёва
76
ГУАП МЦИТ Введение в «ORACLE» закреплено помещение. В базе данных также должка быть информация о высоте потолков в помещениях в зависимости от места расположения помещений в корпусе. Следует также учитывать, что структура подразделений университета имеет иерархический вид. когда одни подразделения входят в состав других (факультет, кафедра, лаборатория). Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий: 1) рассчитать данные о площадях и объемах каждого помещения; 2) для указанного корпуса получить количество факультетов, их названия и структуру, находящиеся в этом корпусе; 3) предоставить возможность добавления и изменения информации о корпусах в университете, при этом предусмотреть курсоры, срабатывающие на некоторые пользовательские исключительные ситуации; 4) предоставить возможность добавления и изменения информации о комнатах в корпусах университета, при этом предусмотреть курсоры, срабатывающие на некоторые пользовательские исключительные ситуации. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах,
9. База данных для регистрации происшествий. Необходимо создать базу данных для регистрации происшествий. База данных должна содержать данные для регистрации сообщений о происшествиях (регистрационный номер сообщения, дата регистрации, краткая фабула (тип происшествия); информацию о принятом по происшествию решении (отказано в возбуждении дел, удовлетворено ходатайство о возбуждении уголовного дела с указанием регистрационный номера заведенного дела, отправлено по территориальному признаку); информацию о лицах, виновных или подозреваемых в совершении происшествия (регистрационный номер лица, фамилия, имя, отчество, адрес, количество судимостей), отношение конкретных лиц к конкретным происшествиям (виновник, потерпевший, подозреваемый, свидетель...). Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий: 1) рассчитать данные о количестве происшествий в указанный промежуток времени; 2) для указанного лица получить количество происшествий, в которых он зарегистрирован; 3) предоставить возможность добавления и изменения информации о происшествиях, при этом предусмотреть курсоры, срабатывающие на некоторые пользовательские исключительные ситуации; 4) предоставить возможность добавления и изменения информации о лицах, участвующих в происшествиях, при этом предусмотреть курсоры, срабатывающие на некоторые пользовательские исключительные ситуации. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
10. База данных для обслуживания работы конференции. База данных должна содержать справочник персоналий участников конференции (фамилия, имя, отчество, ученая степень, ученое звание, научное направление, место работы, кафедра (отдел), должность, страна, город, почтовый индекс, адрес, рабочий телефон, домашний телефон, e-mail), и информацию, связанную с участием в конференции (докладчик или участник, дата рассылки 1-го приглашения, дата поступления заявки, тема доклада, отметка о поступлении тезисов, дата рассылки 2-го приглашения, дата поступления оргвзноса, размер поступившего оргвзноса, дата приезда, дата отъезда, потребность в гостинице). Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий: 1) для указанной даты 1-ой рассылки вывести список приглашенных и посчитать их количество; 2) предоставить возможность добавления приглашенных на конференцию с указанием оргвзноса и даты его уплаты; 3) вывести список приглашенных, с указанием даты об уплате оргвзноса; 4) для указанной интервала дат, вывести список участников, уплативших оргвзнос в этом диапазоне; 5) для указанного города вывести название тезисов докладов, поступивших из этого города; 6) для указанного города, вывести список нуждающихся в гостинице. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
Под ред. проф. В.М.Космачёва
77
ГУАП МЦИТ Введение в «ORACLE»
11. База данных для обслуживания склада. База данных должна обеспечить автоматизацию складского учета, В ней должны содержаться следующие данные: 1) информация о "единицах хранения" — номер ордера, дата, код поставщика, балансный счет, код сопроводительного документа по справочнику документов, номер сопроводительного документа, код материала по справочнику материалов, счет материала, код единицы измерения, количество пришедшего материала, цена единицы измерения; 2) информация о хранящихся на складе материалах (справочник материалов — код класса материала, код группы материала, наименование материала); 3) информация о единицах измерения конкретных видов материалов — код материала, единица измерения (метры, килограммы, литры и т.д.); 4) информация о поставщиках материалов — код поставщика, его наименование, ИНН, юридический адрес (индекс, город, улица, дом), адрес банка (индекс, город, улица, дом), номер банковского счета. Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий: 1) посчитать количество поставщиков данного материала; 2) предоставить возможность добавления единицы хранения с указанием всех реквизитов; 3) вывести список поставщиков с указанием всех реквизитов данного материала на склад; 4) для указанного адреса банка посчитать количество поставщиков склада, пользующихся услугами этого банка. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
12. База данных фирмы. Фирма отказалась от приобретения некоторых товаров у своих поставщиков, решив самостоятельно наладить их производство. С этой целью она организовала сеть специализированных цехов, каждый из которых принимает определенное участие в технолцгическом процессе. Каждому виду выпускаемой продукции присваивается, как обычно, свой шифр товара, под которым он значится в файле товарных запасов. Этот же номер служит и шифром продукта. В записи с этим шифром указывается, когда была изготовлена последняя партия этого продукта, какова ее стоимость, сколько опера ций потребовалось. Операцией считается законченная часть процесса производства, которая целиком выполняется силами одного цеха в соответствии с техническими требованиями, перечисленными на отдельном чертеже. Для каждого продукта и для каждой операции в базе данных фирмы заведена запись, содержащая описание операции, ее среднюю продолжительность и номер чертежа, по которому можно отыскать требуемый чертеж. Кроме того, указывается номер цеха, обычно производящего данную операцию. В запись, связанную с конкретной операцией, заносятся потребные количества расходных материалов, а также присвоенные им шифры товара. Расходными называют такие материалы, как, например, электрический кабель, который нельзя использовать повторно. Когда, готовясь к выполнению операции расходный материал забирают со склада, регистрируется фактически выданное количество, соответствующий шифр товара, номер служащего, ответственного за выдачу, дата и время выдачи, номер операции и номер наряда на проведение работ, который будет обсуждаться ниже. Реально ззтраченное количество материала может не совпадать с расчетным, из-за того, например, что часть изготовленной продукции бракуется. Каждый из цехов располагает многочисленными инструментами и приспособлениями. При выполнении некоторых операций их все же не хватает, и цех вынужден обращаться в центральную инструментальную за недостающими. Каждый тип инструмента снабжен отдельным номером и на него заведена запись со словесным описанием. Кроме того, там отмечено, какое количество инструментов этого типа выделено цехам и какое осталось в инструментальной. Экземпляры инструмента конкретного типа, например гаечные ключи одного размера, различаются по своим индивидуальным номерам. На фирме для каждого типа инструмента имеется запись, содержащая перечень всех индивидуальных номеров. Кроме того, указаны даты их поступления на склад. По каждой операции в фирме отмечают типы и количества инструментов этих типов, которые должны использоваться при ее выполнении. Когда инструменты действительно берутся со склада фиксируется индивидуальный номер каждого экземпляра, указываются номер заказавшего их цеха и номер наряда на проведение работ. И в этом случае затребованное количество не всегда совпадает с заказанным. Наряд на проведение работ по форме напоминает заказ на приобретение товаров, но, в отличие от последнего, он направляется не поставщику, а в один из цехов. Оформляется этот наряд после того, как руководство фирмы сочтет необходимым выпустить партию некоторого продукта. В наряд заносятся шифр продукта, дата оформления наряда, срок, к которому должен быть выполнен заказ, а также требуемое количество продукта. Разработайте структуру таблиц базы данных, подберите имена таблиц и полей, в которых могла бы разместиться вся эта информация. Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий: Под ред. проф. В.М.Космачёва
78
ГУАП МЦИТ Введение в «ORACLE» 1) для выбранного цеха выдать список операций, выполняемых им; 2) для каждой операции — список расходных материалов, с указанием количества; 3) показать список инструментов и предоставить возможность добавления нового; 4) выдать список используемых инструментов; 5) для указанного интервала дат, вывести список нарядов; 6) показать список операций и предоставить возможность добавления новой операции; 7) выдать список расходных материалов, используемых в различных нарядах; 8) выдать список товаров, с указанием используемых инструментов; 9) показать список нарядов и предоставить возможность добавления нового; 10) выдать отчет о производстве товаров различными цехами, указав наименование цеха, название товара и его количество. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
13. База данных музыкального магазина. Таблицы базы данных содержат информацию о музыкантах, музыкальных произведениях и обстоятельствах их исполнения. Нескольких музыкантов, образующих единый коллектив, называются ансамблем. Это может быть классический оркестр, джазовая группа, квартет, квинтет и т.д. К музыкантам причисляют исполнителей (играющих на одном или нескольких инструментах), композиторов, дирижеров и руководителей ансамблей. Кроме того, в базе данных хранится информация о дискках, которыми магазин торгует. Каждый диск, а точнее, его лэйбл, идентифицируется отдельным номером, так что всем копиям, отпечатанным с матрицы в разное время, присвоены одинаковые номера. На дискке может быть записано несколько исполнений одного и того же произведения — для каждого из них в базе заведена отдельная запись. Когда выходит новый диск, регистрируется название выпустившей его компании (например, EMI), а также адрес оптовой фирмы, у которой магазин может приобрести этот диск. Не исключено, что компания-производитель занимается и оптовой продажей своих дисков. Магазин фиксирует текущие оптовые и розничные цены на каждый диск, дату его выпуска, количество экземпляров, проданных за прошлый год и в нынешнем году, а также число еще не распроданных дискок. Помимо SQL запросов для создания таблиц базы данных, разработать пакет, состоящий из процедур и функций, позволяющий получить: 1) количество музыкальных произведений заданного ансамбля; 2) список названий всех дисков заданного ансамбля; 3) список лидеров продаж текущего года, то есть названия дисков, которые чаще всего покупали в текущем году 4) предусмотреть изменения данных о дискках и ввод новых данных; 5) предусмотреть ввод новых данных об ансамблях. Предусмотреть разработку триггеров, обеспечивающих каскадные изменения в связанных таблицах.
3.2. Пример выполнения 3.2.1. Постановка задачи База данных "Скачки". В информационной системе клуба любителей скачек должна быть представлена информация об участвующих в скачках лошадях (кличка, пол, возраст), их владельцах (имя, адрес,телефон) и жокеях (имя, адрес, возраст, рейтинг). Необходимо сформировать таблицы для хранения информации по каждому состязанию: дата, время и место проведения скачек (ипподром), название состязаний (если таковое имеется), клички участвующих в заездах лошадей и имена жокеев, занятые ими места и показанное в заезде время. Требуется: • сформировать структуру таблиц базы данных; • подобрать подходящие имена таблицам и их полям; • обеспечить требования нормализации таблиц базы данных; • сформировать SQL-запросы для создания таблиц базы данных с указанием первичных и внешних ключей и требуемых ограничений; • создать пакет с курсором и триггеры. Под ред. проф. В.М.Космачёва
79
ГУАП МЦИТ Введение в «ORACLE»
3.2.2. Описание структуры таблиц базы данных Опишем структуру таблиц, связи между ними и произведем их нормализацию. Создадим две вспомогательные таблицы Pol и Ippodrom. • Таблица Pol содержит возможные значения пола лошади (поле Pol_Value) и их порядковые номера (поле Force_Pol). Поле Force_Pol является первичным ключом таблицы. • Таблица Ippodrom содержит возможные названия ипподромов (поле Ippodrom_Name) и их порядковые номера (поле Ippodrom_ID). Поле Ippodrom_ID является первичным ключом таблицы. • Таблица Forces содержит информацию о лошадях и содержит следующие поля: Force_ID - содержит идентификатор лошади и это поле объявлено как первичный ключ. Force_Name - содержит имя лошади и является уникальным. Force_Pol - содержит информацию о поле лошади и является внешним ключом (оно ссылается на поле Force_Pol таблицы Pol). Force_Age - содержит информацию о возрасте лошади. Vladel_ID - содержит информацию о владельце лошади и является внешним ключом (ссылается на поле Vladel_ID таблицы Vladel). • Таблица Gokey содержит информацию о жокеях: Gokey_ID - содержит идентификатор жокея и это поле объявлено как первичный ключ. Gokey_Name - содержит имя жокея. Gokey_Address - содержит адрес жокея. Gokey_Age - содержит информацию о возрасте жокея и имеет ограничение (Gokey_Age > 18). Gokey_Reiting - содержит информацию о рейтинге жокея и имеет ограничение (Gokey_Reiting > 0) • Таблица Vladel содержит информацию о владельцах лошадей. Vladel_ID - содержит идентификатор владельца и это поле объявлено как первичный ключ. Vladel_Name - содержит имя владельца. Vladel_Address - содержит адрес владельца. Vladel_Telephon - содержит телефон владельца. • Таблица Zabeg содержит информацию о забегах: Zabeg_ID - содержит идентификатор забега и это поле объявлено как первичный ключ. Zabeg_Data - содержит дату забега. Zabeg_Time - содержит время забега. Ippodromid - содержит идентификатор ипподрома и является внешним ключом (ссылается на поле Ippodromjd таблицы Ippodrom). Zabeg_Name - содержит информацию о названии забега. • Таблица RezuIts_Zabeg содержит результаты забегов: Rez_ID - содержит идентификатор результата забега и это поле объявлено как первичный ключ. Zabeg_ID - содержит идентификатор забега и является внешним ключом (ссылается на поле Zabeg_id таблицы Zabeg). Force_ID - содержит идентификатор лошади и является внешним ключом (ссылается на поле Force_id таблицы Forces). Gokey_ID - содержит идентификатор жокея и является внешним ключом Под ред. проф. В.М.Космачёва
80
ГУАП МЦИТ Введение в «ORACLE» (ссылается на поле Gokey_ID таблицы Gokey). Rezult - содержит информацию о занятом месте, Rez_Time — содержит информацию о показанном в заезде времени.
Во всех таблицах изменения родительского ключа разрешаются, но при этом осуществляется коррекция всех значений внешних ключей, ссылающихся на модифицируемое значение родительского ключа. Таким образом обеспечивается ссылочная целостность базы данных. База данных находится в нормализованном состоянии.
3.2.3. Создание и заполнение таблиц Таблица "Пол": CREATE TABLE Pol (Force_Pol INTEGER PRIMARY KEY, Pol_Value VARCHAR(10) NOT NULL); Заполнение таблицы: insert into Pol values (1,'man'); insert into Pol values (2,'woman');
Таблица "Ипподромы": create table ippodrom (ippodrom_id integer primary key, ippodrom_name varchar(20) unique not null); Заполнение таблицы: Под ред. проф. В.М.Космачёва
81
ГУАП МЦИТ Введение в «ORACLE» insert into ippodrom values (1,'Chesmenka'); insert into ippodrom values (2,'Sportsmen'); insert into ippodrom values (3,'Professional');
Таблица "Лошади": create table forces ( force_id integer primary key, force_name varchar(20) unique not null, force_pol integer, force_age integer not null, vladel_id integer, FOREIGN KEY (force_pol) REFERENCES pol, FOREIGN KEY (vladel_id) REFERENCES vladel) ; Заполнение таблицы: insert into forces values (1,'Veterok',1,3,1); insert into forces values (2,'Strela',2,2,4); insert into forces values (3,'Nochka',2,1,3); insert into forces values (4,'Pobeditel',1,2,2); insert into forces values (5,'Mig',1,1,1); insert into forces values (6,'Vasilinka',2,3,2);
Таблица "Жокеи": create table gokey ( gokey_id integer primary key, gokey_name varchar(20) not null, gokey_address varchar(40) not null, gokey_age integer check (gokey_age>=18) , gokey_reiting integer check (gokey_reiting>=0) ) ; Заполнение таблицы: insert insert insert insert insert insert
into into into into into into
gokey values (1,'Ivlev','Moskva',21,314); gokey values (2,'Semenov','Moskva',35,245); gokey values (3,'Nikitin','Voronegh',25,450); gokey values (4,'Shevelev','Moskva',28,190); gokey values (5,'Popov','Krasnodar',33,254); gokey values (6, 'Krasnov', 'SPB',23,120);
Таблица "Владельцы": create table vladel ( vladel_id integer primary key, vladel_name varchar(20) not null, vladel_address varchar(40) not null, vladel_telephon varchar(20) not null); Заполнение таблицы: insert insert insert insert
into vladel into vladel into vladel into vladel
values (1,'Petrov','Moskva',1652763); values (2,'Sidorov','SPB',6525622); values (3,'Semenov','Minsk',7657652); values (4,'Krasnova','Samara',8766632);
Таблица "Забеги": create table zabeg ( zabeg_id integer primary key, zabeg_data date not null, Под ред. проф. В.М.Космачёва
82
ГУАП МЦИТ Введение в «ORACLE» zabeg_time varchar(20) not null, ippodrom_id integer, zabeg_name varchar(20), FOREIGN KEY (ippodrom_id) REFERENCES ippodrom); Заполнение таблицы: insert into zabeg values (1,U-APR-02', '18:30',1,'Aprelski'); insert into zabeg values (2,'3-MAY-021,'12:30',3,'Mayski'); insert into zabeg values (3,'l-SEP-02','14:00',2,'Septem'); insert into zabeg values (4,'l-DEC-021,'18:30',l,'NewYear'); insert into zabeg values (5, 'l-FEB-03', 48: 30 ',2, 'Febrary') ; insert into zabeg values (6,'15-APR-03','ll:00?f3,'AprelskiO3'); insert into zabeg values (7, 'l-OCT-03','18:30',1,'October03') ;
Таблица "Результаты забегов": create table rezults_zabeg ( rez_id integer primary key, zabeg_id integer, force_id integer, gokey_id integer, rezult integer not null, rez_time real not null, FOREIGN KEY(force_id) REFERENCES forces, FOREIGN KEY(gokey_id) REFERENCES gokey, FOREIGN KEY(zabeg_id) REFERENCES zabeg); Заполнение таблицы: insert into rezults_zabeg values (1,1,1,2,1,12.23); insert into rezults_zabeg values (2,1,2,1,2,12.45); insert into rezults_zabeg values (3,1,4,4,3,14.21); insert into rezults_zabeg values (4,1,3,3,4,15.23); insert into rezults_zabeg values (5,2,1,2.3,16.23); insert into rezults_zabeg values (6,2,2,1,1,12.43); insert into rezults_zabeg values (7,2,3,3,2,12.56), insert into rezuits_zabeg values (8,3,1,1,1,12.23); insert into rezults_zabeg values (9,3,2,2,2,14.23); insert into rezults_zabeg values (10,3,4,3,3,15.03);
3.2.4. Описание программы Опишем процедуры и функции, которые вошли в пакет PACZABEG, созданный на языке PL\SQL для работы с базой данных "Скачки". • Функция Kolvo_Forces_Of_VIadel(ArgForces.vladel_id%TYPE) возвращает натуральное значение, которое показывает количество лошадей, имеющихся у заданного владельца (Arg - идентификатор владельца). • Процедура Forces_Of_Vladel(Arg vladel. vladel_name%TYPE) выводит список кличек лошадей, имеющихся у заданного владельца (Arg - имя владельца). В процедуре используется курсор, содержащий запрос с выборкой, имеющий следующий вид: Cursor CurForcel IS SELECT Forces.Force_name FROM forces WHERE vladel_id=(select vladel_id from vladel where vladel_name=arg) Под ред. проф. В.М.Космачёва
83
ГУАП МЦИТ Введение в «ORACLE» • Процедура Inform_About_VladeI(ArgForces.Force_Name%TYPE) выводит информацию о владельце (имя, адрес, телефон) по заданной кличке лошади (Arg). В процедуре используется курсор, содержащий запрос с выборкой, имеющий следующий вид: Cursor CurVladell IS SELECT vladel_name,vladel_address,vladel_telephon FROM Vladel WHERE vladel_id=(Select vladel_id From Forces WHERE force_name=Arg) • Процедура Inform_About_Zabegs(ArgZabeg.zabeg_data%TYPE) выводит информацию о забеге (клички участвующих лошадей, имена жокеев, занятые места и показанное в забеге время) по заданной дате забега (Arg). В процедуре используется курсор, содержащий запрос с выборкой, имеющий следующий вид: Cursor CurZabegl IS SELECT Forces.force_name,Gokey.gokey_name, rezults_zabeg.rezult,rezults_zabeg.rez_time FROM Forces,Gokey,rezults_zabeg WHERE (Forces.force_id=rezults_zabeg.force_id)AND (Gokey.gokey_id=rezults_zabeg.gokey_id)AND rezults_zabeg.zabeg_id=(select zabeg_id from zabeg where zabeg_data=arg) • Процедура Liders_Zabeg показывает лидеров всех забегов. В процедуре используется курсор, содержащий запрос с выборкой, имеющий следующий вид: Cursor CurLiderl IS SELECT Forces.Force_name,Gokey.gokey_name, rezults_zabeg.rez_time,zabeg.zabeg_data FROM Forces,Gokey,rezults_zabeg,zabeg WHERE (rezults_zabeg.rezult=l)AND(forces.force_id=rezults_zabeg.force_id)AND (gokey.gokey_id=rezults_zabeg.gokey_id)AND(zabeg.zabeg_id=rezults_zabeg.zabeg_id) • Процедура New_Zabeg(Argl zabeg.zabeg_id%TYPE, Arg2 zabeg.zabeg_data%TYPE, Arg3 zabeg.zabeg_time%TYPE, Arg4 zabeg.ippodrom_id%TYPE, Arg5 zabeg.zabeg_name%TYPE, Arg6 rezuIts_zabeg.rez_id%TYPE, Arg7rezults_zabeg.force_id%TYPE, Arg8 rezults_zabeg.gokey_id%TYPE, Arg9 rezults_zabeg.rezult%TYPE, Argl0 rezults_zabeg.rez_time%TYPE) осуществляет ввод данных для нового забега. При этом происходит добавление в таблицах Zabeg и Rezults_Zabeg. Создадим триггеры для обеспечения каскадных изменений в связанных таблицах базы данных "Скачки". • Триггер TRIG_Forces__Pol используется для таблицы Pol и обеспечивает каскадные изменения в связанных с ней таблицах. • Триггер TRIG_Forces_Vladel используется для таблицы Vladel и обеспечивает каскадные изменения в связанных с ней таблицах. • Триггер TRIG_Zabeg_Ipp используется для таблицы Ippodrom и обеспечивает каскадные изменения в связанных с ней таблицах. • Триггер TRIG_RezZabeg_Force используется для таблицы Forces и обеспечивает каскадные изменения в связанных с ней таблицах. • Триггер TRIG_RezZabeg_Gokey используется для таблицы Gokey и обеспечивает каскадные изменения в связанных с ней таблицах.
3.2.5 Создание пакета Создание заголовка пакета: CREATE OR REPLACE PACKAGE PACZABEG AS FUNCTION Kolvo_Forces_Of_Vladel(Arg Forces.vladel_id%TYPE) RETURN INTEGER; Под ред. проф. В.М.Космачёва
84
ГУАП МЦИТ Введение в «ORACLE» PROCEDURE Forces_Of_Vladel (Arg vladel.vladel_name%TYPE) ; PROCEDURE Inform_About_Vladel (Arg Forces.Force_Name%TYPE); PROCEDURE Inform_About_Zabegs (Arg Zabeg.zabeg_data%TYPE) ; PROCEDURE Liders_Zabeg; PROCEDURE New_Zabeg (Argl zabeg.zabeg_id%TYPE,Arg2 zabeg.zabeg_data%TYPE, Arg3 zabeg.zabeg_time%TYPE, Arg4 zabeg.ippodrom_id%TYPE, Arg5 zabeg.zabeg_name%TYPE, Arg6 rezults_zabeg.rez_id%TYPE, Arg7 rezults_zabeg.force_id%TYPE, Arg8 rezults_zabeg.gokey_id%TYPE, Arg9 rezults_zabeg.rezult%TYPE, Argl0 rezults_zabeg.rez_time%TYPE) ; END;
Создание тела пакета: CREATE OR REPLACE PACKAGE BODY РАСZABEG AS FUNCTION Kolvo_Forces_Of_Vladel (Arg Forces.vladel_id%TYPE) RETURN INTEGER IS n INTEGER; BEGIN Select COUNT (*) INTO n From Forces Where vladel_id=Arg; RETURN n; END; PROCEDURE Forces_Of_Vladel (Arg Vladel.vladel_name%TYPE) IS Tl Forces.Force_Name%TYPE; Cursor CurForcel IS SELECT Forces.Force_name FROM forces WHERE vladel_id=(select vladel_id from vladel where vladel_name=arg); BEGIN Open CurForcel; FETCH CurForcel INTO Tl; WHILE CurForcel%FOUND LOOP DBMS_OUTPUT.PUT_LINE (CurForcel%ROWCOUNT| |Tl); FETCH CurForcel INTO Tl; END LOOP; Close CurForcel; END; PROCEDURE Inform About Vladel (Arg Forces.Force_Name%TYPE) IS Tl Vladel.vladel_name%TYPE; T2 Vladel.vladel_address%TYPE; T3 Vladel.vladel_telephon%TYPE; Cursor CurVladell IS SELECT vladel_name,vladel_address,vladel_telephon FROM Vladel WHERE vladel_id=(Select vladel_id From Forces WHERE force_name=Arg); BEGIN Open CurVladell; FETCH CurVladell INTO Tl,T2,T3; WHILE CurVladell%FOUND LOOP DBMS_OUTPUT.PUT_LINE(CurVladell%ROWCOUNT| | '-Name'I ITlI I'-Address • | IT2| | '-Telephon1I IT3); Под ред. проф. В.М.Космачёва
85
ГУАП МЦИТ Введение в «ORACLE» FETCH CurVladell INTO Tl,T2,T3; END LOOP; Close CurVladell; END; PROCEDURE Inform_About_Zabegs (Arg Zabeg.zabeg_data%TYPE) IS Tl Forces.force_name%TYPE; T2 Gokey.gokey_name%TYPE; T3 rezults_zabeg.rezult%TYPE; T4 rezults_zabeg.rez_time%TYPE; Cursor CurZabegl IS SELECT Forces.force_name,Gokey.gokey_name,rezults_zabeg.rezult,rezults_zabeg.rez_time FROM Forces,Gokey,rezults_zabeg WHERE (Forces.force_id=rezults_zabeg.force_id)AND(Gokey.gokey_id=rezults_zabeg.gokey_id)AND rezults_zabeg.zabeg_id=(select zabeg_id from zabeg where zabeg_data=arg); BEGIN Open CurZabegl; FETCH CurZabegl INTO Tl,T2,T3,T4; WHILE CurZabegl%FOUND LOOP DBMS_OUTPUT.PUT_LINE(CurZabegl%ROWCOUNT||'-ForceName ‘||Tl||'-Gokey ’|| T2|| '-Mesto’||T3||'-Time’||T4); FETCH CurZabegl INTO T1,T2,T3,T4; ENP LOOP; Close CurZabegl; END; PROCEDURE Liders_Zabeg IS Tl Forces.Force_name%Type; T2 Gokey.gokey_name%TYPE; T3 rezults_zabeg.rez_time%Type; T4 zabeg.zabeg_data%Type; Cursor CurLiderl IS Select Forces.Force_name, Gokey.gokey_name, rezults_zabeg.rez_time, zabeg,zabeg_data FROM Forces, Gokey, rezults__zabeg, zabeg WHERE (rezults_zabeg.rezult=l)ANDforces.force_id=rezults_zabeg.force_id)AND (gokey.gokey_id=rezults_zabeg.gokey_id)AND(zabeg.zabeg_id=rezults_zabeg.zabeg id); BEGIN Open CurLiderl; FETCH CurLiderl INTO T1,T2,T3,T4; WHILE CurLiderl%FOUND LOOP DBMS_OUTPUT.PUT_LINE(CurLiderl%ROWCOUNT|| '-'||Tl||’-' ||T2||’-'||T3|| '-'||T4); FETCH CurLiderl INTO T1,T2,T3,T4; END LOOP; Close CurLiderl; END; PROCEDURE New_Zabeg (Argl zabeg.zabeg_id%TYPE, Arg2 zabeg.zabeg_data%TYPE, Arg3 zabeg.zabeg_time%TYPE, Arg4 zabeg.ippodrom_id%TYPE, Arg5 zabeg.zabeg_name%TYPE, Arg6 rezults_zabeg.rez_id%TYPE, Arg7 rezults_zabeg.force_id%TYPE, Arg8 rezults_zabeg.gokey_id%TYPE, Arg9 rezults_zabeg.rezult9oTYPE, Arg10 rezults_zabeg.rez_time%TYPE) IS BEGIN INSERT INTO zabeg VALUES(argl,arg2,arg3,arg4,arg5); COMMIT; Под ред. проф. В.М.Космачёва
86
ГУАП МЦИТ Введение в «ORACLE» INSERT INTO rezults_zabeg VALUES(arg6,argl,arg7,arg8,arg9,arglO); COMMIT; END; END;
Создание триггеров: CREATE OR REPLACE TRIGGER TRIG_Forces_Pol BEFORE UPDATE ON Pol FOR EACH ROW BEGIN IF (:old.force_pol:new.force_pol) THEN UPDATE Forces SET force_pol=:new.force_pol WHERE force_pol=:old.force_pol; END IF; END; CREATE OR REPLACE TRIGGER TRIG_Forces_Vladel BEFORE UPDATE ON vladel FOR EACH ROW BEGIN IF (:old.vladel_id:new.vladel_id) THEN UPDATE Forces SET vladel_id=:new.vladel_id WHERE vladel_id=:old.vladel_id; END IF; END; CREATE OR REPLACE TRIGGER TRIG_Zabeg_Ipp BEFORE UPDATE ON Ippodrom FOR EACH ROW BEGIN IF (:old.ippodrom_id:new.ippodrom_id) THEN UPDATE zabeg SET ippodrom_id=:new.ippodrom_id WHERE ippodrom_id=:old.ippodrom_id; END IF; END; CREATE OR REPLACE TRIGGER TRIG_RezZabeg_Force BEFORE UPDATE ON Forces FOR EACH ROW BEGIN IF (:old.force_id:new.force_id) THEN UPDATE rezults_zabeg SET force_id=:new.force_id WHERE force_id=:old.force_id; END IF; END; CREATE OR REPLACE TRIGGER TRIG_RezZabeg_Gokey BEFORE UPDATE ON gokey FOR EACH ROW BEGIN IF (:old.gokey_ido:new.gokey_id) THEN UPDATE rezults_zabeg SET gokey_id=:new.gokey_id WHERE gokey_id=:old,gokey_id; END IF; END;
/ 3.2.6. Работа с пакетом Приведем примеры вызова процедур и функций этого пакета. Для вызова функции Kolvo_Forces_Of_Vladel необходимо установить среду, а затем воспользоваться следующим оператором: SQL> exec DBMS_OUTPUT.PUT_LINE (TO_CHAR(PACZABEG.Kolvo_Forces_Of_Viade (1) ) ) ; На экране появятся число, характеризующее количество лошадей, имеющихся у владельца с номером 1. Для вызова процедуры Forces_Of_VladeI необходимо воспользоваться следующим оператором: SQL> exec PACZABEG. Forces_Of_Vladel ('Petrov'); Под ред. проф. В.М.Космачёва
87
ГУАП МЦИТ Введение в «ORACLE» На экране появится список кличек всех лошадей, имеющихся у данного владельца с фамилией 'Petrov'. Для вызова процедуры Inform_About_VladeI необходимо воспользоваться следующим оператором: SQL>exec PACZABEG.Inform_About_Vladel('Strela' ) ; На экране появится информация о владельце лошади с кличкой 'Strela'. Для вызова процедуры Inform_About_Zabegs необходимо воспользоваться следующим оператором: SQL>exec PACZABEG. Inform_About_Zabegs('l-feb-03'); На экране появится информация о забеге в указанную дату 'l-feb-ОЗ’ Формат даты может быть задан и другим образом, для этого необходимо сделать запрос SQL>select sysdate from dual; Для вызова процедуры Liders_Zabeg необходимо воспользоваться следующим оператором: SQL>exec PACZABEG.Liders_Zabeg; В результате на экране появятся лидеры всех заездов. Для вызова процедуры New_Zabeg необходимо воспользоваться следующим оператором: SQL> exec PACZABEG.New_Zabeg(8,'l-nov-03' , ' 11:00' , 1,'November’,11,8,11,1,12.56) ; В результате будут сделаны добавления в двух таблицах: Забеги и Результаты забегов.
СПРАВОЧНИК Обзор комманд SQL*plus Подстановка (амперсенд (&)) Переменными подстановки являются имена переменных, определенных польз., перед которыми стоит один или два амперсенда (&). Когда в команде есть переменная подстановки, то SQL*Plus выполняет команду так, как будто вместо ссылки на эту переменную стоит ее значение. Пример. Предположим, что переменная SORTCOL имеет значение = “JOB”, а переменная MYTABLE= “EMP”. Тогда SQL*Plus выполнит команды SQL> BREAK ON &SORTCOL SQL> SELECT &SORTCOL, SAL 1 FROM &MYTABLE 2 ORDER BY &SORTCOL; так, как будто было написано SQL> BREAK ON JOB SQL> SELECT JOB, SAL 2 FROM EMP 3 ORDER BY JOB; Подстановку значений переменных можно применять в любом месте команд. SQL и SQL*Plus, кроме 1-го слова, вводимого в ответ на приглашение. Если SQL*Plus встречает подстановку переменной с неопределенным значением, то он запрашивает это значение у пользователя. Пример. Предположим, что значение для переменной GIVENNAME не определено, и Вы ввели след. команду: SQL> SELECT * FROM EMP WHERE ENAME = ‘&GIVENNAME’; Под ред. проф. В.М.Космачёва
88
ГУАП МЦИТ Введение в «ORACLE» Тогда SQL*Plus выведет на экран приглашение: Введите значение для givenname: В качестве значения можно ввести любую последовательность символов, включая пробелы и знаки препинания. Если сама переменная в команде заключена в кавычки, то их вводить не надо. SQL*Plus в любом случае будет читать вводимое Вами значение с клавиатуры терминала, даже если ввод или вывод перенаправлены в файл. Если терминала нет (в случае, когда команды выполняются из файла, в пакетном режиме), то SQL*Plus использует файл, в который перенаправлен ввод. Чтобы добавить к подстанавливаемому значению какие-нибудь символы, надо написать их сразу после имени переменной, отделив их точкой. Пример. SQL> SELECT * FROM EMP WHERE EMPNO=’&E.01’; Введите значение для E: 123 воспринимается как SQL> SELECT * FROM EMP WHERE EMPNO=’12301’;
символы & и && ( Подстановка ) Если перед именем переменной стоит &, то SQL*Plus не станет описывать ее неявной командой DEFINE. Это значит, что встретив снова подстановку этой переменной, (в др. команде или при повторном выполнении данной) SQL*Plus заново попросит ввести ее значение. Если перед именем переменной поставить &&, то после ввода значения она будет автоматически описана командой DEFINE и повторный ввод значения не потребуется. Пример. В командном файле STATS (выполняющем некоторые статистические вычисления) записано следующее: SELECT &&GROUP_COL, MAX(&&NUMBER_COL) MAXIMUM, MIN(&&NUMBER_COL) MINIMUM, SUM(&&NUMBER_COL) TOTAL, AVG(&&NUMBER_COL) AVERAGE FROM &TABLE GROUP BY &&GROUP_COL; При запуске этого файла SQL*Plus до начала выполнения файла запросит значения переменных: Введите значение для group_col: PROJNO Введите значение для number_col: SAL Введите значение для table: EMP Затем SQL*Plus выполнит следующий запрос: SELECT PROJNO, MAX(SAL) MAXIMUM, MIN(SAL) MINIMUM, SUM(SAL) TOTAL, AVG(SAL) AVERAGE FROM EMP GROUP BY PROJNO; Если Вы повторно запустите выполнение этого запроса, то SQL*Plus потребует ввести только значение переменной TABLE (перед ней стоит один амперсенд). Для переменных с двумя амперсендами (GROUP_COL or NUMBER_COL) ввод значений не потребуется. Ограничения при подстановке переменных. Подстановку переменных нельзя использовать в командах редактирования APPEND, CHANGE, DEL и INPUT. Также подстановку нельзя использовать в командах, в которых она бессмысленна (т.е. в командах типа HELP, REMARK и TIMING). Команды APPEND, CHANGE и INPUT воспринимают текст, начинающийся с амперсанда Под ред. проф. В.М.Космачёва
89
ГУАП МЦИТ Введение в «ORACLE» как простой текст. Перечисленные ниже переменные, устанавливаемые командой SET, непосредственно влияют на процесс подстановки переменных и параметров. SET SCAN включает и выключает подстановку. SET DEFINE устанавливает символ подстановки. Подразумеваемый символ -- &. SET ESCAPE устанавливает символ отмены. Этот символ нужно ставить перед символом замены, если мы хотим, чтобы он был воспринят SQL*Plus как обыкновенный символ, а не как символ замены. Подразумеваемый символ отмены -- \ SET VERIFY ON вызывает печать на экране каждой строки командного файла до и после подстановки переменных. SET CONCAT устанавливает символ, ставящийся между именем переменной и подсоединяемой к ее значению строкой. Подразумеваемый символ -- . (точка).
@ (запуск командного файла) @имя_файла[.расширение] расширение - по умолчанию .SQL. Подразумеваемое расширение можно изменить командой SET. Вы можете включать в командный файл любые команды SQL или SQL*PLUS, которые вы вводите интерактивно. Данная команда действует подобно START, но не позволяет передавать параметры. Например, чтобы выполнить командный файл PRINTRPT.SQL, введите: SQL> @PRINTRPT Чтобы выполнить командный файл WKRPT.QRY, введите: SQL>@WKRPT.QRY
/ (наклонная черта) Ввод наклонной черты вызывает выполнение команды SQL или блока PL/SQL, находящейся (находящегося) в данный момент в буфере команд. Вы можете вводить наклонную черту после командного приглашения или после приглашения с номером строки, выдаваемого для ввода очередной строки. Данная команда действует подобно команде RUN, но она не выводит на ваш экран команду из буфера. Выполнение команды SQL или блока PL/SQL, используя “/”, не изменит номер текущей строки в буфере, если команда в буфере не содержит ошибок. В случае существования ошибки SQL*PLUS поставит указатель текущей строки на строку с ошибкой. Например, чтобы посмотреть команду, которую Вы будете выполнять, Вы можете вывести содержимое буфера: SQL> LIST 1* SELECT ENAME, JOB FROM EMPWHERE ENAME = ‘JAMES’ Чтобы выполнить эту команду, введите “/”. SQL> / Для вышеприведенного запроса SQL*PLUS покажет следующее: ENAME JOB --------- --------AMES CLERK
ACCEPT (принять) ACC[EPT] переменная [NUM[BER] | CHAR] [PROMPT текст | NOPR[OMT]] [HIDE] Команда ACCEPT читает строку с устройства ввода и сохраняет ее в указанной пользователем переменной. Переменная -- имя переменной, в которой вы хотите сохранить значение. Если переменная не существует, то SQL*PLUS создаст ее. NUM[BER] -- Ограничивает тип данных переменной типом NUMBER. Если ответ не соответствует типу данных, ACCEPT выдает сообщение об ошибке и завершается. CHAR -- Ограничивает тип данных переменной типом CHAR. Если ответ не соответствует типу данных, Под ред. проф. В.М.Космачёва
90
ГУАП МЦИТ Введение в «ORACLE» ACCEPT выдает сообщение об ошибке и завершается. PROMPT текст -- Выводит текст на экран до приема значения переменной от пользователя. NOPR[OMPT] -- Пропускает строку и ожидает ввода без вывода подсказки. HIDE -- Подавляет отображение вводимых данных.
Пример. Чтобы вывести подсказку “Оклад: “ и поместить ответ в переменную SALARY (с типом данных NUMBER), введите: SQL> ACCEPT salary NUMBER PROMPT ‘Оклад: ‘ Чтобы вывести подсказку “Пароль: “ и поместить ответ в CHAR переменную PSWD и подавить показ вводимых данных, введите: SQL> ACCEPT pswd CHAR PROMPT ‘Пароль: ‘ HIDE
APPEND (Добавить) A[PPEND] текст Команда APPEND добавляет указанный текст в конец текущей строки буфера. Если вы хотите отделить текст от предшествующих символов пробелом, введите два пробела между APPEND и текстом. Пример. Чтобы добавить пробел и имя столбца DEPT во второй строке буфера, сначала необходимо сделать ее текущей: SQL> 2 2* FROM EMP, Затем введите APPEND: SQL> APPEND DEPT SQL> 2 2* FROM EMP, DEPT Обратите внимание на двойной пробел между APPEND и DEPT. Первый разделяет APPEND от текста; второй пробел является первым добавляемым символом. Чтобы добавить точку с запятой, введите: SQL> APPEND ;; SQL*PLUS добавляет первую точку с запятой к текущей строке, а вторую интерпретирует как конец команды APPEND.
BREAK ( Обьявить перерыв в отчёте) BRE[AK] [ON элемент_отчета [действие [действие]]] BREAK используется для: • подавления вывода дублированных значений для указанных столбцов • пропуска строк при изменении значения столбца • печати результата промежуточных вычислений при изменении значения столбца или в конце отчета (см. команду COMPUTE) Команда BREAK без параметров выводит перечень текущих установок BREAK. элемент_отчета -- синтаксис: {column | expr | ROW | REPORT} действие -- синтаксис: SKI[P] n | [SKI[P]] PAGE] [NODUP[LICATES] | DUP[LICATES]] ON столбец [действие [действие]] Определяются действия для SQL*PLUS, которые необходимо произвести при прерывании в указанном столбце (называется столбцом прерывания). Прерывание происходит по одной из трех причин: • изменилось значение столбца или выражения Под ред. проф. В.М.Космачёва
91
ГУАП МЦИТ Введение в «ORACLE» • окончание вывода записи • конец отчета Когда вы опускаете действие, “BREAK ON столбец” запрещает печать дублированных значений в столбце и помечает место в отчете, в котором SQL*PLUS произведет вычисления, определенные вами в соответствующей команде COMPUTE. Вы можете указать “ON столбец” один или несколько раз. Если вы указали фразу ON несколько раз, как в данном случае: SQL> BREAK ON DEPTNO SKIP PAGE ON JOB SKIP 1 ON SAL SKIP 1 сначала фраза ON рассматривает самое внешнее прерывание (в данном случае ON DEPTNO) и в самую последнюю очередь фраза ON рассматривает самое внутреннее прерывание (в данном случае ON SAL). SQL*PLUS ищет прерывание в каждой выводимой записи в указанных колонках, начиная с самого внешнего прерывания до самого внутреннего прерывания в заказанном вами порядке. В данном случае, SQL*PLUS ищет измененные значения в DEPTNO, затем в JOB, затем в SAL. Затем, SQL*PLUS выполняет действия начиная с действий указанных для самого внутреннего прерывания и так обработка идет в обратном порядке к самому внешнему прерыванию (в данном случае от SKIP 1 для ON SAL к SKIP PAGE для ON DEPTNO). SQL*PLUS выполняет все действия снизу вверх, включая действия и для столбца, в котором произошло прерывание. Если, например, в выводимой последовательности записей изменилось значение столбца JOB, но значения DEPTNO и SAL не изменились, то SQL*PLUS пропустит две строки перед тем как напечатать запись (одна строка- как результат SKIP 1 во фразе ON SAL, и другая строка как результат SKIP 1 во фразе ON JOB). Всегда при использовании “ON столбец”, вы должны также использовать фразу ORDER BY в команде SQL SELECT. Обычно столбцы, используемые в команде BREAK, должны появляться в той же последовательности во фразе ORDER BY (хотя все столбцы, указанные в ORDER BY необязательно должны присутствовать в команде BREAK). Это предотвращает бессмысленные прерывания в вашем отчете. Для вышеприведенной команды BREAK, следующая команда SELECT получит следующие (осмысленные) результаты: SQL> SELECT DEPTNO, JOB, SAL, ENAME FROM EMP ORDER BY DEPTNO, JOB, SAL, ENAME; Все записи с одинаковым DEPTNO напечатаются вместе на одной странице, и на этой странице все записи с одинаковым JOB напечатаются в одной группе. Внутри каждой группы профессий (job), работники с одинаковым окладом (SAL) объединяются в группы. Прерывание в колонке ENAME не приводит ни к каким действиям, т.к. этот столбец не задан в команде BREAK.
ON выражение [действие [действие]] Определяются действия для SQL*PLUS, которые необходимо произвести при изменении значения выражения. Если вы не задали действие, “BREAK ON expr” запретит вывод дублированных значений expr и пометит место в отчете, где SQL*PLUS произведет заданные вами вычисления в соответствующей команде COMPUTE. Вы можете использовать в выражении один или несколько столбцов таблицы или алиас, присвоенный для столбца в команде SELECT или в команде COLUMN. Если вы используете выражение (expr) в команде BREAK, вы должны ввести данное выражение точно также, как оно задано в команде SELECT. Если выражение в SELECT равно a+b, например, вы не можете использовать b+a или (a+b) в команде BREAK для ссылки на данное выражение из команды SELECT. То, что говорилось выше о “ON столбец”, также применимо к “ON expr”.
ON ROW[действие [действие]] Определяются действия для SQL*PLUS, которые надо произвести, когда команда SQL SELECT возвращает запись. ROW-прерывание становится в конец иерархии прерываний, независимо от того, где фраза ON ROW задана в команде BREAK. Вы должны всегда задавать действие при использовании данного прерывания.
ON REPORT Отмечает место в отчете, где SQL*PLUS произведет вычисления определенные вами в соответствующей команде COMPUTE. Используйте BREAK ON REPORT совместно с COMPUTE для печати общих сумм. REPORT-прерывание становится в вершину иерархии прерываний, независимо от того, где вы его указали в команде BREAK. Теперь рассмотрим список возможных действий: Под ред. проф. В.М.Космачёва
92
ГУАП МЦИТ Введение в «ORACLE» SKI[P] n Пропускает n строк перед выводом записи при возникновении прерывания. [SKI[P]] PAGE Переходит к новой странице перед выводом записи при возникновении прерывания. NODUP[LICATES] Печатает пробелы вместо значения столбца прерывания, когда значение столбца равно значению столбца из предыдущей записи. DUP[LICATES] Печатает значение столбца прерывания для каждой выбранной записи. Для печати текущих описаний прерываний необходимо просто ввести BREAK без параметров. Каждая новая команда BREAK, которую вы введете, заменяет предшествующую. Примеры: Для получения отчета, который выводит дублированные значения профессий (job), выводит средний оклад (SAL) и вставляет пустую строку, когда изменяется значение JOB, и дополнительно печатает сумму окладов и вставляет еще одну пустую строку, когда изменяется значение DEPTNO, вы можете ввести следующие команды. (В примере выбираются только отделы 10 и 30 и профессии клерк и продавец). BREAK ON DEPTNO SKIP 1 ON JOB SKIP 1 DUPLICATES SQL> COMPUTE SUM OF SAL ON DEPTNO SQL> COMPUTE AVG OF SAL ON JOB SQL> SELECT DEPTNO, JOB, ENAME, SAL FROM EMP WHERE JOB IN (‘CLERK’,’SALESMAN’) AND DEPTNO IN (10,30) ORDER BY DEPTNO, JOB; CHANGE (изменить в буфере SQL) C[HANGE] разделитель старое [разделитель [новое [разделитель]]] Команда CHANGE изменяет текст текущей буферной строки. Разделитель -- Представляет любой не алфавитно-цифровой символ, такой как “/” или “!”. Используйте символ разделитель, который не появляется ни в старом ни в новом тексте. Можно опускать пробел между CHANGE и первым sepchar. Старый -- Текст, который вы хотите изменить. CHANGE не различает регистр при поиске указанного текста. Если старому тексту предшествует “...”, то команда CHANGE заменит весь текст от начала строки до искомого текста (включая сам текст). Если “...” стоят после старого текста, то CHANGE заменит весь текст до конца строки. Если “...” является вложенным, то CHANGE изменяет часть строки между первой частью и второй часть параметра “старый”. Новый -- Текст заменяющий “старый” текст. Если вы опустите этот параметр и второй и третий разделители, CHANGE удалит старый текст из текущей буферной строки. CHANGE заменяет заданный Вами текст на новый в текущей буферной строке. При выводе команды на экран текущая строка помечается звездочкой (*). Вы также можете использовать CHANGE для изменения строки, которая привела к ORACLE-ошибке. SQL*PLUS устанавливает указатель текущей строки на строку, содержащую ошибку, поэтому вы можете проводить изменения. Чтобы ввести строку заново, вы можете ввести номер строки ,а за ним набрать новый текст. Если вы указали номер больше, чем количество строк в буфере, то SQL*PLUS добавит новый текст в конец буфера. Если вы указали номер строк равным нулю, то текст добавится в начало буфера (данная строка получит номер 1). Примеры: Допустим, что текущая буферная строка содержитследующий текст: 4* WHERE JOB IN (‘CLERK’,’SECRETARY’,’RECEPTIONIST’) Введите следующую команду: SQL> C /RECEPTIONIST/GUARD/ Под ред. проф. В.М.Космачёва
93
ГУАП МЦИТ Введение в «ORACLE» Строка изменится следующим образом: 4* WHERE JOB IN (‘CLERK’,’SECRETARY’,’GUARD’) Или введите следующую команду: SQL> C /’CLERK’,.../’CLERK’)/ Строка изменится следующим образом: 4* WHERE JOB IN (‘CLERK’) Или введите следующую команду: SQL> C /(...)/(‘COOK’,’BULTER’)/ Строка изменится следующим образом: 4* WHERE JOB IN (‘COOK’,’BULTER’) Вы можете замещать содержимое любой строки, используя номер строки. Данный ввод SQL> 2 FROM EMP e1 означает, что вторая буферная строка замещается новым значением: FROM EMP e1 Замечание: Ввод номера строки и последующего текста будет замещать всю строку несмотря на то, какой текст вы задали. При этом SQL> 2 c/old/new изменит вторую буферную строку таким образом: SQL> c/old/new Замечание. В Windows удобнее не париться с командами редактирования, а пользоваться тем или иным редактором. (команды ED, @, @@, START, GET). По умолчанию вызывается NotePad (Блокнот).
COPY (скопировать) COPY [FROM] имя_польз[/пароль][@описание_БД] | TO имя_польз[/пароль][@описание_БД]] {APPEND | CREATE | INSERT | REPLACE} целевая_таблица [(столбец, столбец, столбец...)] USING запрос Команда COPY копирует данные из запроса в таблицу локальной или удаленной БД. имя_польз[/пароль] -- Задает имя и пароль пользователя с которым идет обмен информацией. FROM -- определяет источник информации; TO -- определяет адресата. Если вы не укажите пароль в FROM или TO, SQL*PLUS потребует их ввести. SQL*PLUS подавляет вывод вводимого пароля. описание_БД -- Состоит из имени связи с БД или SQL*NET-строки подключения. Во фразе FROM задает БД источник; Во фразе TO -- БД адресат. Синтаксис параметра зависит от Вашего SQL*NET-протокола связи. SQL*PLUS не выдает подсказки для ввода спецификации БД, но он использует вашу БД по умолчанию, если вы не задали данный параметр. целевая_таблица -- Задает таблицу, которую вы хотите создать или в которую вы хотите добавить данные. (столбец, столбец, столбец...) -- Задает имена столбцов в целевой таблице. Вы должны заключать имена в двойные кавычки, если они содержат символы нижнего регистра или пробелы. Если вы задали столбцы, то номера столбцов должны соответствовать номерам выбираемого запроса. Если вы не задали столбцы, то копируемые столбцы получат те же имена, что и в таблице-источнике, если COPY создает таблицу-адресат. USING запрос -- Задает запрос (команда SELECT), в котором определяются копируемые записи и столбцы. FROM имя_польз[/пароль][@описание_БД] -- Задает имя, пароль, БД, которые содержат копируемые данные. Если вы опустили фразу FROM, по умолчанию источником является БД, к которой подключен SQL*PLUS (т.е., БД к Под ред. проф. В.М.Космачёва
94
ГУАП МЦИТ Введение в «ORACLE» которой адресуются все команды). Если вы желаете копировать из другой БД, вы должны обязательно задавать фразу FROM. TO имя_польз[/пароль][@описание_БД] -- Задает БД ,содержащую таблицу-адресат. Если вы опустили фразу TO, то по умолчанию подразумевается БД, к которой подключен SQL*PLUS (т.е. БД, к которой адресуются все команды). Если вы желаете копировать в другую БД, вы должны обязательно задавать фразу TO. APPEND -- Вставляет строки из запроса в таблицу-адресат, если она существует. Если таблица-адресат не существует, COPY создает ее. CREATE -- Вставляет строки из запроса в таблицу-адресат после того, как она будет создана. Если таблица-адресат уже существует, будет получена ошибка. INSERT -- Вставляет строки из запроса в таблицу-адресат, если она существует. Если таблица-адресат не существует, будет получена ошибка. REPLACE -- Замещает данные в таблице-адресате и вставляет строки из запроса в таблицу-адресат, если она существует. Если таблица-адресат не существует, COPY создаст ее. Переменная LONG команды SET ограничивает длину копируемых LONG-столбцов. Если некоторые LONG-столбцы содержат данные длиннее, чем значение переменной LONG, COPY обрежет эти данные. SQL*PLUS вносит изменения в БД после каждого успешного копирования. Если вы присвоили переменной COPYCOMMIT положительное значение n (больше чем 0), изменения вносятся каждый раз после копирования n пакетов записей. (Размер пакета определяется системной переменной ARRAYSIZE). Примеры: Следующая команда копирует таблицу EMP из БД stud в таблицу с именем WESTEMP в БД stud. Если WESTEMP уже существует, SQL*PLUS заменит ее содержимое. Колонки таблиц EMP и WESTEMP имеют одинаковые имена. SQL> COPY FROM stud1_1/stud @stud TO stud1_2/stud @stud REPLACE WESTEMP USING SELECT * FROM EMP Следующая команда копирует выбранные записи из таблицы EMP базы данных stud в БД, к которой подключен SQL*PLUS. SQL*PLUS создает SALESMAN при копировании. SQL*PLUS копирует только столбцы EMPNO и ENAME, и данные столбцы получат имена EMPNO и SALESMAN. SQL> COPY FROM stud1_2/stud @stud CREATE SALESMAN (EMPNO,SALESMAN) USING SELECT EMPNO, ENAME FROM EMP WHERE JOB=’SALESMAN’ DEFINE (определить) DEF[INE] [переменная] | [переменная = текст] Команда DEFINE определяет переменную пользователя и присваивает ей CHAR значение. Или, показывает значение и тип одной или всех переменных. Переменная -- Задает пользовательскую переменную, чье значение вы хотите посмотреть или определить. Текст -- Задает символьное значение, присваиваемое переменной. Если текст содержит пробелы или знаки пунктуации, заключите его в одиночные кавычки. переменная = текст -- Определяет переменную пользователя и присваивает ей символьное значение. Чтобы посмотреть значение и тип переменной, введите DEFINE и имя переменной. Чтобы посмотреть значение и тип всех переменных, введите DEFINE без параметров. DEFINE-переменные сохраняют свои значения, пока не произойдет одно из следующих событий: • ввели новую команду DEFINE для данной переменной • ввели команду UNDEFINE для данной переменной • ввели команду ACCEPT для данной переменной • задали данную переменную во фразе NEW_VALUE или OLD_VALUE команды COLUMN и использовали столбец в команде SELECT. • вышли из SQL*PLUS Под ред. проф. В.М.Космачёва
95
ГУАП МЦИТ Введение в «ORACLE» Всякий раз, когда вы выполняете сохраненный запрос или командный файл, SQL*PLUS подставляет значение переменной для каждой подстановочной переменной, ссылающейся на данную переменную (в форме &переменная или &&переменная). Вы не получите подсказку на ввод такой переменной в данном сеансе, пока вы не уничтожите ее командой UNDEFINE. Максимальное число переменных, определенных командами DEFINE, равно 240. Заметим, что вы можете использовать DEFINE для определения переменной _EDITOR, которая задает имя системного редактора, запускаемого по команде EDIT. Если вы размещаете значение переменной, определяемой DEFINE, на нескольких строках (используя команду SQL*PLUS символ продолжения), SQL*PLUS заменит каждый символ продолжения и возврата каретки на пробел в итоговой переменной. Например, SQL*PLUS поймет данную команду: SQL> DEFINE TEXT = ‘ONETWOTHREE’ как: SQL> DEFINE TEXT = ‘ONE TWO THREE’ Примеры: Чтобы присвоить значение MANAGER переменной POS, введите: SQL> DEFINE POS = MANAGER Если вы выполните команду, которая содержит ссылку на &POS, SQL*PLUS подставит значение MANAGER вместо &POS и вы не получите подсказки на ввод значения POS. Чтобы присвоить символьное значение 20 переменной DEPTNO, введите: SQL> DEFINE DEPTNO = 20
Хотя вы задали 20, SQL*PLUS присвоит символьное значение DEPTNO, состоящее из двух знаков 2 и 0. Для показа описания DEPTNO, введите: SQL> DEFINE DEPTNO DEFINE DEPTNO = “20” (CHAR)
DEL ( Удалить буферную строку) Команда DEL удаляет текущую буферную строку. Текущей становится следующая строка. Для удаления нескольких последовательных строк, введите DEL несколько раз. Примеры: Предположим, буфер SQL содержит следующий запрос: SELECT ENAME, DEPTNO FROM EMP WHERE JOB = ‘SALESMAN’ ORDER BY DEPTNO Чтобы сделать строку с WHERE текущей, вы должны ввести: SQL> LIST 3 3* WHERE JOB = ‘SALESMAN’ Чтобы удалить фразу WHERE, введите: SQL> DEL Сейчас буфер SQL содержит следующие строки: SELECT ENAME, DEPTNO FROM EMP ORDER BY DEPTNO
DESCRIBE (описать)-показать описание столбцов DESC[RIBE] [польз.]объект[@имя_связи_с_БД] Команда DESCRIBE показывает описания столбцов для указанной таблицы, представления данных, или синонимы. Польз -- Задает пользователя, который владеет объектом. Если польз опущен, SQL предполагает, что вы владелец данного объекта. объект Задает таблицу, обзор, или синоним, чье описание вы хотите вывести. Под ред. проф. В.М.Космачёва
96
ГУАП МЦИТ Введение в «ORACLE» имя_связи_с_БД (строка_связи_с_БД) -- Состоит из имени связи БД, где существует данный объект. Для каждого столбца описание содержит: • имя столбца • разрешено ли нулевое значение (NULL или NOT NULL) • тип данных • точность столбца (и количество знаков после запятой, для числовых столбцов) Пример: Чтобы получить описание таблицы EMP, введите: DESCRIBE EMP
EDIT(Редактировать) ED[IT] [имя_файла[.расширение]] Команда EDIT вызывает системный текстовый редактор для редактирования указанного файла или содержимого буфера. имя_файла[.расширение] -- Задает файл для редактирования (обычно командный файл). Если расширение файла опущено, берется расширение .SQL. Чтобы откорректировать содержимое SQL буфера системным текстовым редактором, введите EDIT без параметров. Переменная пользователя _EDITOR содержит имя текстового редактора вызываемого с помощью команды EDIT. Значение переменной _EDITOR можно изменять. Информацию по изменению пользовательских переменных смотри в описании команды DEFINE. Если переменная _EDITOR не задана, EDIT попытается вызвать системный текстовый редактор (NotePad). EDIT помещает содержимое буфера в файл AFIEDT.BUF (в текущий директорий) и вызывает текстовый редактор для данного файла. EDIT возвращает сообщение об ошибке, если вы не задали имя файла и буфер пуст.
EXIT ( Завершить SQL*PLUS) {EXIT | QUIT} [SUCCESS | FAILURE |WARNING | n | переменная] Команда EXIT вносит все отложенные изменения в БД, завершает SQL*PLUS, и передает управление операционной системе. n - Задает целый код возврата. Переменная - Задает определенную пользователем или системную переменную, такую как SQL.SQLCODE. ‘EXIT переменная’ выходит с кодом возврата равным значению данной переменной. SUCCESS -- Нормальный выход. FAILURE -- Выход с кодом возврата, указывающим на сбой. WARNING -- Выход с кодом возврата указывающим на предупреждение. EXIT без параметров выходит из SQL*PLUS со значением SUCCESS EXIT позволяет указать код возврата для операционной системы. Это позволяет выполнять командные файлы SQL*PLUS в пакетном режиме и реагировать на непредусмотренные события. Способ обнаружения события зависит от ОС. Ключевые слова SUCCESS, FAILURE, WARNING задают значения, зависящие от типа ОС. В некоторых системах FAILURE и WARNING могут не различаться. Замечание: SUCCESS, FAILURE, WARNING не являются зарезервированными словами. За информацией о выходе по условию обращайся к описанию WHENEVER SQLERROR. Пример: Выход с кодом ошибки последней выполненной команды или блок PL/SQL: SQL> EXIT SQL.SQLCODE
GET - загрузить файл в буфер SQL GET имя_файла[.расширение] [LIS[T] | NOL[IST]] LIS[T] -- Выводит содержимое файла. NOL[IST] -- Запрещает вывод. Пример: Чтобы загрузить файл YEARENDRPT с расширением SQL в буфер, введите: GET YEARENDRPT Под ред. проф. В.М.Космачёва
97
ГУАП МЦИТ Введение в «ORACLE»
HOST ( Выполнить команду ОС) HO[ST] [команда] Команда HOST выполняет команду операционной системы без выхода из SQL*PLUS Команда -- Задает команду операционной системы. Введите HOST без команды, чтобы вывести подсказку операционной системы. Затем вы можете выполнить множество команд операционной системы. Для OS Windows возврат в SQL*Plus происходит по команде EXIT.
INPUT(Добавить в буфер SQL) [NPUT] [текст] Команда INPUT добавляет одну или более строк текста после текущей буферной строки. Текст -- Задает добавляемый текст. Чтобы добавить одну строку, введите текст строки после команды INPUT, отделив текст от команды пробелом. Чтобы начать строку одним или более пробелом, введите один или более пробелов между INPUT и первым непустым символом текста. Чтобы добавить несколько строк, введите INPUT без текста. INPUTпопросит вас ввести каждую строку. Выход из INPUT- это пустая введенная строка. Если вы ввели номер строки больший ,чем количество строк в буфере и далее текст, SQL*PLUS добавит новую строку в конец буфера. Если вы задали в качестве номера строки ноль (0) и далее указали текст, то SQL*PLUS вставит новую строку в начало буфера (данная строка получит номер 1). Примеры: Предположим буфер SQL содержит следующую команду: 1 SELECT ENAME, DEPTNO, SAL, COMM 2 FROM EMP Чтобы добавить фразу ORDER BY к запросу, введите: SQL> LIST 2 2* FROM EMP SQL> INPUT ORDER BY ENAME LIST 2 делает вторую строку текущей. INPUT добавляет новую строку после текущей строки. Буфер SQL сейчас содержит следующие строки: 1 SELECT ENAME, DEPTNO, SAL, COMM 2 FROMEMP 3* ORDER BY ENAME Чтобы добавить две строки с фразой WHERE, введите: SQL> LIST 2 2* FROM EMP SQL> INPUT 3 WHERE JOB = ‘SALESMAN’ 4 AND COMM=500 5 INPUT попросит вас ввести новые строки, пока вы не введете пустой строки. Буфер SQL сейчас содержит следующие строки: SELECT ENAME, DEPTNO, SAL, COMM FROM EMP WHERE JOB = ‘SALESMAN’ AND COMM=500 ORDER BY ENAME Под ред. проф. В.М.Космачёва
98
ГУАП МЦИТ Введение в «ORACLE»
LIST (Показать строки из буфера SQL) L[IST] [n | nm | n * | n LAST | * | * n | * LAST | LAST] Команда LIST выводит одну или несколько строк буфера. n Выводит n строк. nm Выводит строки с n по m. n * -- Выводит со строки n до текущей. n LAST -- Выводит со строки n до последней. * -- Выводит текущую строку. * n -- Выводит c текущей строки до строки с номером n. * LAST -- Выводит c текущей строки до последней строки. LAST -- Выводит последнюю строку. LIST без параметров выводит все строки. Можно опускать пробел между LIST и n или *, но но не между LIST и LAST. Последняя выведенная строка становится новой текущей строкой (помечается звездочкой). Примеры: Чтобы вывести содержимое буфера, введите: SQL> L Вы, наверное, увидите следующие результаты: SELECT ENAME, DEPTNO, JOB FROM EMP WHERE JOB = ‘CLERK’ ORDER BY DEPTNO Чтобы вывести только вторую строку, введите: SQL> L 2 Выведется следующее: 2* FROM EMP Чтобы вывести с текущей строки (сейчас это строка 2) до последней, введите: SQL> L * LAST Затем вы увидите следующее: 2 FROMEMP 3 WHERE JOB = ‘CLERK’ 4* ORDER BY DEPTNO
PAUSE - (Объявить паузу) PAU[SE] [текст] Команда PAUSE выводит пустую строку, затем строку содержащую “текст”, и ожидает нажатие клавиши [Return]. Или, выводит две пустые строки и устанавливается в режиме ожидания ввода. Текст -- Текст сообщения. Если вы хотите вы ввести две пустых строки, введите PAUSE без параметров. Так как PAUSE всегда ожидает отклик пользователя, лучше использовать сообщение, которое явно просит нажать [Return]. PAUSE читает ввод с терминала (если он доступен) даже, когда вы переназначили источник команд ввода на файл. За информацией по созданию пауз между страницами отчета обратитесь к описанию переменной PAUSE команды SET. Пример: Чтобы вывести сообщение “Установите бумагу, нажмите Return” с ожиданием нажатия клавиши [Return], вы можете включить следующую команду PAUSE в командный файл: SQL> GET MYFILE Под ред. проф. В.М.Космачёва
99
ГУАП МЦИТ Введение в «ORACLE» 1 SET PAUSE OFF 2 PAUSE Установите бумагу и нажмите Return 3 SELECT ...
PROMPT (Вывести текст на экран) PROMPT [текст] Команда PROMPT выводит указанное сообщение или пустую строку на экран. Текст -- Текст сообщения. Если “текст” опущен, PROMPT выведет пустую строку на экран. Можно использовать данную команду в командном файле для предоставления информации пользователю. Пример: использование PROMPT совместно с ACCEPT в командном файле ASKFORDEPT. ASKFORDEPT содержит следующие команды SQL*PLUS и SQL: PROMPT PROMPT Please enter a valid department PROMPT For example: 10, 20, 30, 40 ACCEPT NEWDEPT NUMBER PROMPT ‘DEPT:> ‘ SELECT DNAME FROM DEPT WHERE DEPTNO = &NEWDEPT Предположим, что вы запустили данный командный файл, используя START или @: SQL>@ASKFORDEPT SQL*PLUS выведет следующие подсказки: Please enter a valid department For example: 10, 20, 30, 40 DEPT:> Пользователь вводит номер отдела после подсказки DEPT:>. SQL*PLUS выведет строку с &NEWDEPT до и после подстановки, и затем покажет наименование отдела, соответствующее введенному номеру после подсказки DEPT:>.
REMARK REM[ARK] Команда REMARK начинает комментарий в командном файле. Команда REMARK пишется в начале строки и комментарий заканчивается в конце строки (в строке не может быть одновременно и комментарий и команда). SQL*PLUS не интерпретирует комментарий как команду. Пример: SQL> GET EMPSUM REM COMPUTE uses BREAK ON REPORT to break on end of table BREAK ON REPORT COMPUTE SUM OF “DEPARTMENT 10” DEPARTMENT 20” DEPARTMENT 30” “TOTAL BY JOB” ON REPORT REM Each column displays the sum of salaries by job for REM one of the departments 10, 20, 30. SELECT JOB, SUM( DECODE( DEPTNO, 10, SAL, 0)) “DEPARTMENT 10”, Под ред. проф. В.М.Космачёва
100
ГУАП МЦИТ Введение в «ORACLE» SUM( DECODE( DEPTNO, 20, SAL, 0)) “DEPARTMENT 20”, SUM( DECODE( DEPTNO, 30, SAL, 0)) “DEPARTMENT 30”, SUM(SAL) “TOTAL BY JOB” FROM EMP 13* GROUP BY JOB
RUN (Запустить) R[UN] -- выводит и выполняет команду SQL или блок PL/SQL запомненный в буфере SQL. RUN приводит к тому, что последняя строка буфера SQL становится текущей. Команда “наклонная черта” (/) аналогична RUN, но она не выводит содержимое буфера на терминал.
SAVE (Сохранить буфер SQL в файле ) SAV[E] имя_файла[.расширение] [CRE[ATE] | REP[LACE] | APP[END]] Команда SAVE сохраняет содержимое буфера в файле операционной системы. имя_файла[.расширение] -- Задает имя файла, в котором Вы хотите сохранить содержимое буфера. Если не указано расширение, SQL*PLUS использует расширение по умолчанию (обычно SQL) Если вы указываете одну из фраз CREATE, REPLACE, APPEND, то необходимо явно указать расширение файла. CRE[ATE] -- Создает файл, если он не существует. REP[LACE] -- Замещает содержимое существующего файла. Если файл не существует, REPLACE создает его. APP[END] -- Добавляет содержимое буфера в конец указанного вами файла. Когда вы сохраняете содержимое буфера SQL, SAVE добавляет строку с наклонной чертой (/) в конец файла. Замечание. Сохранение происходит в текущий директорий
START (Старт командного файла) STA[RT] имя_файла[.расш] [арг1 арг2 ...] Команда START выполняет указанный командный файл. имя_файла[.расш] -- Задает командный файл, который вы хотите выполнить. Этот файл содержит любые команды, которые Вы можете выполнять интерактивно. Если не указано расширение, SQL*PLUS использует расширение по умолчанию (обычно SQL). Когда вы ввели START имя_файла.ext, SQL*PLUS будет искать данный файл в текущем директории. Если SQL*PLUS не обнаружит данный файл, то он повторит поиск в директориях, заданных в пути для операционной системы. Некоторые операционные системы могут не поддерживать возможность пути поиска. арг1 арг2 ... -- Определяет аргументы, передаваемые командному файлу. Если вы ввели один или более аргументов, SQL*PLUS подставит данные значения в параметры &1, &2, ... командного файла. Если вы стартуете снова этот командный файл в данном сеансе, вы можете задать новые значения или опустить аргументы для использования старых значений. Команда @ (“at”) работает аналогично START, но она не позволяет передавать параметры. Пример: Файл с именем PROMOTE.SQL, используемый для содействия служащим, может содержать команду: SELECT * FROM EMP WHERE MGR=&1 AND JOB=&2 AND SAL>&3; Чтобы выполнить данный командный файл, введите: SQL> START PROMOTE 7280 CLERK 950 Затем SQL*PLUS выполнит следующую команду: SELECT * FROM EMP WHERE MGR=7280 AND JOB=’CLERK’ AND SAL>950;
TIMING (Записать данные хронометрирования) TIMI[NG] [START текст | SHOW| STOP] Под ред. проф. В.М.Космачёва
101
ГУАП МЦИТ Введение в «ORACLE» Команда TIMING записывает данные хронометрирования об общем времени выполнения команд, выводит заголовок текущей области хронометрирования и ее данные или выводит количество активных областей хронометрирования. START текст -- Устанавливает область хронометрирования и делает текст заголовком данной области. Вы можете иметь более одной активной области хронометрирования посредством старта дополнительной области, не остановив предыдущую область хронометрирования. Последняя запущенная область хронометрирования становится текущей. SHOW -- Выводит заголовок текущей области хронометрирования и ее данные. STOP -- Выводит заголовок текущей области хронометрирования и ее данные, затем удаляет данную область. Если существуют еще активные области хронометрирования,то одна из них, созданная самой последней, еще не уничтоженной, становится текущей. Используйте фразу TIMING в команде CLEAR для удаления всех активных областей. Для отображения количества активных областей хронометрирования используйте TIMING без параметров. Вы можете использовать эти данные для анализа эффективности некоторых команд или блоков PL/SQL. Смотрите команду SET TIMING ON, для отображения текущего времени после каждой выполненной команды или блока PL/SQL. Пример: Для создания области хронометрирования с именем SQL_AREA, введите: SQL> TIMING START SQL_AREA Для вывода заголовка текущей области хронометрирования и накопленных данных, введите: SQL> TIMING SHOW Для вывода заголовка текущей области хронометрирования и уничтожения данной области введите: SQL> TIMING STOP
SHOW(Показать) SHO[W] опция Команда SHOW выводит значения системных переменных SQL*PLUS. опция есть одна из следующих фраз: системная_переменная -- Любая системная, установленная командой SET ALL -- Выводит установки для всех опций SHOW BTI[TLE] -- Показывает текущее определение BTITLE LNO -- Показывает текущий номер строки (позиция на текущей странице дисплея или буферизованного вывода) PNO -- Показывает текущий номер страницы REL[EASE] -- Показывает номер реализации ORACLE RDBMS, с которым работает SQL*PLUS. SPOO[L] -- Показывает, является ли текущий вывод буферизованным SQLCODE -- Показывает значение SQL.SQLCODE (код возврата последней выполненной команды) TTI[TLE] -- Показывает текущее определение TTITLE USER -- Показывает имя пользователя, с которым вы подключились к SQL*PLUS ERROR Пример. Чтобы посмотреть текущее значение LINESIZE, введите: SQL> SHOW LINESIZE Если текущее значение переменной равно 80, SQL*PLUS выдаст следующее: linesize 80
SQLPLUS (Запуск программы) SQLPLUSW [[-S[ILENT]] [вход] [запуск]] | -? Команда SALPLUSW стартует SQL*PLUS (вводится после системного приглашения). Вход ::= имя_пользователя | /NOLOG Запуск -- Позволяет вводить имя командного файла и аргументы. SQL*PLUS передает аргументы командному файлу аналогично команде START. Фраза “запуск” задается в следующем формате: @имя_файла[.расш] [арг1 арг2 ...] Под ред. проф. В.М.Космачёва
102
ГУАП МЦИТ Введение в «ORACLE» Если вы не указали logon (регистрацию) и задали start, SQL*PLUS подразумевает, что первая строка командного файла содержит правильный logon. Если вы не задали ни logon, ни start, SQL*PLUS выдаст подсказку для ввода имени и пароля пользователя. имя_пользователя -- Задает имя и пароль пользователя, с которым вы хотите подключиться к ORACLE. Если вы опустили эти параметры, SQL*PLUS попросит вас ввести их. Если вы опустили только пароль, SQL*PLUS попросит вас ввести его. Вводимый вами пароль после подсказки не отображается на экране. /NOLOG -- Заставляет стартовать SQL*PLUS, но не производить вашу регистрацию в ORACLE. Перед выполнением любой команды необходимо выполнить команду CONNECT с правильным logon, чтобы подключиться к ORACLE. Спецификация_базы (connection string). -- Состоит из SQL*NET-строки подключения. Синтаксис данной строки зависит от типа протокола связи вашего ORACLE. S[ILENT] Подавляет все информационные и запрашивающие сообщения SQL*PLUS, включая командную подсказку ‘SQL >’ и названия программ, которые обычно отображаются во время запуска SQL*PLUS. Это используется для того, чтобы сделать вызов SQL*PLUS другими программами невидимым для пользователя. -? Заставляет SQL*PLUS отобразить номер текущей версии, а затем передать управление операционной системе. Оба знака нельзя разделять пробелом. SQL*PLUS может настраиваться с помощью файла параметров (profile), создаваемого администратором базы. SQL*PLUS выполняет этот командный файл, когда пользователь запускает SQL*PLUS и устанавливает связь с ORACLE. Данный файл параметров позволяет ДБА настраивать среду по умолчанию для всех пользователей данной системы; пользователи не имеют доступа к данному файлу параметров. Имя данного файла зависит от типа операционной системы. SQL*PLUS также поддерживает файл параметров пользователя (User Profile), выполняемого после главного файла параметров. SQL*PLUS ищет файл с именем LOGIN.SQL в текущей директории. Если SQL*PLUS не обнаружит этого файла здесь, то SQL*PLUS будет искать данный файл в директориях заданных в пути. Некоторые операционные системы не поддерживают возможность пути поиска. Если SQL*PLUS не обнаружит LOGIN-файл, он выведет предупреждающее сообщение и продолжит процесс регистрации.
Зарезервированные символы +
ОПЕРАТОР ДОБАВЛЕНИЯ
:=
оператор присвоения
=>
оператор ассоциации
%
Индикатор атрибута
‘
Разделитель текстовой строки
.
Разделитель компонентов
||
оператор Объединения строк
/
Операция деления
**
Оператор возведения в степень
(
Выражение , разделитель списка
)
Выражение , разделитель списка
:
Индикатор глобальной переменной