Программирование на языке PL/SQL. Часть 3

Содержание

Слайд 2

План лекции Явные курсоры Цикл FOR с курсором Создание хранимых процедур

План лекции

Явные курсоры
Цикл FOR с курсором
Создание хранимых процедур
Вызов хранимых процедур
Сопровождение хранимых

процедур
Слайд 3

Явные курсоры Для выполнения команд SQL сервер Oracle использует рабочие области

Явные курсоры

Для выполнения команд SQL сервер Oracle использует рабочие области памяти,

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

Типы курсоров

Типы курсоров

Слайд 5

Активный набор Явные курсоры используются для индивидуальной обработки каждой строки, возвращаемой

Активный набор

Явные курсоры используются для индивидуальной обработки каждой строки, возвращаемой многострочной

командой SELECT.
Набор строк, возвращаемых многострочным запросом, называется активным набором.
Курсор указывает на текущую строку в активном наборе.
Слайд 6

Управление явным курсором Объявление курсора – курсору присваивается имя и определяется

Управление явным курсором

Объявление курсора – курсору присваивается имя и определяется структура

запроса.
Открытие курсора – выполняется запрос, строки из активного набора доступны для выборки.
Выборка данных – проверка наличия и извлечение текущей строки.
Закрытие курсора – освобождается область памяти.
Слайд 7

Пример работы с курсором DECLARE CURSOR c_emp IS -- 1: описание

Пример работы с курсором

DECLARE
CURSOR c_emp IS -- 1: описание явного

курсора
SELECT last_name FROM emp WHERE dept=10;
v_name emp.name%TYPE;
BEGIN
OPEN c_emp; -- 2: открытие курсора
LOOP
FETCH c_emp INTO v_name; -- 3: извлечение строки
dbms_output.put_line(v_name);
EXIT WHEN c_emp%NOTFOUND; -- 3: проверка
END LOOP;
CLOSE c_emp; -- 4: закрытие курсора
END;
Слайд 8

Записи и курсоры Строки активного набора удобно обрабатывать, выбирая значения в

Записи и курсоры

Строки активного набора удобно обрабатывать, выбирая значения в переменную

PL/SQL типа RECORD.
Можно определить запись с использованием структуры строки таблицы.
Это удобно для обработки строк активного набора, так как можно делать выборку прямо в запись.
При этом значения строки загружаются в соответствующие поля записи.
Слайд 9

Пример работы с записью DECLARE CURSOR c_emp IS SELECT * FROM

Пример работы с записью

DECLARE
CURSOR c_emp IS SELECT * FROM emp;

v_emp emp%ROWTYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp;
dbms_output.put_line(v_emp.name);
EXIT WHEN c_emp%NOTFOUND;
END LOOP;
CLOSE c_emp;
END;
Слайд 10

Циклы FOR с курсором Сокращенная форма кодирования операций с явными курсорами.

Циклы FOR с курсором

Сокращенная форма кодирования операций с явными курсорами.
Неявное открытие,

выборки и закрытие.
Запись объявляется неявно.
FOR имя_записи IN имя_курсора LOOP
команда1;
команда2;
. . .
END LOOP;
Слайд 11

Пример цикл FOR с курсором DECLARE CURSOR c_emp IS SELECT *

Пример цикл FOR с курсором

DECLARE
CURSOR c_emp IS SELECT * FROM

emp;
BEGIN
FOR v_rec IN c_emp LOOP
dbms_output.put_line(v_rec.name);
END LOOP;
END;
Слайд 12

Процедуры и функции Это именованные блоки PL/SQL Их называют подпрограммы PL/SQL

Процедуры и функции

Это именованные блоки PL/SQL
Их называют подпрограммы PL/SQL
Они компилируются и

сохраняются в БД
Их можно повторно использовать, вызывая по имени.
Имеют блочную структуру, похожую на структуру анонимного блока:
- декларативная секция (без DECLARE)
- исполняемая секция
- секция обработки исключений
Слайд 13

Анонимные блоки и подпрограммы

Анонимные блоки и подпрограммы

Слайд 14

Синтаксис процедуры CREATE [OR REPLACE] PROCEDURE имя_проц [ (аргумент1 [тип_параметра1] тип_данных1,

Синтаксис процедуры

CREATE [OR REPLACE] PROCEDURE имя_проц
[ (аргумент1 [тип_параметра1] тип_данных1,
[

аргумент2 [тип_параметра2] тип_данных2,
. . .) ]
IS | AS
тело_процедуры;
Где тип_параметра = IN | OUT | IN OUT
Слайд 15

Пример процедуры CREATE OR REPLACE PROCEDURE add_dept (p_id IN dept.deptno%TYPE, p_name

Пример процедуры

CREATE OR REPLACE PROCEDURE add_dept
(p_id IN dept.deptno%TYPE,
p_name IN

dept.name%TYPE)
IS
v_cnt BINARY_INTEGER;
BEGIN
SELECT count(*) INTO v_cnt
FROM dept WHERE deptno = p_id;
IF v_cnt = 0 THEN
INSERT INTO dept(deptno, name) VALUES(p_id, p_name);
ELSE
dbms_output.put_line(‘Такой отдел уже есть в БД’);
END IF;
END;
Слайд 16

Вызов процедуры Неявная позиционная нотация BEGIN add_dept(50, ‘Отдел АСУ’); END; Явная

Вызов процедуры

Неявная позиционная нотация
BEGIN
add_dept(50, ‘Отдел АСУ’);
END;
Явная именованная нотация

BEGIN
add_dept(p_id => 50, p_name => ‘Отдел АСУ’);
END;
Слайд 17

Сопровождение процедур Перекомпиляция процедуры ALTER PROCEDURE add_emp COMPILE; Удаление процедуры DROP

Сопровождение процедур

Перекомпиляция процедуры
ALTER PROCEDURE add_emp COMPILE;
Удаление процедуры
DROP PROCEDURE add_emp;
Просмотр

текста процедуры
SELECT text FROM user_source
WHERE name=‘ADD_EMP‘
ORDER BY line;