- •Процедуры и функции в PL/SQL
- •Объявление и использование подпрограмм
- •Состав и параметры процедуры
- •Формальные параметры
- •Режимы использования параметров
- •Формальные и фактические параметры
- •Вызов процедуры
- •Позиционная нотация
- •Именованная нотация
- •Пример анонимного блока, объявляющего процедуру (1)
- •Пример анонимного блока, объявляющего процедуру (2)
- •Функция
- •Объявление и использование функции, вычисляющей сумму заказа
- •Преимущества хранения подпрограмм в базе данных
- •Создание хранимых процедур и функций
- •Создание и вызов процедуры без параметров
- •Создание и хранение процедуры printLine в БД Oracle (1)
- •Создание и хранение процедуры printLine в БД Oracle (2)
- •Выполнение блока, использующего процедуру printLine
- •Другой способ выполнения PL/SQL- подпрограмм
- •Создание и хранение функции orderTotal в БД Oracle (1)
- •Создание и хранение функции orderTotal в БД Oracle (2)
- •Выполнение блока, использующего
- •Хранимая процедура, определяющая число записей в таблице (1)
- •Хранимая процедура, определяющая число записей в таблице (2)
- •Хранимая процедура, возвращающая по первичному ключу название каталога (1)
- •Хранимая процедура, возвращающая по первичному ключу название каталога (2)
- •Хранимая процедура, выдающая число заказов покупателя по его коду (1)
- •Хранимая процедура, выдающая число заказов покупателя по его коду (2)
- •Пример использования функции с оператором IF
- •Функция compute_discounts (1)
- •Функция compute_discounts (2)
- •Использование функции compute_discounts (1)
- •Использование функции compute_discounts (2)
- •Пакеты
- •Глобальные конструкции
- •Пример создания спецификации пакета
Функция compute_discounts (1)
--Расчет скидки на заказ.
--Входной параметр - сумма заказа.
--Возвращается сумма скидки
--(нуль при неверных входных данных).
CREATE FUNCTION compute_discounts (order_amt NUMBER)
RETURN NUMBER IS
small_order_amt NUMBER := 400; large_order_amt NUMBER := 1000; small_disct NUMBER := 1;
large_disct NUMBER := 5;
Функция compute_discounts (2)
BEGIN
IF (order_amt < large_order_amt AND order_amt >= small_order_amt)
THEN
RETURN (order_amt * small_disct / 100) ; ELSIF (order_amt >= large_order_amt) THEN
RETURN (order_amt * large_disct / 100); ELSE
RETURN(0);
END IF;
END compute_discounts;
Использование функции compute_discounts (1)
SET SERVEROUTPUT ON; DECLARE
tiny NUMBER := 20; med NUMBER := 600; big NUMBER := 4550; wrong NUMBER := -35;
BEGIN
dbms_output.put_line (' Order AND Discount ');
dbms_output.put_line (tiny || ' ' || compute_discounts(tiny));
Использование функции compute_discounts (2)
dbms_output.put_line (med || ' ' || compute_discounts (med));
dbms_output.put_line (big || ' ' || compute_discounts (big));
dbms_output.put_line (wrong || ' ' || compute_discounts (wrong));
END;
/
Пакеты
Пакет – группа процедур, функций и др. конструкций, хра- нимых в БД как единое целое. Пакеты полезны для создания группы процедур и функций, относящихся к приложению.
Пакет состоит из двух частей:
Спецификация пакета. Интерфейс пакета. Объявляются переменные пакета, константы, курсоры, процедуры, функции, доступные для программ за пределами пакета.
Тело пакета. Определяются процедуры и функции, объявленные в спецификации. Включает определения конст рукций, не объявленных в спецификации, которые доступны только для программ внутри пакета.
Глобальные конструкции
Переменные, константы и курсоры, объявленные в специфи- кации или в теле пакета, вне подпрограммы считаются
глобальными.
В отличие от локальных переменных, констант и курсоров, объявленных внутри процедур и функций, глобальные кон- струкции доступны всем процедурам и функциям пакета.
Их состояние в течение сеанса остается постоянным независимо от подпрограмм пакета.
Объявление глобальных переменных (и др. глобальных кон- струкций) предполагает использование префикса g_.