L допомагають легко реалізовувати складну бізнес-логіку модульним способом (тобто компонент за компонентом, причому одні компоненти багаторазово використовуються іншими). Збереження їх на сервері Oracle дає двояку вигоду: можливість повторного використання з передбачуваними результатами і дуже швидке виконання, оскільки серверні операції майже або зовсім не вимагають звернення до мережі.
2.1.1 Збережені процедури
Збережена процедура - це певний набір інструкцій, написаних на мові PL/SQL. Виклик процедури приводить до виконання містяться в ній інструкцій. Процедура зберігається в базі даних, тому й називається збереженої.
Процедура може виконувати SQL-оператори і маніпулювати даними в таблицях. Її можна викликати з іншого збереженої процедури PL/SQL, збереженої функції або тригера, а також безпосередньо з рядка запрошення SQL * Plus.
Процедура складається з двох основних частин: специфікації і тіла. Специфікація процедури (procedure specification) включає в себе ім'я процедури і опис її вхідних і вихідних даних. Ці вхідні і вихідні дані називаються формальними параметрами (formal parameters) або формальними аргументами (formal arguments). Якщо при виклику процедури вказуються параметри командного рядка або інші вхідні дані, ці значення називаються фактичними (actual) параметрами або фактичними аргументами.
Тепер розглянемо деякі приклади специфікацій процедур (Специфікація не містить ніякого коду; в ній визначається тільки ім'я процедури, а також її вхідні і вихідні параметри).
increase_prices (percent_increase NUMBER)
Цій процедурі при виклику може бути передано значення. Усередині процедури значення буде відомо під ім'ям PERCENT_INCREASE. Зверніть увагу, що тут вказано тип даних: NUMBER.
increase_salary_find_tax (increase_percent IN NUMBER:=7, IN OUT NUMBER, OUT NUMBER)
Тут ми бачимо процедуру з трьома формальними параметрами. Слово IN після імені параметра означає, що при виклику процедура може вважати з цього параметра вхідне значення. Слово OUT означає, що процедура може використовувати даний параметр для повернення значення в ту програму, з якої вона була викликана. Комбінація IN OUT після імені параметра говорить про те, що параметр може використовуватися як для передачі значення процедурою, так і для повернення значення.
Параметру INCREASE_PERCENT в цьому прикладі присвоєно значення за замовчуванням (default value), рівне 7, шляхом додавання:=7 після типу даних. Таким чином, якщо процедура буде викликана без вказівки відсотка приросту, вона збільшить передане значення зарплати на 7% і розрахує податок, виходячи з нової зарплати.
Типи даних у процедурі не можуть мати специфікацій розміру. Наприклад, ви можете вказати для параметра тип даних NUMBER, але не NUMBER (10,2).
Тіло процедури (procedure body) - це блок PL/SQL-коду.
2.1.2 Збережені функції
Функція PL/SQL схожа на процедуру PL/SQL: вона також має специфікацію і тіло. Головна відмінність між процедурою і функцією в тому, що функція призначена для повернення значення, яке може використовуватися в більш великому SQL-операторів.
Розглянемо як приклад функцію, призначену для обчислення процентного відмінності між двома числами. Специфікація цієї функції може виглядати таким чином:
calcjpercent (value_l NUMBER, _2 NUMBER) return NUMBER
Ця функція приймає в якості вхідних параметрів два числа, посилаючись на них всередині себе як на VALUE_1 і VALUE_2. Після написання тіла функції її можна викликати в SQL-операторі наступним чином:
INSERT INTO employee VALUES (3000, CALC PERCENT (300, 3000));
2.1.3 Тригери
Тригер - це процедура PL/SQL, яка виконується автоматично, коли відбувається деяке задане подія, зване тригерним подією (triggering event). Наприклад, можна писати тригери, що спрацьовують при виконанні над таблицею операцій INSERT, UPDATE або DELETE; при видачі команд DDL; при вході користувача в систему або його виході з системи; при запуску або останове бази даних; при виникненні помилок.
Між тригерами і процедурами PL/SQL є три відмінності:
? Тригери не можна викликати з коду програми. Oracle викликає їх автоматично у відповідь на певну подію
? Тригери не мають списку параметрів
? Специфікація тригера трохи відрізняється від специфікації процедури
<...