Слайд 1Процедурное расширение языка PL/SQL
БАЗЫ ДАННЫХ И СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ
Слайд 2
Процедуры
Функции
Пакеты
Триггеры
Программные объекты базы данных
Слайд 3Преимущества PL\pgSQL
Модульная разработка программ
Объявление идентификаторов
Программирование с использованием управляющих структур процедурного
языка
Обработка ошибок
Повышение производительности
Слайд 4Блочная структура PL/pgSQL
DECLARE – необязательно
Переменные, константы, курсоры, пользовательские исключения.
BEGIN –
обязательно
Операторы SQL.
Управляющие операторы PL/pgSQL.
EXCEPTION – необязательно
Действия, выполняемые при возникновении ошибки.
END;
– обязательно
Слайд 5Пример блока PL/pgSQL
DECLARE
v_product_id s_product.id%TYPE;
BEGIN
SELECT id INTO v_product_id
FROM
s_product WHERE id =10;
DELETE FROM s_inventory
WHERE product_id
= v_product_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO exception_table (message)
VALUES ('Some error occurred in the database.');
COMMIT;
END;
Слайд 6Программные конструкции PL/pgSQL
DECLARE
BEGIN
EXCEPTION
END;
Анонимный
блок
Хранимая
процедура/
функция
Триггер
базы данных
Пакет
процедур
Слайд 7Типы блоков
Анонимный Процедура Функция
[DECLARE]
BEGIN
--statements
[EXCEPTION]
END;
PROCEDURE name
AS
BEGIN
--statements
[EXCEPTION]
END;
FUNCTION
name
RETURN datatype
AS
BEGIN
--statements
RETURN value;
[EXCEPTION]
END;
Слайд 8Переменные в PL/pgSQL
Переменные объявляются и инициализируются в секции DECLARE
Новые значения
переменных присваиваются в секции исполняемого кода
Значения передаются в блоки PL/pgSQL
посредством параметров
Просмотр результатов осуществляется с помощью выходных переменных
Слайд 9Объявление переменных и констант: синтаксис
Указания
Инициализируйте идентификаторы с помощью оператора присваивания
(:=) или зарезервированного слова DEFAULT.
Объявляйте не более одного идентификатора на
строку.
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
Слайд 10Скалярные переменные
Не имеют внутренних компонент
Хранят единственное значение
Основные типы:
NUMBER [(точность, масштаб)]
CHAR
[(максимальная_длина)]
VARCHAR2(максимальная_длина)
DATE
BOOLEAN
Слайд 11Объявление скалярных переменных: примеры
v_gender CHAR(1);
v_total_sal NUMBER(9,2) := 0;
v_order_date DATE := SYSDATE + 7;
c_tax_rate CONSTANT
NUMBER(3,2) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;
Слайд 12Атрибут %TYPE
Используется для объявления переменной:
на основе другой ранее заданной переменной.
на
основе определения столбца базы данных.
Перед атрибутом %TYPE указываются:
таблица и столбец
базы данных.
имя ранее заданной переменной.
Слайд 13Атрибут %TYPE: примеры
Преимущества использования атрибута %TYPE:
Тип данных базового столбца базы
данных может быть неизвестен.
Тип данных базового столбца базы данных может
меняться во время выполнения.
...
v_last_name s_emp.last_name%TYPE;
v_first_name s_emp.first_name%TYPE;
v_balance NUMBER(7,2);
v_minimum_balance v_balance%TYPE := 10;
...
Слайд 14Атрибут %ROWTYPE
Используется для объявления переменной на основе совокупности столбцов в
таблице или представлении базы данных.
Перед %ROWTYPE указывается имя таблицы.
Поля записи
наследуют имена и типы данных от столбцов таблицы или представления
Слайд 15Атрибут %ROWTYPE: преимущества
Количество базовых столбцов и типы данных в них
могут быть неизвестны.
Количество и типы данных базовых столбцов могут меняться
во время выполнения.
Полезен при выборке строки с помощью команды SELECT
Пример:
...
dept_record s_dept%ROWTYPE;
emp_record s_emp%ROWTYPE;
...
Слайд 16Присвоение значений переменным: синтаксис
identifier := expr;
SELECT col_list|*|const
INTO var_list|record|rowtype_var|var
FROM table_name
Слайд 17Пример оператора
SELECT .. INTO
DECLARE
order_row orders%rowtype;
BEGIN
SELECT *
INTO order_row
FROM orders
WHERE
order_no = 15;
order_row.data_ordered := ’15.02.2005’;
END;
Слайд 18Типы программных единиц
Именованные блоки PL/pgSQL
Две основных категории:
Процедуры — осуществляют действия.
Функции
— вычисляют значения.
Хранятся в базе данных
Слайд 19Синтаксические правила
для блока PL/pgSQL
Команды могут занимать несколько строк.
Лексические единицы можно
разделять пробелами.
Символьные литералы и литералы типа “дата“ должны быть заключены
в апострофы.
Комментарии могут занимать:
несколько строк между /* и */.
одну строку после --.
Слайд 20Синтаксические правила
для блока PL/pgSQL
Идентификаторы:
Могут содержать до 30 символов.
Не могут содержать
зарезервированные слова (за исключением случая, когда они заключены в двойные
кавычки).
Должны начинаться с алфавитного символа.
Не должны совпадать с именами столбцов таблицы базы данных
Слайд 21Вложенные блоки и область видимости переменных
Команды могут быть вложенными везде,
где допустима исполняемая команда.
Вложенный блок становится командой.
Секция исключений также может
содержать вложенные блоки.
Область видимости объекта — это часть программы, где можно ссылаться на объект.
Идентификатор виден в тех областях, где на него можно сослаться без квалификатора.
Блок может ссылаться на идентификаторы во внешнем блоке.
Блок не может ссылаться на идентификаторы во вложенном в него блоке
Слайд 22Вложенные блоки и область видимости переменных: пример
...
x BINARY_INTEGER;
BEGIN
...
DECLARE
y NUMBER;
BEGIN
...
END;
...
END;
Область видимости
y
Область видимости x
Слайд 23Создание процедуры: синтаксис
где “параметр“ имеет следующий синтаксис:
Не задавайте ограничений на
тип данных.
CREATE OR REPLACE PROCEDURE name
[(parameter,...)]
AS
pl/sql_block;
parameter_name [IN | OUT
| IN OUT] datatype
Слайд 25Создание процедуры
CREATE OR REPLACE PROCEDURE change_salary
(v_emp_id IN NUMBER,
v_new_salary
IN NUMBER)
AS
BEGIN
UPDATE s_emp
SET salary = v_new_salary
WHERE
id = v_emp_id;
COMMIT;
END;
Слайд 26Вызов процедуры
CALL имя процедуры (параметры)
CALL change_salary(2314, 20000)
Слайд 27Создание функции: синтаксис
CREATE OR REPLACE FUNCTION name [(parameter,...)]
RETURNS datatype
AS
pl/sql_block;
Не забудьте
включить в блок PL/SQL по крайней мере один оператор RETURN
Слайд 28Создание функции: пример
FUNCTION tax
(v_value IN NUMBER)
RETURNS NUMBER
AS
BEGIN
RETURN (v_value * 0.07);
END;
Возврат
величины налога (7%) для данной суммы
Слайд 29
Функции
CREATE FUNCTION check_sal RETURN Boolean IS
dept_id employees.department_id%TYPE;
empno
employees.employee_id%TYPE;
sal employees.salary%TYPE;
avg_sal employees.salary%TYPE;
BEGIN
empno:=205;
SELECT
salary,department_id INTO sal,dept_id
FROM employees WHERE employee_id= empno;
SELECT avg(salary) INTO avg_sal FROM employees
WHERE department_id=dept_id;
IF sal > avg_sal THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
/
Слайд 31Вызов функции в команде SQL
Допустимые предложения SQL:
Список выборки в команде
SELECT
Условие в предложениях WHERE и HAVING
Предложения CONNECT BY, START WITH,
ORDER BY и GROUP BY
Предложение VALUES команды INSERT
Предложение SET команды UPDATE
Слайд 32Вызов функции в команде SQL: пример
SELECT total, tax(total)
FROM
s_ord
WHERE id = 100;
TOTAL
TAX(TOTAL)
------------- ----------
601100.00 42077
Слайд 33Вызов процедур и функций
Вызов процедур и функций возможен:
Из других
процедур и функций
Из триггеров
Из внешних программ
Из анонимных блоков SQL
Слайд 34Управление потоком операций в PL/SQL
Логический поток операций можно изменять
c
помощью управляющих структур
Структуры условного управления (оператор IF).
Циклы:
Простой цикл
Цикл FOR
Цикл
WHILE
Оператор EXIT
Слайд 35Оператор IF: синтаксис
Действия можно выполнять выборочно в зависимости от определенных
условий:
ELSIF — одно слово.
END IF — два слова.
Предложение ELSE может
быть только одно
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
Слайд 36Пример использования оператора IF
. . .
IF v_start > 100 THEN
RETURN (2 * v_start);
ELSIF v_start >= 50 THEN
RETURN (.5 * v_start);
ELSE
RETURN (.1 * v_start);
END IF;
. . .
Слайд 37Циклы
Цикл позволяет выполнить последовательность команд несколько раз.
Три типа циклов:
Простой цикл
Цикл
FOR
Цикл WHILE
Слайд 38Простой цикл: синтаксис
Многократное выполнение команд с помощью простого цикла.
Без предложения
EXIT цикл был бы бесконечным
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;
Слайд 39Цикл FOR: синтаксис
Цикл FOR - это быстрый способ установки количества
повторов цикла
FOR index in [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
Слайд 40Цикл FOR: пример
FOR ind in 1..100 LOOP
INSERT INTO
s_item (ord_id, item_id)
VALUES (v_ord_id, v_counter);
END LOOP;
Слайд 41Цикл WHILE: синтаксис
Цикл WHILE используется для повторения цикла в течение
всего времени, пока выполняется условие
WHILE condition LOOP
statement1;
statement2;
.
. .
END LOOP;
Слайд 42Цикл WHILE: пример
. . .
v_ord_id s_item.ord_id%TYPE := 101;
v_counter NUMBER(2) :=
1;
BEGIN
. . .
WHILE v_counter
INTO s_item (ord_id, item_id)
VALUES (v_ord_id, v_counter);
v_counter := v_counter + 1;
END LOOP;
. . .
Слайд 43Пакет – это совокупность логически связанных процедур и функций.
Пакет обязательно
содержит
Спецификацию
Тело пакета (package body)
Пакеты
Слайд 44Описывает интерфейс к возможностям пакета.
В спецификации объявляются доступные извне
типы, переменные, константы, исключения, курсоры и подпрограммы.
Спецификация пакета
Слайд 45CREATE OR REPLACE PACKAGE имя_модуля {IS AS} описание_процедуры | описание_функции
| объявление_переменной | определение_типа | объявление_исключительной_ситуации | объявление_курсора |
END
[имя_модуля];
Спецификация пакета
Слайд 46Реализует спецификацию и полностью определяет курсоры и подпрограммы.
В теле
пакета находятся скрытые от приложения детали реализации и объявления частных
объектов.
Тело пакета
Слайд 47CREATE OR REPLACE PACKAGE BODY имя_модуля
{IS AS}
код_инициализации_процедуры |
код_инициализации_функции |
END [имя_модуля];
Тело пакета
Слайд 48Пакеты: пример
CREATE OR REPLACE PACKAGE test_pkg IS
FUNCTION Add_Two_Num(A IN
NUMBER,
B IN NUMBER) RETURN NUMBER;
FUNCTION FACTORIAL(NUM IN NUMBER)
RETURN NUMBER;
END test_pkg;
Слайд 49Пакеты: пример
CREATE OR REPLACE PACKAGE BODY test_pkg IS
FUNCTION Add_Two_Num(A
IN NUMBER, B IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN
(A + B);
END Add_Two_Num;
FUNCTION FACTORIAL(NUM IN NUMBER) RETURN NUMBER IS
BEGIN
IF (NUM <=1) THEN RETURN (NUM);
ELSE RETURN (NUM * FACTORIAL(NUM-1));
END IF;
END FACTORIAL;
END test_pkg;
Слайд 50Пакеты
Имя_пакета.имя_процедуры(параметры)
test_pkg.FACTORIAL(5)