
- •Общая характеристика субд Access. Создание и редактирование базы данных средствами субд Access. Свойства реляционной таблицы. Отношения между таблицами.
- •9Структуру стандарта sql.Типы данных и операции , агрегирующие функции. Примеры.
- •19 Администрирование бд и управление объектами. Разграничение доступа. Привилегии, роли
- •20 Управл парал-ной обработкой данных. Блокировки
- •13 Общая концепция субд Oracle
- •15.Курсоры , их атрибуты. Использования цикла for при работе с курсорами.
- •18.Триггеры.Объявление, назначение и примеры использования. Модификация триггеров.
- •16.Обработка исключений.Пользовательские исключения.Возбуждение исключений.
- •Возбуждение исключений
- •3. По аналогии с левым можно определить правое внешнее соединение. Перепишем предыдущий пример с использованием его возможностей:
- •Модификация данных
- •Модификация объектов базы данных
- •Создание таблиц. Ограничения
- •Последовательности
- •Модификация и удаление таблиц
- •Представления
- •14. Язык pl/sql. Основные типы данных и операторы
- •Структура программы
- •Идентификаторы и описания переменных
- •Типы данных
- •Процедурные операторы
- •Особенности записи операторов sql
- •17.Подпрограммы. Хранимые подпрограммы. Пакеты.
- •Хранимые подпрограммы
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 условиесоединеия