Лабораторная работа № 2 процедурного языка Oracle PL/SQL

advertisement
Лабораторная работа № 2
База данных Oracle Database 11g Express Edition. Изучение
процедурного языка Oracle PL/SQL
1. Цель работы
Изучение пользовательского интерфейса базы данных (БД) Oracle Database 11g
Express Edition и основ программирования на процедурном языке PL/SQL.
2. Задачи
Изучение процедурного языка PL/SQL. Создание и выполнение анонимных блоков
PL/SQL. Создание и выполнение хранимых процедур и функций на языке PL/SQL.
Использование в программах PL/SQL обработки исключений.
3. Теоретическая часть
Аббревиатура РL/SQL расшифровывается как Рrocedural Language/Structured
Query Language (процедурный язык/язык структурированных запросов, или
процедурное расширение языка SQL). Этот язык представляет собой среду
программирования, которая встроена непосредственно к базу данных Оracle.
PL/SQL дает возможность использования процедурных конструкций, таких как
переменные, константы и типы, операторы выбора и цикла совместно с SQL.
PL/SQL – это средство создания триггеров, процедур и функций базы данных
Oracle.
3.1. Набор символов РL/SQL
В любом языке программирования для написания кода используется
определенный набор символов. Каждый язык имеет свои собственные правила и
ограничения, определяющие, какие символы являются допустимыми. При
написании программ на PL/SQL можно использовать только следующие символы:
o Все прописные и строчные буквы,
o Цифры от 0 до 9,
o Символы ( ) + - * / < > = ! ~ ; : . , @ % “ ‘ # ^ & _ | { } ? [ ]
Эти символы используются для записи команд, а также операторов отношения и
арифметических операторов.
Арифметические операторы в порядке их приоритета:
o ** - возведение в степень,
o *, / - умножение и деление,
o +, -, || - сложение, вычитание, слияние строк.
Операторы отношения:
o = - равно,
o <>, != - не равно,
o > - больше,
o < - меньше,
o >= - больше или равно,
o <= - меньше или равно.
3.2. Структура программы PL/SQL
1
Структура программы PL/SQL – это основа всего языка. Код PL/SQL может
содержать:
o параметры программы (используемые для передачи необходимых значений
из внешних приложений),
o внутренние переменные,
o код основной программы и логику,
o механизмы обработки тех ситуаций, когда что-то работает не так, как нужно.
Основной программной единицей в PL/SQL является блок. Блок состоит из
последовательности операторов (которые могут быть как собственными
операторами PL/SQL, так и любыми операторами SQL), которые объединяются,
компилируются и передаются в процессор СУБД Oracle для выполнения за один
раз.
PL / SQL блок состоит из трех разделов:
o Декларативный раздел (может отсутствовать): этот раздел начинается с
ключевого слова DECLARE и заканчивается, когда начинается
исполняемый раздел.
o Исполняемый раздел (обязательно): этот раздел начинается с ключевого
слова BEGIN и заканчивается ключевым словом END. Ключевое слово END
должно заканчиваться точкой с запятой.
o Раздел исключений (может отсутствовать): этот раздел является
вложенным в исполняемый раздел. Раздел исключений начинается с
ключевого слова EXCEPTION.
Раздел
Описание
Декларативный
(DECLARE)
Содержит объявления всех переменных, констант, курсоров, определяемых
пользователем исключений, на которые ссылаются операторы в
исполняемом разделе и в разделе исключений
Исполняемый
(BEGIN ... END)
Содержит SQL запросы для получения данных из базы данных и операторы
PL / SQL для работы с данными в блоке
Исключений
(EXCEPTION)
Задает последовательность действий, которые выполняются, когда
возникают ошибки времени выполнения в исполняемом разделе
PL/SQL программа включает в себя один или несколько блоков. Эти блоки могут
быть полностью отдельными или вложенными один в другой.
Есть три типа блоков, которые составляют тело PL/ SQL программы:
o Анонимные блоки: это неназванные PL/SQL блоки, которые встроены в
приложение или выдаются в интерактивном режиме.
o Процедуры: это именованные PL/SQL блоки. Эти блоки могут принимать
входящие параметры, но не возвращают явно никакого значения.
o Функции: Это именованные PL/SQL блоки. Эти блоки могут принимать
входящие параметры и всегда возвращают значение.
Разница между процедурой и функцией заключается в том, что функция
обязательно должна возвращать значение в вызывающую программу.
Особенности анонимных блоков:
o Анонимные блоки не хранятся в базе данных, они передаются в процессор
PL/SQL для исполнения во время выполнения приложения.
o Вы не сможете ссылаться на анонимный блок или вызывать на выполнение
блок, который вы написали раньше, потому что анонимные блоки не
существуют после того, как они выполнятся.
2
o Анонимные блоки могут служить в качестве вложенных блоков внутри
процедуры, функции, и других анонимных блоков.
Структура анонимного блока:
[DECLARE]
BEGIN
---Исполняемые операторы-[EXCEPTION]
END;
Для создания программ PL/SQL (анонимных блоков, процедур, функций,
триггеров) в Oracle Database XE используется инструмент SQL Commands
(редактор SQL-запросов). Запуск редактора SQL-запросов описан в лабораторной
работе № 1.
Комментарии в тексте программы начинаются с символов /* и заканчиваются
символами */. Кроме того, для записи комментариев, как в приведенном выше
примере, используется двойной дефис --. В последнем случае комментарий
должен располагаться либо на отдельной строке, либо в той же строке, что и
программный код, но только после этого кода.
3.3. Переменные РL/SQL
В программах РL/SQL почти всегда приходится использовать переменные.
Переменные могут принадлежать к тем же типам, что и переменные языка SQL.
Однако, кроме этих стандартных типов данных, в язык РL/SQL включены и
некоторые дополнительные. В РL/SQL достаточно много типов данных, но
перечисленные ниже типы данных встречаются в программах чаше остальных:
o Varchar2 – символьный переменной длины, не больше заданной;
o Integer – целочисленный, 32 бит;
o Float – действительные числа с плавающей точкой, 32 бит;
o Number – целые или дробные числа с фиксированным количеством
разрядов целой и дробной частей;
o Date – дата и время;
o Boolean – булевы значения true, false.
Как и в любом другом языке программирования, операция присваивания значений
переменным является важным элементом программ РL/SQL. Эта операция может
присутствовать в любом разделе программного кода. В разделе объявлений
присваивание значений обычно осуществляется при определении констант или
для инициализации величин перед тем, как они будут использоваться в
программе. Для того, чтобы в этом разделе присвоить значение переменной,
необходимо использовать следующую конструкцию:
имя_переменной тип_переменной := значение;
Операция присваивания обозначается парой символов := , что является
стандартом языка PL/SQL.
3
Можно также присваивать значения переменным в теле основной программы или
в разделе обработки исключений. Операция присваивания значения переменой
имеет вид:
имя_переменной := значение;
Пример:
Declare
J integer := 0;
Today date := sysdate; -- присвоение переменной значения системной даты
Name varchar2(50); /* объявление переменной без присвоения значения */
Begin
J := J + 1;
Name := ‘Иванов А.Б.’;
End;
Данные типа varchar2 представляют собой буквенно-цифровые строки
переменной длины. В PL/SQL длина строки не может превышать 32767 байт. В
разделе объявлений в скобках – длина (целое положительное число).
Данные типа number – все числовые данные, которые определяются следующим
образом:
Имя_переменной number(длина, дробная_часть);
где длина может составлять от 1 до 38 знаков, а дробная_часть задает точность
(precision), т.е. указывает число значащих цифр после запятой. Например,
объявление вида number(12,2) определяет числовую переменную с максимум 10
знаками в целой части и с двумя знаками в дробной части, общая длина 12.
Максимальное значение для такой переменной 9 999 999 999, 99.
Переменные типа date используются для хранения значений календарных дат и
времени (часто этот тип обозначают как datetime, однако в Oracle он обозначается
как date). По умолчанию даты в Oracle выдаются с использование формата DDMON-YY. Таким образом, дата 14 января 2003 г будет отображаться как 14-YAN03. Для повышения гибкости обработки дат и времени применяются встроенные
функции to_date и to_char, в которых задается шаблон для преобразования строки
в дату-время и наоборот:
Start_date := to_date(’18.10.2010 12:10:00’, ‘DD.MM.YYYY HH24:MI:SS’);
Вывод значений переменных, которые они принимают при выполнении
программы,
производится
с
помощью
встроенной
функции
dbms_output.put_line(строка символов). Ее аргументом является строка
символов. Преобразовать числовые данные в строковый вид, как и в случае
данных типа даты-времени, можно с помощью встроенной функции to_char.
3.4. Управляющие конструкции программы
Сущность любого языка программирования — это его управляющие структуры.
Поскольку программы пишутся для обработки нескольких различных ситуаций,
весьма важным для управления ходом программы является способ обнаружения
и обработки таких ситуаций. Для этой цели применятся несколько типов
управляющих структур, включая:
o Условные операторы if
o Операторы саsе
4
o Операторы цикла.
Управление выполнением программы осуществляется на основе значений
переменных и состояния данных, которые считываются из базы данных, либо
туда записываются. Для проверки условий и ветвления программы в зависимости
от того, имеет результат проверки булево значение true или false, используются
операторы if.
Конструкция if-then
Эта конструкция используется для проверки простейших условий. Если условие
оказывается истинным, то выполняется одна или несколько строк программного
кода. В противном случае программа не предпринимает никаких действий.
Следующий фрагмент кода иллюстрирует применение этой конструкции в языке
РL/SQL (обратите внимание на ключевые слова, выделенные полужирным
шрифтом).
IF x_date > '11-АРR-ОЗ' THEN
x := x * 1.15;
-- x увеличивается на 15%
END IF;
Между then и end if может располагаться несколько операторов (блок операторов).
В программах можно также использовать вложенные операторы if-then. В
последнем случае надо следить, чтобы любому оператору if соответствовал свой
оператор end if.
Конструкция if-then-else
Эта конструкция аналогична простой структуре if-then, но отличается от нее тем,
что если проверяемое логическое выражение оказывается ложным, то выполняются операторы, следующие за ключевым словом еlse. Приведенный ниже код
иллюстрирует, как эта логика реализуется в языке PL/SQL.
IF x_date > '11-АРR-ОЗ' THEN
x := x * 1.15;
-- x увеличивается на 15%
ELSE
x := x * 1.05;
-- x увеличивается на 5%
END IF;
В каждом операторе if может быть только одно ключевое слово else. Как и в
случае оператора if-then, можно использовать вложенные операторы if-then-else.
Конструкция if-then-elsif
Наконец, рассмотрим последнюю конструкцию, включающую оператор if. Если
применяется структура if-then-elsif, то при невыполнении проверяемого условия
осуществляется проверка другого условия. Этот формат является альтернативой
использованию вложенных операторов if-then-else.
IF x_date > '11-АРR-ОЗ' THEN
x := x * 1.15;
-- x увеличивается на 15%
ELSIF x_date > '05-АРR-ОЗ' THEN
x := x * 1.10;
-- x увеличивается на 10%
ELSE
x := x * 1.05;
-- x увеличивается на 5%
END IF;
В этой конструкции можно использовать неограниченное число условий elsif.
Оператор case
Оператор саsе появился в версии Оracle9i. Этот оператор повышает
эффективность управления выполнением программы. Он отличается от
конструкции if-then-elsif тем, что позволяет использовать простую структуру для
выбора значения из предлагаемого списка величин. Более того, оператор саsе
может присваивать переменной нужное значение. Формат этого оператора имеет
вид:
5
САSЕ переменная
WHEN выражение_1 THEN значение_1
WHEN выражение_2 THEN значение_2
WHEN выражение_3 THEN значение_3
ELSE значение_4
ЕND;
Количество выражений в операторе сазе может быть любым. Ниже приведен
пример использования данного оператора.
Declare
X_date date;
S varcher2(50);
Begin
S := case x_date
When ’01-JAN-10’ then ‘Новый год’
When ’01-APR-10’ then ‘День смеха’
else ‘Обычный день’
end;
End;
Хотя для достижения того же результата можно использовать конструкцию if-thenelsif, приведенный код оказывается более эффективным и его гораздо легче
читать. Подчеркнем, что как только Оraclе находит в операторе саsе нужное
значение, выполнение этого оператора прекращается.
Циклы
Циклы являются управляющими структурами, позволяющими повторять
выполнение набора команд до тех пор, пока вы не решите, что этот процесс пора
завершить.
Формат любого цикла можно представить в общем виде:
LOOP
Выполняемые операторы
END LOOP;
Всякий раз при выполнении цикла выполняются и содержащиеся в нем
операторы. Затем программа возвращается к началу цикла, и процесс
повторяется. Этот процесс можно остановить с помощью оператора ехit.
Оператор ехit позволяет завершить выполнение оператора цикла, который сам по
себе не содержит условия выхода. В результате управление передается коду,
следующему за оператором цикла.
Представленный ниже пример показывает, как осуществляется выход из цикла,
который без использования оператора ехit был бы бесконечным.
LOOP
IF x>10 THEN EXIT;
ELSE x := x + 1;
END IF;
ЕND LООР;
В языке РL/SQL существуют другие типы циклов, которые обеспечивают более
эффективное управление этой конструкцией. Все они находят свое применение, и
их необходимо изучить, чтобы сделать процесс программирования максимально
гибким.
Цикл while
Цикл этого типа продолжается до тех пор, пока выполняется определенное нами
условие. Как только данное условие нарушается, программа выходит из цикла.
Например:
6
WHILE x <= 10 LOOP
X := x + 1;
END LOOP;
Можно добиться того же результата с помощью оператора ехit, но использование
конструкции с ключевым словом while является лучшим вариантом.
Цикл fог
Структура цикла с ключевым словом for является наиболее распространенной в
программах PL/SQL. В этом случае можно заранее указать программе, сколько
раз должен выполняться цикл. При использовании конструкций с ключевым
словом while этого, как правило, нельзя предсказать, поскольку цикл не
прекратится, пока не перестанет выполняться соответствующее условие. В цикле
этого типа надо задать значение, с которого начинается цикл, а также то
значение, по достижении которого выполнение цикла заканчивается. Синтаксис
цикла for приведен ниже.
FOR счетчик_цикла IN 1..10
LOOP
Выполняемые операторы
END LOOP;
Поясним, что означает данный код. Во-первых, здесь переменная счетчик_цикла,
которая называется счетчиком, принимает значения от 1 до 10, поскольку после
ключевого слова IN указан именно такой диапазон. Здесь заданы нижняя и
верхняя границы диапазона, соответственно равные 1 и 10, а две точки (..) между
граничными значениями сообщают программе, что она должна перебрать все
числа в пределах диапазона. Независимо оттого, какие значения получает
переменная счетчик_цикла ранее в программе, когда она начинает
использоваться в качестве счетчика цикла, ей будут присваиваться значения от 1
до 10.
Счетчик может перебирать все значения заданного диапазона и в порядке убывания. Для этого следует использовать конструкцию reverse.
Declare
N number;
Begin
N := 0;
FOR N IN REVERSE 1..5
LOOP
Выполняемые операторы
END LOOP;
End;
Работать с простейшими циклами очень легко. Однако эти конструкции
предоставляют гораздо более широкие возможности. В таких циклах, как while или
for при определении условий их выполнения и завершения можно использовать
не только константы, но и переменные. Такой подход дает максимальную
гибкость, так как позволяет определять границы выполнения цикла с
использованием внешних данных или информации, хранящейся в базе данных.
Курсоры
Каким образом программы должны получать необходимые для своей работы
данные? Их можно загрузить из базы данных. Простейший способ использования
SQL в программах:
Select count(*) into n from employee;
Видно, что данный оператор похож на стандартный оператор select, однако
содержит ключевое слово into, которое ранее в подобных конструкциях не
7
встречалось. Именно с помощью этого ключевого слова результат запроса select
записывается в переменную n. Однако можно получить из базы данных не одно, а
несколько значений. Для этого используется курсор:
Select first_name, last_name into fin, lan from employee;
В программе РL/SQL можно использовать любой оператор SQL. Это операторы
select, insert, update или delete. Все они поддерживаются в РL/SQL. Когда в последнем примере использовался оператор select, при этом фактически был
неявно объявлен курсор. Неявный курсор представляет собой оператор SQL,
который присутствует в теле программы и в случае SQL-оператора select
содержит ключевое слово into. Оraclе берет на себя всю заботу об управлении
неявными курсорами, что сопровождается, однако, определенными издержками.
Эти издержки относятся к внутренним механизмам Оraclе и приводят к
замедлению программы. Это не самый эффективный способ выполнения
оператора select, но приходится обязательно использовать неявные курсоры при
работе с операторами delete, update или insert.
Для того чтобы сделать программу более эффективной, необходимо объявить
курсор явным образом. Явный курсор представляет собой оператор select,
объявляющийся в разделе declare. Это делается для того, чтобы Оracle имел
возможность заранее подготовить SQL-оператор для выполнения в программе. В
результате достигается более эффективное использование памяти. Приведем
пример программы, в которой объявляется явный курсор.
Declare
J number; --счетчик
N number; -- количество
Cursor get_data is
select count(*) from employee; -- объявлен явный курсор select
Begin
Open get_data; -- курсор открывается для использования
Fetch get_data into n; -- выполнение оператора SQL и запись значения в n
Close get_data; -- курсор закрывается после использования
End;
Все достаточно просто. Конечно, этот код несколько сложнее предыдущего,
однако подобный подход позволяет решать весьма серьезные задачи. В
приведенном примере Оracle выберет только одну строку из базы данных. Однако
этот метод можно использовать вместе с циклом для получения нескольких строк.
Курсорный цикл fог
Использование курсоров совместно с циклом for значительно расширяет их
возможности. Курсорный цикл for включает курсор select и позволяет
осуществлять выборку нескольких строк из базы данных, если таковым должен
быть результат нашего запроса. При этом написание программы оказывается
достаточно простым, и не нужно заботиться об открытии и закрытии курсора.
Оraclе сделает это самостоятельно внутри цикла. Рассмотрим пример
комбинации курсора и цикла for.
Declare
N number; -- количество
Cursor get_data is
select * from employee; -- объявлен явный курсор select
Begin
N := 0;
FOR v_get_data IN get_data LOOP – курсорный цикл
N := n + 1;
END LOOP;
8
End;
Курсор get_data открывается, считывается и закрывается неявным образом.
Открывается он перед началом цикла. В цикле происходит считывание данных,
возвращаемых оператором select, построчно. Когда активный набор данных
полностью выбран, курсор закрывается с окончанием цикла.
Переменная v_get_data внутри оператора for – это переменная курсора, в которой
сохраняются результаты запроса. Она имеет тип get_data, а ее область действия
– цикл for. Отметим, что объявление переменной курсора не содержится в
разделе declare. Оracle берет на себя всю заботу о данной переменной, и от нас
это не требует никаких усилий. Ссылаться на значения в переменной курсора
можно следующим образом: v_get_data.eployee_id, v_get_data.First_name,
v_get_data.Last_name и т.д.
3.5. Использование хранимых процедур и функций
Хранимыми процедурами и функциями называются блоки кода, которые
позволяют сгруппировать и организовать последовательность SQL-запросов и
PL/SQL-конструкций. Как исходные коды, так и исполняемые коды этих объектов
хранятся в базе данных. Применение таких хранимых кодов является очень
эффективным.
Хранимые процедуры и функции предназначены для многократного
использования и сопровождения. Когда возникает необходимость, они могут быть
вызваны в любом количестве приложений. Если требуется внесение изменений в
логику обработки данных, то только код хранимой процедуры или функции
нуждается в обновлении.
Создание процедур
Для создания новых процедур используется предложение CREATE PROCEDURE,
которое может объявить список параметров и должным образом определить
действия, выполняемые по стандартам PL/SQL блока. Оно позволяет создавать
автономные процедуры, которые хранятся в базе данных Oracle.
При создании процедуры лучше использовать оператор CREATE OR REPLACE
PROCEDURE (создать или заменить процедуру) Если опустить элемент replace
этой команды, то необходимо будет каждый раз удалять процедуру перед тем,
как она будет заново создаваться. Когда же используется ключевое слово replace,
то процедура создается, если она еще не существует, а если уже существует, то
имеет место замена процедуры. Синтаксис:
CREATE [OR REPLACE] PROCEDURE имя_процедуры
[(Параметр1 [режим1] тип_данных1,
параметр2 [режим2] тип_данных2, ...)]
IS | AS
[объявление_локальной_переменной; ...]
BEGIN
- Действия;
- SQL предложения;
- PL/SQL конструкции;
END [имя_процедуры];
Параметры используются для передачи значений данных между вызовом
окружающей среды и процедурой. Параметры также известны как аргументы
процедуры.
Параметры
объявляются
в
заголовке
процедуры.
Параметры могут использоваться в одном из трех режимов: IN, OUT, и IN OUT.
9
o Режим IN. В параметре передается постоянное значение из вызывающей
среды в процедуру.
o Режим OUT. В параметре передается значение из процедуры в
вызывающую среду.
o Режим IN OUT. В параметре передается значение из вызывающей среды в
процедуру, и, возможно, измененное значение из процедуры обратно в
вызывающую среду с помощью того же параметра.
Для запуска хранимой процедуры используется команда execute. Пример:
Обратите внимание на атрибут %TYPE. Он добавляется к ссылке на столбец
таблицы или к другой переменной и возвращает ее тип. При использовании
%TYPE параметр p_id будет иметь тот же тип данных, который присвоен столбцу
employee_id таблицы employees.
Вызов хранимой процедуры можно также произвести в блоке PL/SQL через ее
имя. Пример:
BEGIN
Raise_salary(176, 10);
END;
Создание функций
Функция - это именованный блок PL/SQL, который может принимать параметры,
выполнять программный код и возвращать значение. В общем, вы используете
функции для вычисления значения. Новые функции создаются с помощью
предложения CREATE FUNCTION, которое может объявить список параметров и
должно определить действия, выполняемые по стандартам PL/SQL-блока.
Функции и процедуры структурированы одинаково. Функция должна возвращать
значение в вызывающую среду, в то время как процедура может не возвращать
никаких значений. Функция должна иметь предложение RETURN в заголовке и по
крайней мере одно предложение RETURN в исполняемом разделе. Синтаксис:
CREATE [OR REPLACE] FUNCTION имя_функции
[(Параметр1 [режим1] тип_данных1,
параметр2 [режим2] тип_данных2, ...)]
RETURN тип_данных
IS | AS
[объявление_локальной_переменной; ...]
BEGIN
- Действия;
- SQL предложения;
- PL/SQL конструкции;
RETURN выражение;
END [имя_функции];
10
Пример:
В этом примере функция get_sal создана с одним входным параметром и
возвращает результат в виде числа.
Второе окно кода: команда для вызова функции EXECUTE использует вызов
встроенной функции DBMS_OUTPUT.PUT_LINE, аргументом которой является
возвращаемое значение из функции get_sal. В этом случае функция get_sal
вызывается первой для расчета зарплаты сотрудника с кодом 100. Значение,
возвращенное из функции get_sal, используется в качестве значения аргумента
для функции DBMS_OUTPUT.PUT_LINE, которая и отображает результат.
3.6. Обработка исключений
В PL/SQL обработка ошибок реализуется с помощью механизма исключительных
ситуаций (exception) и обработчиков исключительных ситуаций (exception handler).
Исключительные ситуации могут быть связаны с ошибками Oracle или с
ошибками, определяемыми пользователем. При использовании этого механизма
программы, написанные на PL/SQL, становятся гораздо надежнее, и во время их
выполнения предоставляется возможность обработки как запланированных, так и
незапланированных ошибок. Исключительные ситуации создаются только для
ошибок времени выполнения, но не для ошибок времени компиляции.
В самом продукте Oracle содержатся встроенные исключения. Примеры:
o ORA-1017 LOGIN_DENIED – неверные имя/пароль пользователя,
o ORA-1403 NO_DATA_FOUND – данные не найдены,
o ORA-1476 ZERO_DIVIDE – деление на нуль,
11
o ORA-6502 VALUE_ERROR – арифметическая ошибка или ошибка
преобразования,
и много других.
Исключения, определяемые пользователем, объявляются в разделе деклараций с
ключевым словом EXCEPTION. Установление исключительной ситуации
пользователя в блоке производится с помощью инструкции RAISE, после которого
должно следовать имя исключения.
При установлении исключительной ситуации (т.е. при обнаружении ошибки
времени
выполнения)
управление
программой
передается
разделу
исключительных ситуаций блока. В этот раздел входят обработчики для
некоторых или для всех исключительных ситуаций. В обработчике содержится
программный текст, выполняющийся при возникновении соответствующей ошибки
и при установлении данной исключительной ситуации. Синтаксис этого раздела:
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2; . . .
[WHEN exception3 [OR exception4. . .] THEN
statement3;
statement4; . . .]
[WHEN OTHERS THEN
statement5;
statement6; . . .]
Здесь:
o exception1 (2,3, … ,6) есть стандартное имя предопределенного
исключения Oracle или имя исключения пользователя, имя которого
объявлено в декларативной разделе;
o statement1 (2,3, … ,6) является одним или более PL/SQL или SQL
оператором.
Начало обработки исключений блока находится в разделе с ключевым словом
EXCEPTION. В этом разделе могут быть определены несколько обработчиков
исключений для блока, каждый со своим собственным набором действий. Когда
происходит исключение, PL/SQL выполняет только один обработчик statement1
(2,3, … ,6) перед выходом блока – а именно тот, имя которого exception1 (2,3, …
,6) в конструкциях WHEN … THEN совпадает с именем возникшего исключения. В
конструкциях WHEN … THEN указывается, для какой исключительной ситуации
предназначен обработчик. Операторы обработчика описывают необходимые
действия. Часто используются действия: выдача сообщения, запись информации
об ошибке в таблицу ошибок, откат транзъакции, в которой произошла ошибка.
Специальный обработчик исключительных ситуаций WHEN OTHERS выполняется
для всех исключительных ситуаций, которые не обработаны другими
предложениями WHEN. Это исключение используется для перехватывания
ошибок, которые не соответствуют какому-либо из специфических типов
исключений. Отметим, что подпрограмма обработки этого исключения должна
находиться в конце программы РL/SQL, поскольку никакие исключения,
возникающие после исполнения указанной подпрограммы, обрабатываться не
будут. Пример:
CREATE OR REPLACE PROCEDURE raise_salary
(p_id IN employees.employee_id%TYPE,
p_percent IN NUMBER)
IS
12
e_toomuch EXCEPTION;
BEGIN
IF p_percent >= .30 THEN
RAISE e_toomuch;
END IF;
UPDATE employees
SET salary = salary * (1 + p_percent/100)
WHERE employee_id = p_id;
EXCEPTION
WHEN e_toomuch THEN
dbms_output.put_line('Amount is too high.');
WHEN OTHERS THEN
dbms_output.put_line('Error: raise not processed.');
END raise_salary;
Здесь:
o Исключение определено в декларативном разделе.
o Если процент повышения зарплаты сотрудника превышает значение 0,30
(30%), то устанавливается исключительная ситуация (ошибка) и управление
в программе передается в раздел исключений EXCEPTION.
o В разделе исключений проверяется тип ошибки. Если установлено
исключение e_toomuch, отображается специальное сообщение.
o Предложение WHEN OTHERS определяет обработчик для любых других
исключений, которые могут возникнуть в этом PL/SQL блоке.
4. Меры безопасности
Во время выполнения лабораторной работы необходимо:
 соблюдать правила включения и выключения вычислительной техники;
 не подключать кабели, разъемы и другую аппаратуру к компьютеру, не
