Модульное программирование и подпрограммы Что такое программные единицы PL/SQL? Именованные блоки PL/SQL Три основных категории: ◦ Процедуры - осуществляют действия ◦ Функции - вычисляют значения ◦ Пакеты - объединяют логически связанные процедуры и функции Хранятся в базе данных или разрабатываются в виде прикладных подпрограмм Компоненты подпрограммы HEADER - обязательно ◦ Имя, тип и аргументы подпрограммы DECLARATIVE - необязательно ◦ Локальные идентификаторы EXECUTABLE - обязательно ◦ Команды SQL ◦ Управляющие предложения PL/SQL EXCEPTION HANDLING - необязательно ◦ Действия в случае возникновения ошибок END; - обязательно Создание подпрограммы Выбор среды Создание подпрограммы Компиляция кода Вызов подпрограммы отладка отладка Создание процедуры: синтаксис PROCEDURE name [(parameter,...)] IS pl/sql block; где "параметр" имеет следующий синтаксис: parameter_name [IN | OUT | IN OUT] datatype [{:= | DEFAULT} expr] Создание процедуры: рекомендации При разработке процедуры в SQL*Plus пользуйтесь командой CREATE OR REPLACE Укажите все параметры Начните блок PL/SQL ключевым словом IS После IS введите определения локальных переменных или ключевое слово BEGIN Виды параметров процедуры Вызывающая среда Процедура Аргумент IN Аргумент OUT Аргумент IN OUT (DECLARE) BEGIN EXCEPTION END; Виды формальных параметров IN По умолчанию. OUT Необходимо указывать. Значение: Передается в подпрограмму. Возвращается в вызывающую среду. Роль параметра: Константа. Неинициализированная переменная. IN OUT Необходимо указывать. Передается в подпрограмму; Возвращается в вызывающую среду. Инициализированная переменная. Фактический параметр: Может быть переменной, выражением, константой или инициализированной переменной. Должен быть переменной. Должен быть переменной Создание процедуры: пример PROCEDURE change_salary (v_emp_id IN NUMBER, v_new_salary IN NUMBER) IS BEGIN UPDATE s_emp SET salary = v_new_salary WHERE id = v_emp_id; COMMIT; END change_salary; Процедура или функция? Вызывающая среда Процедура Аргумент IN Аргумент OUT Аргумент IN OUT Вызывающая среда Функция Аргумент IN (DECLARE) (DECLARE) BEGIN BEGIN EXCEPTION EXCEPTION END; END; Сравнение функций и процедур Процедура Исполняется как предложение PL/SQL Функция Вызывается как часть выражения Оператор RETURN Оператор RETURN не должен возвращать тип возвращает тип данных данных Может возвращать Должна возвращать значение значение Создание функции Создайте функцию PL/SQL для возврата значения в вызывающую среду Включите в объявление функции оператор RETURN с типом возвращаемых данных Блок PL/SQL должен включать, по крайней мере, один оператор RETURN Создание функции: синтаксис FUNCTION name [(parameter,...)] RETURN datatype IS pl/sql_block; Не забудьте включить в блок PL/SQL, по крайней мере, один оператор RETURN Создание функции: пример Возврат величины налога для данной суммы FUNCTION tax (v_value IN NUMBER) RETURN NUMBER IS BEGIN RETURN (v_value * .07); END tax; Вызов процедур из программы Procedure Builder: пример В командной строке Интерпретатора введите имя процедуры. Если требуется, укажите параметры. PL/SQL> change_salary (17, 1000); Вызов процедуры из другой процедуры: пример PROCEDURE process_sal (v_emp_id IN NUMBER, v_new_salary IN NUMBER) IS BEGIN change_salary (v_emp_id, v_new_salary); --invoking procedure change_salary ... END; Вызов функции в Procedure Builder 1. Создание переменной среды .CREATE NUMBER name CHAR DATE 2. Присваивание переменной среды значения, возвращаемого функцией Вывод на экран значения переменной среды 3. Вызов отдельных функций из программы Procedure Builder: пример Вывод величины налога для заданной суммы PL/SQL> .CREATE NUMBER x PRECISION 4 PL/SQL> :x := tax(100); PL/SQL> TEXT_IO.PUT_LINE (TO_CHAR (:x)); 7 Вызов функций в командах SQL Преимущества ◦ Возможность выполнения вычислений, трудно осуществимых в SQL иными способами ◦ Повышение производительности запросов Требования ◦ Только хранимые функции, а не процедуры ◦ Однострочные функции ◦ Отсутствие команд языка манипулирования данными (DML) ◦ Формальные параметры должны быть входными (IN) ◦ Типы данных сервера Oracle, а не PL/SQL ◦ Привилегии EXECUTE Вызов функции в команде SQL Допустимые предложения SQL: Список выборки в команде SELECT Условия в предложениях WHERE и HAVING Предложения CONNECT BY, START WITH, ORDER BY и GROUP BY Предложение VALUES команды INSERT Предложение SET команды UPDATE Вызов функции в команде SQL: пример В командной строке Интерпретатора введите команду SQL с вызовом функции. PL/SQL> SELECT total, tax(total) +> FROM s_ord +> WHERE id = 100; TOTAL TAX (TOTAL) --------- ----------- 601100.00 42077 Вызов подпрограмм в среде SQL*Plus Серверный вывод в SQL*Plus SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE(<значение>); Заключение Три основных категории подпрограмм: ◦ Процедуры, выполняющие действия ◦ Функции, вычисляющие значения ◦ Пакеты, объединяющие логически связанные процедуры и функции Два отличия функции от процедуры: ◦ Функция вызывается как часть выражения ◦ Функция должна возвращать значение