Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_bd.docx
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
126.45 Кб
Скачать

16.Обработка исключений.Пользовательские исключения.Возбуждение исключений.

Исключительная ситуация – это событие, не приводящие к возникновению непоправимой ошибки, но прерывающее нормальное выполнение программы и вызывающее переход к обработчику исключительной ситуации.При наступлении определенных условий соответствующее исключение возбуждается. Нормальное выполнение останавливается, и управление передается на секцию обработки исключений блока или подпрограммы PL/SQL. Исключительные ситуации делятся на внутренние и пользовательские. Внутренние исключения возбуждаются неявно (автоматически) системой исполнения; пользовательские исключения возбуждаются явно, посредством предложений RAISE .Если блок, в котором возникла исключительная ситуация, не содержит обработчика исключительных ситуаций то управление передается в объемлющий блок. Иными словами, исключительная ситуация “поднимается вверх” по вложенным блокам, до тех пор, пока не будет найден обработчик или управление не будет передано вызвавшему приложению.

Каждое исключение имеет свое имя.

Обработчик исключительных ситуаций имеет вид

BEGIN

EXCEPTION

{ WHEN исключение THEN

обработчик; } …

[ WHEN OTHERS THEN

обработчик; ]

END;

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

Пользовательские исключения

PL/SQL позволяет определять ваши собственные исключения. В отличие от внутренних исключений, пользовательские исключения должны быть объявлены и должны явно возбуждаться предложениями RAISE. Разрешается объявлять исключения только в декларативной части блока, подпрограммы или пакета PL/SQL. Для объявления исключения используется следующий синтаксис:

DECLARE

имяисключения EXCEPTION;…

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

  • нельзя объявлять исключение 2-ды в одном и том же блоке.

  • - исключения, объявленные в блоке, считаются локальными в этом блоке и глобальными во всех его подблоках;

  • вы можете переобъявить глобальное исключение в подблоке. В таком случае локальное объявление имеет преимущество, и подблок не может обращаться к глобальному исключению

Использование EXCEPTION_INIT

ORACLE идентифицирует около 24000 различных ошибок, и очевидно, что только некоторым из них сопоставлены поименованные внутренние исключения. Однако мы можем обрабатывать и непоименованные внутренние ошибки с помощью того же механизма.Для обработки непоименованных исключений используют прагму EXCEPTION_INIT. Прагма - это директива компилятора, которая обрабатывается во время компиляции, а не во время выполнения.

Прагма EXCEPTION_INIT имеет следующий синтаксис:

PRAGMA EXCEPTION_INIT(имяисключения, кодошибкиORACLE);

Имя исключения должно быть ранее объявлено в этом же блоке.

Возбуждение исключений

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

Формат предложения RAISE: RAISE имяисключения;

Блоки и подпрограммы PL/SQL должны явно возбуждать исключение лишь в том случае, когда ошибка делает невозможным или нежелательным продолжение обработки. Предложение RAISE для некоторого исключения кодируется в любом месте сферы этого исключения.

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

raise_application_error(номерошибки, сообщениеобошибке);

процедура raise_application_error используется в триггерах БД.

10. Формирование запросов средствами SQL. Вложенные запросы. Группировка данных. Соединение таблиц. Объединение запросов. Примеры.запрос на выборку содержимого одной таблицы имеет видSELECT [DISTINCT] описание_результата FROM источник [WHERE условие_выбора];

источника - таблица или представление. Условие выбора - выражение логического типа; его значение проверяется для каждой строки источника, результат--список, каждому элементу которого соответствует один столбец, и для элемента возможны следующие способы задания: выражение [AS имя] | * | ROWID

Фраза AS позволяет дать новое имя столбцу результата, звездочка позволяет взять в качестве результата все столбцы источника, специфическая для Oracle фраза ROWID дает возможность включить в результат системный идентификатор строки.

Пример: Получить среднюю зарплату, начисленную в январе 2003 года.SELECT AVG(salvalue) FROM salary WHERE month = 1 AND year = 2003;

Вложенные подзапросы

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

Пример.Найти фамилии работников, которым не была начислена зарплата в январе 2003 года.

SELECT empname FROM emp WHERE NOT EXISTS(

SELECT * FROM salary

WHERE emp.empno = salary.empno AND month = 1 AND year = 2003);

Подзапросы можно указывать не только во фразе WHERE, но и в других конструкциях оператора SELECT

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

SELECT s1.* FROM salary s1,

(SELECT month, year, AVG(salvalue) AS avgsalary FROM salary

GROUP BY month, year) s2

WHERE s1.month=s2 month AND s1.year=s2.year AND

s1.salvalue=s2.avgsalary;

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

GROUP BY списокгруппировочныхстолбцов

[HAVING условиеотборавгруппу]

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

Соединение таблиц

В операторе SELECT после ключевого слова FROM можно указать не одну, а несколько разделенных запятыми имен источников. Если при этом в условии WHERE не указать правила соединения этих таблиц, то мы получим полное соединение , или декартово произведение таблиц. Результат выполнения может оказаться неожиданно большим, что может привести к нештатным ситуациям. Соединение информации из нескольких таблиц имеет смысл только при указании дополнительных условий, связывающих поля. Чаще всего используются следующие правила соединения:

1.Соединяются строки таблиц с одинаковыми значениями в паре атрибутов, где каждый элемент пары берется из своей таблицы (т.н. внутреннее соединение). пример такого соединения: таблица1 [INNER] JOIN таблица2 ON условиесоединеия

Найти имена тех работников, начисленная зарплата которых за ноябрь 2002 года превысила 1000.

SELECT empname

FROM emp JOIN salary ON emp.empno = salary.empno

WHERE month = 11 AND year = 2002 AND salvalue>1000;

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

таблица1 LEFT OUTER JOIN таблица2 ON условиесоединеия

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]