относящиеся к лабораторной установке;
 при включенном напряжении сети не отключать, не подключать и не
трогать кабели, соединяющие различные устройства компьютера;
 в случае обнаруженной неисправности в работе оборудования или
нарушения правил техники безопасности сообщить руководителю
лабораторной работы;
 не пытаться самостоятельно устранить неисправности в работе
аппаратуры;
 по окончании работы привести в порядок рабочее место.
ВНИМАНИЕ! При работе за компьютером необходимо помнить: к каждому
рабочему месту подведено опасное для жизни напряжение. Поэтому во время
работы надо быть предельно внимательным и соблюдать все требования техники
безопасности!
5. Задание
1. Запустить интернет-браузер, например, Google Chrome. Запустить
домашнюю
страницу
Oracle
Application
Express
по
адресу
http://127.0.0.1:8080/apex/ . Войти в базу данных как пользователь HR.
Перейти в редактор SQL-запросов.
13
2. Для многих бизнес-приложений важно отслеживать информацию о
пользователе, такую как имя пользователя и отметка времени. Создайте и
выполните анонимный блок PL/SQL, чтобы обеспечить отслеживание
пользователя, работающего в данный момент времени с базой данных.
Анонимный блок должен получить имя пользователя базы и сохранить его в
переменной v_user. Отчетную дату надо выдать в полном формате датавремя, а также в кратком формате даты с полным наименованием месяца.
Указания:
o использовать функцию sysdate для получения системной даты;
o использовать формат ‘DD Month YYYY’ для краткого формата даты;
o использовать SQL-запрос select sys_context(‘userenv’, ‘current_user’)
from dual для выборки текущего имени пользователя;
o значения переменных, которые они принимают при выполнении
программы,
вывести
с
помощью
встроенной
функции
dbms_output.put_line(строка символов).
3. Во
многих
бизнес-приложениях
для
всевозможных
расчетов,
преобразований данных в таблицах используются хранимые процедуры и
функции. Создайте и выполните хранимую процедуру, осуществляющую
обработку данных в таблице Employees по следующим правилам.
Требуется для всех строк в таблице занести данные в столбец
commission_pct, если данных в этом столбце нет. Числовые данные
сформировать из двух последних цифр телефонного номера, добавив к ним
слева десятичную точку. Указания:
o использовать функцию length(строка_символов) для получения
количества символов в переменной строка_символов;
o использовать функцию substr(строка_символов, начальная_позиция,
длина_подстроки) для получения подстроки, содержащейся в
переменной строка_символов;
o использовать конкатенацию строк вида ‘.’||строка_символов для
добавления символа десятичного разделителя к преременной
строка_символов слева;
o использовать
функцию
to_number(строка_символов,
‘.99’)
для
преобразования строковой переменной строка_символов к числовому
типу данных;
o использовать курсорный цикл for;
o предварительную отладку программного кода для процедуры выполнить
в анонимном блоке.
4. Создайте и выполните хранимую функцию, осуществляющую обработку
данных в таблице Employees по следующим правилам. Требуется для всех
строк в таблице удалить данные в столбце commission_pct, если длина
телефонного номера не превышает 12 символов. Функция должна
возвратить количество строк, в которых изменений данных не произошло.
Указания:
o использовать курсорный цикл for;
o возвращаемое значение отобразить в виде сообщения;
o в разделе исключений функции выдать сообщение о количестве
записей, в которых данные по столбцу commission_pct удалены.
6. Требования к отчету
Отчет должен быть выполнен в текстовом редакторе MS Word. Отчет должен
содержать:
14
o Краткие теоретические сведения,
o Тексты всех программ с комментариями
использованной в запросе инструкции,
o Результаты работы программ,
o Выводы по проделанной работе.
относительно
каждой
7. Контрольные вопросы
7.1. Каково назначение языка Oracle PL/SQL?
7.2. Какова структура программы на языке Oracle PL/SQL?
7.3. Какие существуют виды блоков в программах на языке Oracle PL/SQL?
7.4. Какие известны виды оператора if языка Oracle PL/SQL?
7.5. Каковы назначение и синтаксис оператора case языка Oracle PL/SQL?
7.6. Какие известны виды циклов языка Oracle PL/SQL?
7.7. Что такое курсор и каковы разновидности курсоров в языке Oracle PL/SQL?
7.8. Что такое курсорный цикл for и как он работает?
7.9. Для чего используется обработка исключений?
7.10. Каков синтаксис блока обработки исключений?
15
Download