Программирование на PLSQL. Учебно-методическое пособие по дисциплине Базы данных
.pdf
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
Московский технический университет связи и информатики
Кафедра информационных систем
Фролова Е.А.
Учебно-методическое пособие
ПРОГРАММИРОВАНИЕ НА PL/SQL
по дисциплине
БАЗЫ ДАННЫХ
для студентов бакалавриата 3-его курса
направления 09.03.03 -Прикладная информатика
Москва 2016
План УМД на 2016/17 уч.г.
Учебно-методическое пособие
ПРОГРАММИРОВАНИЕ НА PL/SQL по дисциплине
БАЗЫ ДАННЫХ
Составитель Е.А.Фролова, доцент
В учебно-методическом пособии рассматриваются основы языка программирования, процедурное расширение языка SQL, разработанное компанией Oracle. Пособие предназначено для студентов-бакалавров третьего курса по направлению подготовки «Прикладная информатика», изучающих дисциплину «Базы данных».
Издание утверждено советом ФЭУ. Протокол № 8 от 10.05.16г.
Рецензент А.Г.Ерохин, к.т.н., доцент
2
ВЗАИМОДЕЙСТВИЕ С ORACLE
PL/SQL (Procedural Language / Structured Query Language) — язык программирования, процедурное расширение языка SQL, разработанное компанией Oracle. Является встроенным языком для средства быстрой разработки Oracle Forms, инструментом разработки отчётов Oracle Reports
и в Oracle Application Express.
PL/SQL даёт возможность использовать переменные, операторы, массивы, курсоры и исключения, позволяет обрабатывать данные в реляционной базе. Операторы SQL могут быть вызваны непосредственно из PL/SQL-процедуры, функции или триггера.
УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ
PL/SQL поддерживает в полном объеме язык обработки данных (DML) и команды управления транзакциями SQL. Для заполнения переменных значениями, полученными с помощью запроса из строки таблицы, можно пользоваться командой SELECT. Команды DML могут обрабатывать несколько строк.
Выборка данных с помощью PL/SQL
Синтаксис
SELECT список_выборки
INTO имя_переменной | имя_записи FROM таблица
WHERE условие,
где: |
|
список_выборки |
список, содержащий, по крайней мере, один |
|
столбец. Может содержать выражения SQL, |
|
однострочные и групповые функции; |
имя_переменной |
скалярная переменная для хранения |
|
возвращаемого значения; |
имя_записи |
запись PL/SQL для хранения возвращаемых |
|
значений; |
таблица |
имя таблицы базы данных; |
условие |
состоит из имен столбцов, выражений, констант |
|
(в том числе переменных и констант PL/SQL) и |
|
операторов сравнения. |
Возможности синтаксиса, предоставляемые сервером Oracle для команды SELECT.
Каждое предложение SQL заканчивается точкой с запятой (;).
Значения таблицам PL/SQL в цикле присваивается путем явного объявления курсора.
3
Если команда SELECT используется в PL/SQL, предложение INTO в ней обязательно. Выходных переменных столько, сколько столбцов базы данных указано в предложении SELECT. Они перечислены в соответствующем порядке и имеют совместимые типы данных.
Предложение WHERE необязательно, но может использоваться для указания входных переменных, констант, литералов или выражений PL/ SQL.
Соответствие типов данных идентификаторов и столбцов можно обеспечить с помощью атрибута %TYPE. Типы данных и количество переменных в предложении INTO соответствуют типам данных и количеству переменных в списке выборки.
Для создания полей, соответствующих столбцам таблицы базы данных, можно использовать запись PL/SQL (RECORD). Каждое поле имеет такое же имя и тип данных, как у соответствующего столбца в таблице.
Блок PL/SQL заканчивается предложением END. Можно добавить имя подпрограммы.
Функция должна, по крайней мере, иметь одно предложение RETURNдля возврата в вызываемую среду.
Пример.
Проверить, возвращен ли фильм с заданным кодом. Выполнение этого примера вызовет исключение, обработка которого не предусмотрена.
4
Select должен выдавать (или возвращать) только одну строку, если количество строк больше единицы, то нужно организовывать цикл перехода по выбранным записям.
Исключения для команды SELECT
Условие |
Исключение |
|
|
Команда SELECT находит |
Исключение ТОО_MANY _ROWS (номер ошибки |
более одной строки |
сервера Огас1е"-1422") |
|
|
Команда SELECT не |
Исключение NO_ DATA_ FOUND (номер ошибки |
находит ни одной строки |
сервера Oracle"- 1403") |
|
|
МАНИПУЛИРОВАНИЕ ДАННЫМИ С ПОМОЩЬЮ PL/SQL
Обработка данных в базе данных осуществляется с помощью команд
DML.
Вставка данных
При вставке строк в таблицу можно
Удалять необязательные входные аргументы (аргументы IN).
Использовать функции SQL (например, SYSDATE).
Применять для генерации первичных ключей последовательности базы данных.
Вычислять значения в блоке PL/SQL.
Задавать значения столбцов по умолчанию.
Пример.
Создание процедуры для вставки новой записи в таблицу Klient.
5
Обновление и удаление данных
В предложении SET указывается
столбец базы данных = столбец базы данных | переменная.
Для указания строк, в которых должны быть внесены изменения, используется предложение WHERE.
Если ни одна строка не изменяется, то в отличие от предложения SELECT в PL/SQL исключительная ситуация не возникает.
Пример.
Создание процедуры для изменения стоимости проката определенного фильма.
Пример.
Создание процедуры для удаления фильма из таблицы Film. Отбор по коду фильма.
6
Курсор SQL
Для каждой команды SQL сервер выделяет участок памяти, в котором эта команда интерпретируется и выполняется. Эта область называется курсором или "личной областью SQL". Курсоры PL/SQL позволяют присвоить имя такой личной области и обращаться к информации, которая в ней хранится. Курсор управляет всеми фазами обработки.
Тип курсора |
Описание |
|
|
Неявные |
Создаются неявно для всех команд DML и команд |
курсоры |
SELECT PL/SQL |
|
|
Явные |
Создаются программистом. Программист присваивает |
курсоры |
им имя и управляет ими с помощью специальных |
|
команд |
ОБРАБОТКА ЗАПРОСОВ С ИСПОЛЬЗОВАНИЕМ НЕЯВНЫХ КУРСОРОВ
Команда SELECT в PL/SQL должна возвращать только одну строку. PL/SQL пытается выбрать из неявного курсора две строки — одну в качестве ответа на запрос, а вторую, чтобы проверить, не переданы ли еще строки. PL/SQL создает неявный курсор с идентификатором SQL и обслуживает его автоматически.
|
Атрибуты неявного курсора SQL |
|
|
Атрибут |
Описание |
SQL%ROWCOUNT |
Целое количество строк, выбранных последней |
|
командой SQL |
SQL%FOUND |
Логический атрибут, имеющий значение "истинно" |
|
(TRUE), если последней командой SQL была выбрана |
|
хотя бы одна строка |
|
|
SQL%NOTFOUND |
Логический атрибут, имеющий значение "истинно" |
|
(TRUE), если последней командой SQL не выбрано |
|
ни одной строки |
|
|
SQL%ISOPEN |
Всегда FALSE ("ложно"), т. к. PL/SQL закрывает |
|
неявные курсоры сразу после их выполнения |
|
|
Эти атрибуты используются как функции в командах PL/SQL, но не в командах SQL. Они полезны для оценки результатов операций DML. В PL/SQL не считается ошибкой, если команда DML не изменила ни одной строки таблицы, и исключительная ситуация в этом случае не возникает.
7
Пример.
Создать процедуру, подсчитывающую количество удаленных строк из таблицы Dogovor, отобранных по коду клиента.
Вывести результаты на экран.
ОБРАБОТКА ЗАПРОСОВ С ИСПОЛЬЗОВАНИЕМ ЯВНЫХ КУРСОРОВ Функции явных курсоров
Поочередная обработка строк, возвращаемых запросом.
Отслеживание текущей обрабатываемой строки.
Обработка более одной строки.
Ручное управление курсорами в блоке PL/SQL программистом.
Управление явными курсорами 1. Описание курсора
Для описания явного курсора используется оператор CURSOR. Можно задать параметры для подстановки переменных в запрос при открытии курсора. Можно также ссылаться на переменные в запросе, но они должны быть объявлены до использования оператора CURSOR.
Синтаксис
DECLARE
CURSOR имя_курсора IS команда_ select;
где: |
|
имя_курсора |
идентификатор курсора PL/SQL; |
команда_select |
команда SELECT без предложения INTO. |
|
8 |
2.Открытие курсора
Синтаксис
OPEN имя_курсора;
где: |
|
имя_курсора |
имя ранее описанного курсора. |
При открытии курсора выполняется запрос, и формируется активное множество строк. Это происходит после указания значений всех входных переменных. Теперь курсор указывает на первую строку в активном наборе.
Если запрос не возвращает ни одной строки, никакое исключение PL/SQL не возбуждается. Однако можно проверить статус курсора после выборки (FETCH).
3.Выборка данных курсора
Синтаксис
FETCH имя_ курсора INTO переменная1, переменная2, ...; где:
имя_ курсора имя ранее описанного курсора. переменная1,… выходная переменная для размещения
результата.
Команда FETCH используется для выборки значений из текущей строки в выходные переменные. После выборки можно работать с переменными с помощью других команд.
В предложение INTO команды FETCH включается столько же переменных, сколько столбцов возвращает команда SELECT с соответствующей совместимостью типов данных.
Между именами переменных и столбцами устанавливается позиционное соответствие.
Можно определить запись курсора (RECORD) и ссылаться на нее в предложении INTO.
Команда FETCH позволяет проверить, содержит ли курсор строки. Если команда FETCH не выбирает никаких значений, это значит, что в активном наборе не осталось необработанных строк и состояние ошибки не возникает.
4.Закрытие курсора
Синтаксис
CLOSE имя_ курсора;
где: |
|
имя_ курсора |
имя ранее описанного курсора. |
По окончании обработки команды SELECT закройте курсор. При необходимости можно открыть курсор заново.
9
|
Атрибуты явного курсора |
|
|
Атрибут |
Описание |
|
|
%ISOPEN |
Логический атрибут, значение которого равно |
|
TRUE ("истинно"), если курсор открыт |
|
|
%NOTFOUND |
Логический атрибут, значение которого равно |
|
TRUE, если последняя команда |
|
FETCH не вернула строку |
|
|
%FOUND |
Логический атрибут, значение которого равно |
|
TRUE до тех пор, пока не окажется, что |
|
последняя команда FETCH не вернула строку |
|
|
%ROWCOUNT |
Числовой атрибут, возвращающий количество |
|
строк, выбранных на данный момент |
|
|
Не ссылайтесь на атрибуты курсора прямо в команде SQL.
Управление многократной выборкой из явных курсоров
Обычно для обработки нескольких строк из явного курсора создается цикл, при каждом выполнении которого выбирается одна строка. В конце концов обрабатываются все строки активного набора, и в результате неудачной выборки атрибут %NOTFOUND принимает значение TRUE ("истинно"). Прежде чем ссылаться на курсор, проверяйте успех каждой выборки с помощью атрибутов явного курсора.
Выборка строк возможна только при открытом курсоре. Проверить, открыт ли курсор, можно с помощью атрибута %ISOPEN.
Пример. Подсчитать доход от всех фильмов.
10
