You are on page 1of 74

Лабораторна робота №4

Тема: Процедури, функції та тригери, що зберігаються.


Стандартні математичні функції, функції для роботи з датою та
часом, строкові функції. Команди управління виконанням програми.
Мета:
1. Прищепити студентам практичні навички в створенні процедур, функцій та
тригерів, що зберігаються, в БД Oracle.
2. Прищепити студентам практичні навички в використанні в БД Oracle
стандартних математичних функцій, функцій для роботи з датою і часом та
строкових функцій.
3. Прищепити студентам практичні навички в використанні в БД Oracle
команд управління виконанням програми.
4. Підготовити студентів до самостійного використання обов’язків
адміністратора БД.

Завдання на лабораторну роботу:


Всі дії та результати виконання цих дій повинні бути
продемонстровані за допомогою скриншотів (образ екрану) та
прокоментовані.
1. Створити 3 процедури, що зберігаються, для таблиць створених в 2-3
лабораторних роботах. Деякі з процедур необхідно зробити за допомогою
інтерфейсних можливостей Oracle, а деякі тільки за допомогою SQL-запитів. В
процедурах використати стандартні математичні функції, функції для роботи з
датою і часом та строкові функції Oracle.
2. Створити 3 функції, що зберігаються, для таблиць створених в 2-3
лабораторних роботах. Деякі з функцій необхідно зробити за допомогою
інтерфейсних можливостей Oracle, а деякі тільки за допомогою SQL-запитів. В
функціях використати стандартні математичні функції, функції для роботи з датою і
часом та строкові функції Oracle.
3. Створити 3 тригера, що зберігаються, для таблиць створених в 2-3
лабораторних роботах. Деякі з тригерів необхідно зробити за допомогою
інтерфейсних можливостей Oracle, а деякі тільки за допомогою SQL-запитів. В
тригерах використати стандартні математичні функції, функції для роботи з датою і
часом та строкові функції Oracle.
4. Оформити звіт по лабораторній роботі. Звіт повинен містити інформацію
про виконання кожного пункту завдання на лабораторну роботу.
5. Створити відео-файл з демонстрацією результатів виконання всіх пунктів
завдання (поясненням етапів виконання завдань та результатів).

В створених процедурах, функціях та тригерах, що зберігаються, мають


бути використані хоча б 3 різні стандартні математичні функції, 3 різні функції
для роботи з датою і часом та 3 різні строкові функції Oracle. В звіті необхідно
їх підкреслити та пояснити.
Зміст звіту:
1. Титульна сторінка.
2. Завдання на лабораторну роботу.
3. Виконання кожного пункту завдання та опис всіх необхідних дій і
результату.

Короткі теоретичні відомості


Процедури, що зберігаються, як засіб розмежування доступу
Процедури і функції Oracle, що зберігаються, дають ще один потужний і гнучкий
спосіб обмежити безліч дій, які користувач може робити з базою даних.

Процедура або функція - це безліч об'єднаних загальним задумом пропозицій мови


PL / SQL, які зберігаються на сервері в скомпільованій формі і виконуються за запитом
клієнтської пропозиції. Процедури або функції створюються для виконання певної
конкретної роботи користувачем. При цьому користувачеві досить надати привілеї на
виконання процедури, створеної для підтримки його діяльності. Важливим фактом є те, що
користувачеві не потрібно надання прав доступу до даних, оброблюваних даною
процедурою. Наявність такого механізму дозволяє виключити обробку даних
користувачем, не передбачену розробником системи або адміністратором безпеки.

Процедури і функції - це об'єкти бази даних і, отже, вони створюються командою


CREATE і знищуються командою DROP. При створенні процедури або функції повинні
бути визначені ім'я об'єкта, перелік і тип параметрів і логіка роботи програми, закодована
на мові PL / SQL.

Щоб створити процедуру або функцію, необхідно мати системні привілеї CREATE
PROCEDURE.

Після визначення імені нової процедури або функції необхідно задати імена, типи і
види параметрів. Для кожного параметра зазвичай вказується вид - IN, OUT або IN OUT.
Вид параметра IN передбачає, що значення параметра має бути визначено при зверненні до
програми і не змінюється програмою. Спроба змінити в тілі програми значення параметра
виду IN приведе до повідомлення про помилку. Вид параметра OUT передбачає зміну
значення параметра в процесі роботи програми, тобто параметр виду OUT - це
повертаємий параметр. Параметр IN OUT - це параметр, якому при виклику повинно бути
присвоєно значення, яке може бути змінено в тілі програми.

Оператор визначення процедури Oracle використовує наступний синтаксис:

CREATE [OR REPLACE] PROCEDURE

[ім'я _ схеми.] ім'я_процедури

[(ім'я_параметра [{IN | OUT | IN OUT}] тип_даних

[,ім'я_параметра [{IN | OUT | IN OUT}] тип_даних

...])]

{IS I AS} программа_на_PL/SQL

Ключове слово OR REPLACE вказує на безумовне заміщення старого тексту


процедури. Якщо ключове слово OR REPLACE не вказано і процедура визначена, то
заміщення старого значення коду процедури не відбувається і повертається повідомлення
про помилку. Зверніть увагу, що при описі змінних процедури не використовується
ключове слово DECLARE. Блок визначення даних починається відразу після ключового
слова AS (або IS, за вибором користувача).
Для початку створимо Workspace для нашої лабораторної для подальшої
роботи

Визначимо нашу схему – логічний контейнер для об’єктів бази даних

Визначимо адміністратора нашого Workspace


Закiнчимо налаштування

Структура таблиць та їх данні, що використовуються в прикладах:


Створимо таблицю
PRODUCT
Створимо таблицю ORDERS
Створимо Tabl
Створимо Tabl2
Створимо Tabl3

Tabl4.
Приклад створення процедури, за допомогою SQL-запитів

1) Розглянемо приклад створення процедури, яка заносить в таблицю значення


певної функції від числового параметра і поточну дату.

Протокол створення процедури:

CREATE OR REPLACE PROCEDURE InsRec

(Arg1 IN NUMBER)

AS

Coeff CONSTANT NUMBER := 0.5;

BEGIN

INSERT INTO Tabl VALUES(Coeff *Arg1,SYSDATE);

END;

Виклик процедури та подальша вибірка з таблиці Tabl ілюструє зміни в базі даних,
здійснені викликом процедури InsRec.
BEGIN

InsRec(240);

END;

Протокол змін в базі даних

2) Розглянемо приклад створення процедури, яка заносить в таблицю значення 555 в


полі ATL якщо спочатку воно дорівнювало 120.

Протокол створення процедури:

CREATE OR REPLACE PROCEDURE Pr2

(Arg1 IN NUMBER)

AS

BEGIN

UPDATE Tabl set ATL=Arg1

WHERE (ATL)=120;

END;
Виклик процедури:

BEGIN

Pr2(555);

END;

Подальша вибірка з таблиці Tabl ілюструє зміни в базі даних, здійснені викликом
процедури Pr2.
3)Процедура, що прізвище директора пише великими буквами.

SQL-процедура:

create or replace procedure lab3_p1 as --створення чи заміщення процедури та


ім’я_процедури

begin --починання процедури (тіло)

update products set name = initcap(name); --оновити таблицю і встановити в полі


name перше слово з великої букви;

end; --кінець процедури

SQL виклику процедури:

begin

lab3_p1;

end;

4)Процедура, що додає запис у таблицю із поточною датою.

SQL-процедура:

create or replace PROCEDURE lab3_p2(a in NUMBER, b in NUMBER, c in


NUMBER, d in NUMBER) as --створення чи заміщення процедури ім’я_процедури,
задаємо чотири аргументи

begin --початок тіла процедури

insert into ORDERS values (a, b, c, d, sysdate); --додати в таблицю значення


аргументів з системним часом

end; --кінець тіла

SQL виклику процедури:

begin

lab3_p2(18, 17, 15, 3);

end;
5)Процедура, що оновлює таблицю: переводить им’я у нижній регістр, якщо корінь
ІД більше 3 та одиниці у верхній, якщо синус ціни більше за 0,5. Потім встановлює дату
на 2 місяці більше.

SQL-процедури:

create or replace procedure lab3_p3 as --створення чи заміщення процедури


ім’я_процедури

begin --початок тіла процедури

update products set name = lower(name) where sqrt(product_id) > 3; --оновити


таблицю, встановити ім’я продукту в нижньому регістрі якщо корінь більше 3

update products set unit = upper(unit) where sin(price) > 0.5; --оновити таблицю,
встановити ім’я продукту в верхньому регістрі якщо синус більше 0,5

update orders set data = add_months(data, 2); --оновити таблицю, встановити


дату +2 місяці

end; --кінець тіла

SQL виклику процедури:

begin

lab3_p3;

end;
Створення процедури за допомогою інтерфейсу

Розглянемо приклад створення процедури за допомогою інтерфейсу, яка заносить в


таблицю значення 555 в полі ATL якщо спочатку воно дорівнювало 777.

Для того, щоб створити процедуру за допомогою інтерфейсу потрібно на сторінці


Home знайти Object Browser та натиснути на стрілку в правій частині у випливаючому
меню натиснути на Create та обрати Procedures.
Далі заповнюємо поле, де вказуємо ім'я процедури та натискаємо кнопку Next

Заповнюємо поля які нам потрібні та натискаємо кнопку Next

В полі Procedure Body вводи потрібний нам код та натискаємо кнопку Next

Процедура готова для створення, для підтвердження натискаемо Finish


Далі ми бачимо створену процедуру та її код

Виконаємо процедуру і зробимо вибірку всіх полів що б побачити зміни:


Функції, що зберігаються
Нагадаємо, що функції PL / SQL відрізняються від процедур тим, що повертають в
викликаючу середу значення параметра. Оператор визначення функції Oracle
Використовуйте наступний синтаксис:

CREATE [OR REPLACE] FUNCTION

[ім'я_схеми. ] ім'я_функції

[ (ім'я_параметра [{IN | OUT | INOUT}] тип_даних

[,ім'я_параметра [{IN | OUT | INOUT}] тип_даних

....])]

RETURN тип_даних

{IS | AS} программа_на_РL/SQL

Ключове слово OR REPLACE вказує на безумовне заміщення старого тексту


функції. Якщо ключове слово OR REPLACE не вказано і функція визначена, то заміщення
старого значення коду функції не відбувається і повертається повідомлення про помилку.
Опис типу даних для повертаємого функцією значення потрібне обов'язково. При описі
змінних функції так само, як і при описі змінних процедури, не використовується ключове
слово DECLARE. Блок визначення даних починається відразу після ключового слова IS
(або AS, за вибором користувача). Додатково до визначень, необхідним для процедури, у
визначенні функції повинен бути зазначений тип даних, що повертається функцією
значення. Повернення значення функції виконується оператором RETURN.

Приклад створення функцій, за допомогою SQL-запитів

1) Розглянемо приклад створення функції, яка обчислює суму значень атрибутів,


таких, що дата потрапляє в заданий параметрами функції інтервал.

Протокол створення функції:

CREATE OR REPLACE FUNCTION SumRecInt

(Arg1 IN DATE, Arg2 IN DATE) RETURN NUMBER AS

SumVar NUMBER := 0;

BEGIN
SELECT Sum(At1) INTO SumVar FROM Tabl2

WHERE At2 BETWEEN Arg1 AND Arg2;

RETURN SumVar;

END;

Протокол звернення до неї:

BEGIN

DBMS_OUTPUT.PUT_LINE(SumRecInt(SYSDATE-1/2, SYSDATE+1/2));

END;
2) Розглянемо приклад створення функції, яка обчислює середнє значень атрибутів,
таких, що дата потрапляє в заданий параметрами функції інтервал.

Протокол створення функції:

CREATE OR REPLACE FUNCTION Func2(Arg1 IN DATE)

RETURN NUMBER IS total number:=0;

BEGIN

SELECT AVG(AT1) INTO total

FROM Tabl2

WHERE AT2 LIKE Arg1;

RETURN total;

END;

Протокол звернення до неї:

BEGIN

DBMS_OUTPUT.PUT_LINE(Func2('10.05.17'));

END;
3) Функція, що вираховує загальну суму заказів, кількість товару яких більша
або дорівнює за вказану користувачем кількість.
SQL-функції:
create or replace FUNCTION laba3_f1(Arg1 in number) --cтворити чи
замінити функцію ім’я_функції(аргумент)
RETURN number IS total number:=0; --створити змінну total, та
повернути її як нуль
BEGIN --почати тіло функції
SELECT sum(price*amount) into total --обрахувати суму добутку та
записати результат в змінну total
FROM products, ORDERS
where Amount>=Arg1; --де аргумент введений менший або
дорівнює кількості
RETURN total; --повернути з функції значення змінної total
END; --закінчення тіла

SQL виклику функції:


begin
DBMS_OUTPUT.PUT_LINE('Общая сумма: ' || laba3_f1(3) || ' грн'); --
вивід тексу та змінної
end;

4)Функція, що вираховує кількість місяців з дати видачі останнього заказу.


SQL-функції:
create or replace function laba3_f2 return number as --створення або
заміщення функції повернути числове значення
timedate number := 0; --оголошення змінної
begin --почати тіло функції
select floor(months_between(sysdate, max(data))) into timedate from orders;
--обрахувати округлене значення різниці максимальної дати та реальної та зберегти
в змінній
return timedate; --повернути змінну timedate
end; --закінчення функції

SQL виклику функції:


begin
DBMS_OUTPUT.PUT_LINE('Количество месяцев с даты последнего
заказа: ' || laba3_f2);
end;

5)Функція, що видає номер заказу, що був виданий найпершим.


SQL-функції:
create or replace function laba3_f3 return number as --створення або
заміщення функції повернути числове значення
docies number; --оголошення числової змінної
i number := 0; --оголошення числової змінної і привласнення їй нуля
begin --початок тіла
select Order_id into docies
from orders
where data = (select min(data) from orders);
return docies; --повернути як змінну
end; --кінець тіла

SQL виклику функції:


begin
DBMS_OUTPUT.PUT_LINE('Номер первого в месяце заказа: ' ||
laba3_f3);
end;

Приклад створення функції за допомогою інтерфейсу

Розглянемо приклад створення функції за допомогою інтерфейсу, яка обчислює


середнє значень атрибутів, таких, що дата потрапляє в заданий параметрами функції
інтервал.

Для того, щоб створити функцію за допомогою інтерфейсу потрібно на сторінці


Home знайти Object Browser та натиснути на стрілку в правій частині у випливаючому
меню натиснути на Create та обрати Functions.
Далі заповнюємо поле, де вказуємо ім'я функції та натискаємо кнопку Next

Заповнюємо поля які нам потрібні та натискаємо кнопку Next

В полі Function Body вводи потрібний нам код та натискаємо кнопку Next

Функція готова для створення, для підтвердження натискаемо Finish


Протокол звернення до неї:

BEGIN

DBMS_OUTPUT.PUT_LINE(Func3('10.05.17'));

END;

Для знищення функції або процедури Oracle використовує такий синтаксис:

DROP FUNCTION [ім'я_схеми.] ім'я_функції

DROP PROCEDURE [ім'я_схеми.] ім'я_процедури

Розглянемо приклад знищення функції Oracle:

DROP FUNCTION SumRecInt;


Тригери бази даних, що зберігаються
Тригер бази даних - це процедура, яка автоматично запускається при виникненні
певних подій, пов'язаних з виконанням операцій вставки, видалення або модифікації даних
таблиці. Подія, яка керує запуском тригера, описується у вигляді логічних умов. Коли
виникає подія, що відповідає умовам тригера, сервер Oracle автоматично запускає тригер.
Тригери особливо корисні там, де необхідно забезпечити складний контроль захисту даних
або спеціальний аудит. Вони можуть також здійснювати контроль цілісності даних, якщо
потрібно більш складна перевірка, ніж перевірка, що забезпечується декларативними
обмеженнями цілісності. Тригер запускається при виконанні однієї з трьох операцій зміни
вмісту таблиці: INSERT, DELETE або UPDATE. Тригер може запускатися і декількома
операторами, але хоча б один оператор з трьох повинен бути обов'язково вказано в умові
запуску тригера. Якщо перелік операторів, які запускають тригер, включає оператор
UPDATE, то для умов спрацьовування можуть бути вказані конкретні змінювані стовпці.
Код тригера може виконуватися або до, або після тих операторів, які ініціювали запуск
тригера. Наприклад, якщо тригер запускається для перевірки повноважень користувача на
право виконання операції, то, звичайно, потрібно використовувати тригер з запуском до
виконання операції (з ключовим словом BEFORE). Якщо тригер застосовується для
формування даних для аудиторської записи, то розумно використовувати тригер з
запуском після виконання операції (з ключовим словом AFTER). Іноді виникає
необхідність відключення тригерів, наприклад, при проведенні масових операцій над
даними. Для цього призначені наступні оператори, які можуть перемикати режим,
дозволяючи або забороняючи запуск тригера - ALTER TRIGGER (змінюється режим
зазначеного тригера) з опцією DISABLE або ENABLE і ALTER TABLE (в цьому випадку
зміни режиму у всіх тригерів, пов'язаних з таблицею). Код тригера може бути
асоційований або з операцією над таблицею в цілому, або з кожним рядком, над якою
виконується операція. Залежно від цього тригери поділяють на операційні тригери і
рядкові тригери. Операційні тригери зазвичай використовують для перевірки правил, що
оперують таблицею в цілому, а рядкові тригери часто використовують для перевірки
обмежень цілісності при вставці рядків. Умова запуску рядкової тригера може бути
уточнено додатковим логічним умовою. Щоб створити тригер, необхідно мати системну
привілей CREATE TRIGGER. Для створення тригера в схемі, відмінною від поточної
схеми користувача, потрібно системна привілей CREATE ANY TRIGGER.

Оператор визначення тригера Oracle використовує такий синтаксис:

CREATE [ORREPLACE ]TRIGGER [ім'я_схеми.] ім'я_тригера

{BEFORE | AFTER}

{INSERT | DELETE | UPDATE [OF ім'я_стовпця

[ , ім'я_стовпця... ]] }

[OR {INSERT| DELETE | UPDATE [OF ім'я_стовпця

[ , ім'я_стовпця... ]] }...]

ON [ім'я_схеми.]{ ім'я_таблиці \ ім'я_представлення }

[FOR EACH ROW][WHEN умова]

специфікація_программи_на_ PL/SQL

Ключове слово OR REPLACE вказує на безумовне заміщення старого тексту


тригера. Якщо ключове слово OR REPLACE не вказано і тригер вже визначено, то
заміщення старого коду тригера не відбувається і повертається повідомлення про помилку.
Ключові слова BEFORE або AFTER вказують на виконання коду тригера або до, або після
операторів маніпулювання даними, які ініціювали запуск тригера. Ключові слова INSERT,
DELETE або UPDATE визначають конкретний оператор, що запускає тригер.
Необов'язкове ключове слово OR приєднує додатковий оператор, що запускає тригер.
Ключове слово ON задає ім'я таблиці, асоційованої з тригером. Необов'язкове ключове
слово FOR EACH ROW визначає тригер як рядковий. Необов'язкове ключове слово WHEN
задає додаткове логічне умова, що звужує область подій, при настанні яких тригер
запускається.

У Oracle для отримання нових значень необхідно додати до імені стовпця префікс:
new. Так, наприклад, при вставці в таблицю CUSTOMER змінна: new.Name містить
значення стовпця Name рядки, що вставляється. У разі поновлення змінна: new.Name
містить значення, яке буде мати стовпець Name після виконання запиту. Аналогічним
чином, для отримання старих значень необхідно додати до імені цікавить нас стовпчика
префікс: old. Наприклад, при видаленні, змінна old.Name містить значення стовпця Name
рядка, що видаляється. У разі поновлення ця змінна містить значення стовпця Name до
виконання запиту.

Приклади створення тригерів

1) Розглянемо приклад тригера, який виконується, якщо значення вводимого


атрибута "занадто ухиляється" від середнього значення для поточного стану таблиці. У
ролі заходів "занадто великого ухилення" виберемо правило "трьох сигм" яке широко
застосовується в інженерній практиці.

Протокол створення тригера представлений в лістингу 1. При спрацьовуванні


тригера передбачена генерація стандартної обробки помилки, якої присвоюється номер
20002 з відповідним діагностують повідомленням. Зверніть увагу на визначену змінну:
new.At1, що містить (по її змісту) вводиме значення атрибута At1.

Лістинг 1. Приклад створення тригера, який запускається при перевищенні


статистики ухилення від середнього значення заданого порогу.

CREATE OR REPLACE TRIGGER TRIG_TB3

BEFORE INSERT ON Tabl3 FOR EACH ROW

DECLARE

StatAvg NUMBER;

StatStd NUMBER;

StatN NUMBER;

BEGIN

SELECT COUNT(At1),SUM(At1), STDDEV(At1)

INTO StatN, StatAvg, StatStd FROM Tabl3;

IF (ABS(StatAvg -

StatN*(:new.At1))/(SQRT(StatN)*StatStd) > 3) THEN

RAISE_APPLICATION_ERROR(-20002, ' Занадто велике ухилення ');

END IF;

END;
Роботу механізму тригера проілюструємо на прикладі. При введенні значення,
досить близького до середнього (в даному випадку 4), тригер запускається і "нічого не
відбувається". При введенні значення атрибута, рівного 7 відповідна статистика вказує на
велике ухилення, походить ходить спрацьовування тригера і новий рядок не включається.
Представлена в лістингу 2 операція вибірки підтверджує очікувана зміна в таблиці.

Лістинг 2. Приклад, який ілюструє роботу тригера з контролю даних, що вводяться

INSERT INTO Tabl3 VALUES(4);


INSERT INTO Tabl3 VALUES(7);

2) Розглянемо приклад створення цього ж тригера за допомогою інтерфейсу.

Для того, щоб створити процедуру за допомогою інтерфейсу потрібно на сторінці


Home знайти Object Browser та натиснути на стрілку в правій частині у випливаючому
меню натиснути на Create та обрати Triggers.
Далі заповнюємо поле, де вказуємо ім'я процедури та натискаємо кнопку Next

Далі заповнюємо поле, де вказуємо ім'я таблиці для котрої робимо тригер та
натискаємо кнопку Next

заповнюємо поле Trigger Name, де вказуємо ім'я тригера, в полі Firing Point вказуємо
коли запускати тригер та у полі Options вказуємо для якої команди буде тригер. В полі
Trigger Body вводи потрібний нам код та натискаємо кнопку Next
Тригег готовий для створення, для підтвердження натискаемо Finish

Приклад, який ілюструє роботу тригера з контролю даних, що вводяться


3) Розглянемо приклад тригера, який виконується, якщо видаляється запис з Tabl4,
тоді видаляються ті ж записи з Tabl3.

CREATE OR REPLACE TRIGGER TRIG_DEL

BEFORE

DELETE ON Tabl4 FOR EACH ROW

BEGIN

DELETE FROM Tabl3 WHERE Tabl3.At1=:old.At1;

END;

Приклад, який ілюструє роботу тригера з видалення даних

DELETE FROM Tabl3 WHERE At1 = 1;


4) Тригер, при додавання запису у таблицю orders, перевіряє, чи є запис з
таким же номером в таблиці products, і якщо немає, то спочатку додає запис із новим
номер у таблицю products, а після того додається запис у таблицю orders.

SQL-тригера:
create or replace trigger lab3_t1 --створення та заміщення тригеру ім’я
тригеру
before --до дії
insert on orders for each row --додавання в таблицю
declare --оголошення змінних
znach number := 0;
begin --почати тіло тригеру
select count(*) into znach from products where exists (select product_id
from products, orders where product_id= :new.order_id); --вибрати
кількість в оголошену змінну з таблиці яка включає ідентифікатор продукту
такий самий, як і ідентифікатор заказу
if (znach = 0) then --якщо значення дорівнює 0, то
insert into products (product_id) values (:new.order_id); --встановити
значення в таблиці продукти таке саме як і у таблиці закази
end if; --закінчення
end; --закінчення тіла

SQL виклику процедури:


insert into orders values (19, 19, 15, 6, sysdate)
5)Тригер, при зміни атрибуту product_id в таблиці products, змінює ті ж самі
записи у таблиці orders.
SQL-тригера:
create or replace trigger lab3_t2 --створення та заміщення тригеру ім’я
тригеру
before --до дії
update of product_id on products for each row --оновлення таблиці
begin --почати тіло
update orders set orders.product_id = :new.product_id where
orders.product_id= :old.product_id; --встановити в таблиці замовлення
відповідний ідентифікатор до ідентифікатору в таблиці продукти
end; --закінчити тіло
SQL виклику процедури:
update products set product_id= 20 where product_id= 19;
6)Тригер запускається при видалені даних з таблиці CREDITS_2, та видаляє ті
ж самі записі в таблицях GIV_CREDIT_2 та TAKE_CREDIT_2
SQL-тригера:
create or replace trigger lab3_t3 --створення та заміщення тригеру ім’я
тригеру
before --до дії
delete on orders for each row --видалення з таблиці
begin --почати тіло
delete from products where products.product_id= :old.product_id; --
видалити з таблиці продукти рядок відповідний до видаленого рядка з таблиці
замовлення з відповідним ідентифікатором
end; --закінчити тіло

SQL виклику процедури:


delete from orders where product_id = 20;
Стандартні математичні функції
У Oracle передбачений ряд вбудованих функцій для роботи з числами.
Функція Приклади використання Дія, що виконується (n та m –
відповідно першій та другий
(якщо є) аргументи функції)
ABS SELECT ABS(100) XI, ABS(-100) Х2, Функція ABS повертає абсолютне
ABS(-100.2) Х3 FROM DUAL значення числа
CEIL SELECT CEIL(100) X1, CEIL(-100) Функція CEIL повертає найменше
Х2, CEIL(100.2) Х3, CEIL(-100.2) Х4 ціле, більше або рівне переданому
FROM DUAL як параметр числу n
FL00R SELECT FL00R(100.22) X1, FL00R(- Функція FLOOR повертає найбільше
100.22) Х2, FL00R(100.99) ХЗ, ціле, менше або рівне переданому в
FL00R(100.01) Х4 FROM DUAL якості параметра числа n
TRUNC SELECT TRUNC(100.25678) X1, Функція TRUNC повертає число n,
TRUNC(-100.25678) Х2, TRUNC(100.99) ХЗ, усічене до m знаків після коми (до
TRUNC(100.25678, 2) Х4 FROM DUAL m дробових знаків)
ROUND SELECT ROUND(100.25678) X1, Функція ROUND повертає число n,
ROUND(100.5) Х2, ROUND(100.99) округлене до m знаків після коми (до
ХЗ, ROUND(100.25678, 2) Х4 FROM m дробових знаків) за правилами
DUAL математичного округлення
SIGN SELECT SIGN(100.22) X1, SIGN(-100.22) Функція SIGN визначає знак числа.
Х2, SIGN(O) Х3 FROM DUAL Якщо n позитивне, то функція повертає
1. Якщо від'ємне - повертається -1. Якщо
дорівнює нулю, то повертається 0.
SQRT SELECT SQRT(1OO) X FROM DUAL Ця функція повертає квадратний
корінь від числа n
EXP SELECT EXP(2) X1, LN(1) Х2, Функція EXP зводить e в ступінь n, а
LN(EXP(2)) Х3 FROM DUAL функція LN обчислює натуральний
логарифм від n (при цьому n повинно
бути більше нуля)
L0G SELECT L0G(2, 8) XI, L0G(10, 100) Функція LOG виконує обчислення
Х2 FROM DUAL логарифма m за основою n
POWER SELECT POWER(10, 2) X1, P0WER(100, Функція POWER зводить число n в
1/2) Х2, P0WER(1000, 1/3) Х3, ступінь m.
P0WER(1000, -1/3) Х4 FROM DUAL
MOD SELECT MOD(10, 3) X1, MOD(10, 2) Функція MOD повертає результат
X2, MOD(100, 0) X3 FROM DUAL від ділення n на m
Функція ABS(n)
Функція ABS повертає абсолютне значення числа. наприклад:
SELECT ABS(100) XI, ABS(-100) Х2, ABS(-100.2) Х3 FROM DUAL
X1 Х2 ХЗ
100 100 100,2
Функція CEIL (n)
Функція CEIL повертає найменше ціле, більше або рівне переданому як параметр
числу n. наприклад:
SELECT CEIL(100) X1, CEIL(-IOO) Х2, CEIL(100.2) Х3, CEIL(-100.2) Х4
FROM DUAL
XI X2 X3 X4
100 -100 101 100

Функція FLOOR(n)
Функція FLOOR повертає найбільше ціле, менше або рівне переданому в якості
параметра числа n. наприклад:
SELECT FL00R(100.22) X1, FL00R(-100.22) Х2, FL00R(100.99) ХЗ,
FL00R(100.01) Х4 FROM DUAL
X1 X2 ХЗ X4
100 -101 100 100
Функція TRUNC(n [,m])
Функція TRUNC повертає число n, усічене до m знаків після десяткового дробу.
Параметр m може не вказуватися - в цьому випадку n усікається до цілого.
SELECT TRUNC(100.25678) X1, TRUNC(-100.25678) Х2, TRUNC(100.99) ХЗ,
TRUNC(100.25678, 2) Х4 FROM DUAL
X1 X2 X3 X4
100 -100 100 100.25

Функція ROUND(n [,m])


Функція ROUND повертає число n, округлене до m знаків після десяткового
дробу за правилами математичного округлення. Параметр m може не вказуватися - в
цьому випадку n округляється до цілого.
SELECT ROUND(100.25678) X1, ROUND(100.5) Х2, ROUND(100.99) ХЗ,
ROUND(100.25678, 2) Х4 FROM DUAL
X1 X2 X3 X4
100 101 101 100.26
Функція SIGN(n)
Функція SIGN визначає знак числа. Якщо n позитивне, то функція повертає 1.
Якщо від'ємне - повертається -1. Якщо дорівнює нулю, то повертається 0. Наприклад:
SELECT SIGN(100.22) X1, SIGN(-100.22) Х2, SIGN(O) Х3 FROM DUAL
X1 Х2 ХЗ
1 -1 0

Функція MOD(n, m)
Функція MOD повертає від ділення n на m. наприклад:
SELECT MOD(10, 3) X1, MOD(10, 2) X2, MOD(100, 0) X3 FROM DUAL
X1 Х2 ХЗ
1 0 100
Цікавою особливістю даної функції є можливість передачі m рівного нулю - при
цьому не виникає помилки ділення на 0.
Функція POWER(n, m)
Функція POWER зводить число n в ступінь m. Ступінь може бути дробовою і
від'ємною, що істотно розширює можливості даної функції.
SELECT POWER(10, 2) X1, P0WER(100, 1/2) Х2, P0WER(1000, 1/3) Х3,
P0WER(1000, -1/3) Х4 FROM DUAL
X1 Х2 ХЗ Х4
100 10 10 0.1
Функція POWER зводу число n в степінь m. Степінь може бути дробова і
від'ємна, що істотно розширює можливостіданої Функції

SELECT POWER(-100, 1/2) Х2 FROM DUAL


В даному випадку проводиться спроба обчислення квадратного кореня від
від'ємного числа, що призведе до виникнення помилки ORA- 01428 «Аргумент поза
діапазону».
Функція SQRT(n)
Ця функція повертає квадратний корінь від числа n Наприклад:
SELECT SQRT(1OO) X FROM DUAL

Функція EXP(n) и LN(n)


Функція EXP зводить e в ступінь n, а функція LN обчислює натуральний
логарифм від n (при цьому n повинно бути більше нуля). приклад:
SELECT EXP(2) X1, LN(1) Х2, LN(EXP(2)) Х3 FROM DUAL
X1 X2 Х3
2,71828182845905 0 2
Спроба передати функції LN від'ємне значення призводить до виникнення
помилки ORA-1428.
Функція LOG (n, m)
Функція LOG виробляє обчислення логарифма m по підставі n. приклад:
SELECT L0G(2, 8) XI, L0G(10, 100) Х2 FROM DUAL
X1 X2
3 2
Функції для роботи з датою та часом

Для збереження дати та часу в Oracle передбачений спеціальний тип DATE. З


фізичної точки зору це дробове число, ціла частина якого зберігає кількість днів з
деякої базової дати, а дробова - час. Це дозволяє здійснювати над датами арифметичні
операції - додавання і віднімання.
Представлення числа 123456.789 з різною точністю і масштабом
Визначення Представлення при виконанні дій
NUMBER 123456
NUMBER(7,1) 123456.7
NUMBER(5,2) помилка в даних
NUMBER(8,3) 123456.789
NUMBER(7,-2) 123500

Параметр Пояснення
YEAR Year, spelledout
YYYY 4-digit year
YYY
YY
Y Last 3, 2, or 1 digit(s) ofyear.
IYY
IY
I Last 3, 2, or 1 digit(s) of ISO year.
IYYY 4-digit year based on the ISO standard
Accepts a 2-digit year and returns a 4-digit year.
A value between 0-49 will return a 20xx year.
RRRR A value between 50-99 will return a 19xx year.
Q Quarter of year (1, 2, 3, 4; JAN-MAR = 1).
MM Month (01-12; JAN = 01).
MON Abbreviated name of month.
MONTH Name of month, padded with blanks to length of 9 characters.
RM Roman numeral month (I-XII; JAN = I).
WW Week of year (1-53) where week 1 starts on the first day of they
earand continues to the seventh day of the year.
Week of month (1-5) where week 1 starts on the first day of the
W month andends on the seventh.
IW Week of year (1-52 or 1-53) based on the ISO standard.
D Day of week (1-7).
DAY Name of day.
DD Day of month (1-31).
DDD Day of year (1-366).
DY Abbreviated name of day.
J Julian day; the number of dayssince January 1, 4712 BC.
HH Hour of day (1-12).
HH12 Hour of day (1-12).
HH24 Hour of day (0-23).
MI Minute (0-59).
SS Second (0-59).
SSSSS Second spastmid night (0-86399).
Fractional seconds. Use a valuefrom 1 to 9 after FF to indicate
FF the number of digitsin the fractionalse conds. For example, ‘FF4′.
AM, A.M., PM, or P.M. Meridian indicator
AD or A.D AD indicator
BC or B.C. BC indicator
TZD Day light savings information. For example, ‘PST’
TZH Timez one hour.
TZM Timez one minute.
TZR Timez one region.

Опис функцій та синтаксису функцій для роботи з датою та часом


Функція Приклади використання Дія, що виконується
SYSDATE Select SYSDATE FROM tableПовертає поточну дату і час
за годинником сервера
ADD_MONTHS(d, x) SELECT SYSDATE d, Повертає дату, отриману в
ADD_MONTHS(SYSDATE, 3) d1, результаті додавання до дати
FROM table d одного або декількох
місяців.
LAST _DAY(d) SELECT SYSDATE d, Повертає останнє число
LAST_DAY(SYSDATE) d1 FROM table місяця, вказаного в даті d
MONTHS_BET- SELECT Повертає кількість місяців
WEEN (dl, d2) MONTHS_BETWEEN('2.09.2006',
між двома датами dl і d2 з
'2.05.2006') d1 FROM tableурахуванням знака як dl-d2
TRUNС (d[,mask ]) SELECT SYSDATE d1, Виконує усічення зазначеної
TRUNC(SYSDATE) d2 FROM table
дати відповідно до маски
ROUND(d[,mask]) SELECT SYSDATE d1, ROUND
Аналогічна TRUNC, але
(SYSDATE) d2, ROUND(SYSDATE,замість усічення вона
'НН24') d3 FROM table виконує округлення
TO_DATE(str[,ma SELECT T0_DATE('12.09.2006') Перетворює рядок str в дату.
sk [,nls_lang]]) d FROM table Перетворення ведеться по
масці mask, якщо вона вказана
TO_CHAR(d[,mask]) SELECT SYSDATE d1, Перетворює дату d в
TO_CHAR(SYSDATE, 'DD.MM.YY символьний рядок відповідно
HH24:MI') d2 FROM table до заданої маски
Функція SYSDATE
Це одна з найбільш часто вживаних функцій, вона повертає поточну дату і час за
годинником сервера. приклад:
SELECT SYSDATE FROM dual
SYSDATE
26.12.2007 16:24:43

Функція ADD_MONTHS(d, x)
Повертає дату, отриману в результаті додавання до дати d одного або декількох
місяців. Кількість місяців задається параметрів х, причому х може бути від'ємним - в
цьому випадку вказана кількість місяців віднімається з заданої дати.
приклад:
SELECT SYSDATE d, ADD_MONTHS(SYSDATE, 3) d1,
ADD_MONTHS(SYSDATE, -3) d2 FROM dual
D Dl D2
26.12.2007 16:24:43 26.03.2008 16:24:43 26.09.2007 16:24:43

Функція LAST _DAY(d)


Повертає останнє число місяця, вказаного в даті d. Пример:
SELECT SYSDATE d, LAST_DAY(SYSDATE) d1 FROM dual
D D1
26.12.2007 16:24:43 31.12.2008 16:24:43
Ця функція дуже зручна для визначення кількості днів в заданому місяці,
наприклад:

SELECT SYSDATE d, TO_CHAR(LAST_DAY(SYSDATE), 'DD') d1 FROM dual


D D1
26.12.2007 16:24:43 31
Функція MONTHS_BETWEEN(dl, d2)
Функція MONTH_BETWEEN повертає кількість місяців між двома датами dl і d2
з урахуванням знака як dl-d2, що повертається число являється дробовим.
SELECT MONTHS_BETWEEN('2.09.2006', '2.05.2006') d1,
M0NTHS_BETWEEN('12.09.2006', '2.05.2006') d2, M0NTHS_BETWEEN('2.05.2006',
'12.09.2006') d3 FROM dual
Dl D2 D3
4 4,32258064516129 -4,32258064516129

Функція TRUN С (d[,mask ])


Виробляє усічення зазначеної дати відповідно до маскою. Якщо маска не вказана,
то усічення проводиться до дати.
Пример:
SELECT SYSDATE d1, TRUNC(SYSDATE) d2 FROM dual
Dl D2
26.09.2006 16:45:26 26.09.2006
Розглянемо типові приклади - усічення дати до годин, днів, місяця і року.
Форматна маска за замовчуванням дорівнює «DD»
SELECT SYSDATE dl, TRUNC(SYSDATE, 'HH24') d2,
TRUNC(SYSDATE, 'DD') d3, TRUNC(SYSDATE, 'MM') d4,
TRUNC(SYSDATE, 'YYYY') d5 FROM dual
Dl D2 D3 D4 D5
26.09.2006 16:49:21 26.09.2006 16:00:00 26.09.2006 01.09.2006 01.01.2006

Функція ROUND(d[,mask])
Функція ROUND аналогічна TRUNC, але замість усічення вона призведе
округлення. Форматна маска за замовчуванням дорівнює «DD». приклад:
SELECT SYSDATE d1, ROUND(SYSDATE) d2,
ROUND(SYSDATE, 'НН24') d3, ROUND(SYSDATE, ' DD') d4,
ROUND(SYSDATE, 'MM') d5 FROM dual
D1 D2 D3 D4 D5
26.09.2006 16:50:50 27.09.2006 26.09.2006 17:00:00 27.09.2006 01.10.2006
Форматні маски, допустимі для функцій TRUNC и ROUND
Розглянемо докладніше форматні маски і особливості їх застосування:
Маска Значення
СС Перший день сторіччя
YEAR, або YYYY, Перший день року
або YY, або Y
Q Перший день кварталу
MONTH, або MON,або ММ Перший день місяця
WW Той же день тижня, що день
поточного року
W Той же день тижня, що день
поточного місяця
DDD або DD день
DAY, або DY, або D Перший день тижня
НН, або НН12, або НН24 Година
Ml хвилина
Функція TO_DATE(str[,mask [,nls_lang]])
Функція ТО_DATE перетворює рядок str в дату. Перетворення ведется по масці
mask, якщо вона вказана. Якщо маска не вказана, то береться маска за замовчуванням.
У разі зазначення маски можна вказати ще один параметр - мова, яка використовується
при форматуванні назв місяців і днів. У разі помилки аналізу рядка str відповідно до
заданої маскою виникає виняткова ситуація. Найбільш поширена помилка «ORA-
01830: шаблон формату дати завершується перед визначенням всього рядка введення».
Крім того, нерідко зустрічається помилка «ORA-01821: формат дати не • розпізнано» -
вона виникає при вказівці неприпустимою форматної маски. приклад:
SELECT TО_DATE('12.09.2006') d FROM dual

Функція TO_CHAR(d[,mask])
Перетворює дату d в символьний рядок відповідно до заданої маскою. У разі
зазначення неприпустимою маски виникає виключна ситуація «ORA-01821: формат
дати не розпізнано». приклад:
SELECT SYSDATE d1, TO_CHAR(SYSDATE, 'DD.MM.YY HH24:MI') d2 FROM dual
Функції для роботи зі строками в Oracle.
Опис функцій та синтаксису функцій по роботі зі строками
Функція Приклади використання Дія, що виконується
LENGTH SELECT LENGTH(‘string ’) FROM DUA Повертає кількість символів в рядку
L
UPPER SELECT UPPER(‘string’) FROM DUA Переводить всі символи рядка в
L верхній регістр
INITCAP SELECT (‘string1 string2’) FROM Переводить перші символи
DUAL кожного слова в верхній регістр
LTRIM SELECT LTRIM ( 'str1') FROM DUAL Обрізають початкові і кінцеві пробіли.
RTRIM SELECT ( 'str2') FROM DUAL Функція LTRIM (рядок) обрізає всі
TRIM SELECT TRIM ( 'str3') FROM DUAL початкові пробіли рядка; функція RTRIM
(рядок) обрізає всі кінцеві пробіли рядка;
функція TRIM (рядок) обрізає всі
початкові і кінцеві пробіли рядка.
REPLACE SELECT REPLACE ( 'My_string', '_', '@') Заміняє частини рядка іншим
FROM DUAL поверне рядок My @ string. рядком
SUBSTR SELECT SUBSTR(TABLE_1.ADDRESS, Виділяє (вирізає) в заданому рядку
1,20) CITY, SUBSTR(TABLE_1.ADDRES підрядка. SUBSTR (вхідна_строка,
S, 21, 30) STREET, SUBSTR(TABLE_1. номер_ початкового_символу,
ADDRESS, 52, 3) TOWN FROM TABLE кількість_символів)
_1
INSTR SELECT * FROM TABLE1 WHERE Визначає входження підрядка в рядок.
INSTR(POST, ‘менеджер’, 1) > 0. Дана функція дає змогу визначати
номер символу в заданому рядку з
якого починається шуканий підрядок
(якщо такий є). Інакше повертається 0
TO_CHAR SELECT TO_CHAR (123) FROM Перетворює данні до інших типів
TO_NUMBER DUAL даних. TO_CHAR (число) перетворює
TO_DATE SELECT TO_NUMBER ( '12345') число в текст. TO_NUMBER (рядок)
FROM DUAL перетворює текст в число. TO_DATE
(рядок, формат_дати) перетворює
рядок в дату певного формату
LOWER SELECT LOWER(‘STrinG’) FROM DUA Переводить всі символи рядка в
L нижній регістр

Для спрощення роботи з рядками є ряд вбудованих функцій, що значно


полегшує такі операції як перетворення рядків до даних інших типів, пошук
підрядка в рядку, визначення довжини рядка і т. Д. У даній статті ми розглянемо
найпоширеніші функції для роботи з рядками.
1) Функція визначення довжини рядка LENGTH (рядок), повертає кількість
символів в рядку, включаючи кінцеві прогалини.
SELECT LENGTH(‘string ’) FROM DUAL верне значення 7.
2) Функції перетворення регістрів символів UPPER (рядок), LOWER (рядок),
INITCAP (рядок). Для перетворення символів до верхнього регістру
використовується функція UPPER ().
SELECT UPPER(‘string’) FROM DUAL вернет STRING.

Якщо необхідно перетворити символи рядка до нижнього регістра


використовується функція LOWER ().

SELECT LOWER(‘STrinG’) FROM DUAL

Верне string.
Функція INITCAP перетворює кожен перший символ слова до верхнього
регістру, а всі інші символи до нижнього за умови, що символ-роздільник між
словами пропуск.

SELECT INITCAP(‘string1 string2’) FROM DUAL

верне строку String1 String2.

3) Функції для обрізання початкових і кінцевих пробілів LTRIM (рядок),


RTRIM (рядок), TRIM (рядок). Відповідно перша функція обрізає всі початкові
пробіли рядки, друга - все кінцеві, а третя все початкові і кінцеві.
SELECT LTRIM ( 'str1') FROM DUAL поверне рядок str1,
SELECT RTRIM ( 'str2') FROM DUAL поверне рядок str2,
SELECT TRIM ( 'str3') FROM DUAL поверне рядок str3.
4) Функція заміни частини рядка іншим рядком REPLACE (вхідна_строка,
номер_начального_символа, кількість_символів). Для більшої ясності розглянемо
приклад, в деякому текстовому полі таблиці зберігається число. Причому символ-
роздільник між цілою і дробовою частиною в деяких полях «.», А нам для
подальшої обробки даних потрібно, щоб він у всіх полях повинен бути «,». Для
цього скористаємося функцією REPLACE наступним чином. REPLACE (field1, '.', ',')
І всі символи «.» В поле field будуть замінені на символ «,».
SELECT REPLACE ( 'My_string', '_', '@') FROM DUAL поверне рядок My @ string.
5) Функції перетворення даних до інших типів даних. TO_CHAR (число)
перетворює число в текст. TO_NUMBER (рядок) перетворює текст в число.
TO_DATE (рядок, формат_дати) перетворить рядок в дату певного формату.
SELECT TO_CHAR (123) FROM DUAL поверне рядок 123,
SELECT TO_NUMBER ( '12345') FROM DUAL поверне число 12345,
SELECT TO_DATE ('01 .01.2010 ',' dd.mon.yyyy ') FROM DUAL поверне дату
01.JAN.2010.
6) Функція визначення входження підрядка в рядок INSTR (вхідна_строка,
номер_начального_символа, кількість_символів). Даная функція дає змогу
визначати номер символу в заданій стрічці з якого починається шукана підрядок
(якщо така є). Інакше повертається 0. Наприклад нам потрібно визначити всі посади
в таблиці Table1, в найменуванні яких зустрічається підрядок «менеджер». Для
цього цілком підійде наступний оператор

SELECT * FROM TABLE1 WHERE INSTR(POST, ‘менеджер’, 1) > 0.

Тобто оператор SELECT виведе тільки ті записи з таблиці TABLE1 де шукана


підрядок «менеджер» буде знайдена. Причому пошук буде здійснюватися з першого
символу. Якщо пошук потрібно здійснювати з іншої позиції, то номер символу для
початку пошуку вказується в третьому параметрі.
SELECT INSTR ( 'Smallstring', 'string', 1) FROM DUAL поверне значення 7,
SELECT INSTR ( 'Smallstring', 'String', 1) FROM DUAL поверне значення 0.
7) Функція виділення в заданій стрічці подстроки SUBSTR(вхідна_строка,
номер_начального_символа, кількість_символів). Розглянемо такий приклад, в
призначеній для користувача таблиці зберігається адреса у вигляді найменування
населеного пункту, назва вулиці, номер будинку. Причому ми точно знаємо, що для
найменування населеного пункту відводиться строго 20 символів (якщо
найменуванні населеного пункту менше ніж 20 символів, то інша частина
заповнюється пробілами), для найменування вулиці 30 символів, для номера
будинку 3 символу. Далі нам необхідно перенести всі адреси з нашої таблиці в іншу
і при цьому все 3 компоненти адреси повинні бути в різних полях. Для виділення
компонент адреси застосуємо функцію SUBSTR ().

SELECT SUBSTR(TABLE_1.ADDRESS, 1, 20) CITY, SUBSTR(TABLE_1.ADDR


ESS, 21, 30) STREET, SUBSTR(TABLE_1.ADDRESS, 52, 3) TOWN FROM TABLE_1

Звичайно для перенесення даних необхідно скористатися оператором INSERT,


але для розуміння роботи функції SUBSTR цілком підійде розглянутий приклад.
SELECT SUBSTR ( 'My_string', 4, 3) FROM DUAL поверне рядок str.
Розглянуті вище функції можна використовувати у вхідних параметрах. Так
якщо нам потрібно виділити всі символи, після якогось певного, то в функцію
SUBSTR можна передати номер шуканого символу з функції INSTR. Наприклад
якщо потрібно перенести всі символи з поля таблиці, які розташовані після «,» то
можна використовувати таку конструкцію
SELECT SUBSTR (My_string, INSTR (My_string, ',', 1), LENGTH (My_string) -
INSTR (My_string, ',', 1) +1) FROM DUAL.
Для визначення початкового символу ми викликаємо функцію INSTR (), яка
поверне номер символу першого входження підрядка «,». Далі ми визначаємо
кількість символів до кінця рядка як різницю довжини рядка і номера першого
входження підрядка.
8) Для визначення коду символу використовується функція ASCII (рядок), яка
повертає код 1 символу рядка. наприклад
SELECT ASCII (W) FROM DUAL поверне значення 87.
9) Зворотна функція перетворення коду символу в символ CHR (число).
SELECT CHR (87) FROM DUAL поверне символ W.
Команди управління виконанням програми

Оператори більшості мов програмування, в тому числі і PL / SQL, виконуються


послідовно. Така схема називається потоком команд. У будь-якій розвиненій мові
присутній більш-менш багатий набір операторів управління потоком команд. Відповідні
оператори дозволяють виконувати умовні переходи, циклічно виконувати групу
операторів і здійснювати вихід з циклу при виконанні певних умов. В PL / SQL
передбачено кілька операторів, за допомогою яких можна управляти виконанням потоку
команд програми. Розглянемо відповідні програмні конструкції.

Оператор розгалуження
Оператори умовного переходу (IF …)
Існує три модифікації оператора умовного переходу:

IF-THEN | IF-THEN-ELSIF
--------------------- | ---------------------
IF умова THEN | IF умова 1 THEN
послідовність команд; | 1-ша послідовність команд;
END IF; | ELSIF условие2 THEN
| 2-га послідовність команд;
IF-THEN-ELSE | ...
--------------------- | ELSIF умова N THEN
IF умова THEN | N-а послідовність команд;
1-ша послідовність команд; | [ ELSE
ELSE | N+1-ша послідовність команд; ]
2-га послідовність команд; | END IF;
END IF; |

Оператор IF ... THEN ... ELSE дозволяє перевірити умову і, в залежності від
результатів перевірки (TRUE або FALSE), виконати різні групи операторів. Альтернативна
послідовність операторів визначається ключовим словом ELSE. Межі дії оператора IF
визначаються закриваючою операторною дужкою END IF. Для розширення структури
розгалуження додатково передбачені операторні дужки ELSIF, що задають структури
розгалуження більш глибокого рівня.

Oracle використовує наступний синтаксис конструкції розгалуження в PL / SQL:

IF умова _1 THEN

оператори_1; -- гілка1
ELSIF умова _2 THEN

оператори_2; — гілка 2

ELSE IF

ELSE оператори_n; -- оператори альтернативи

END IF;

Розглянемо приклад, який ілюструє механізм розгалуження в програмах на PL /


SQL. Програма виводить повідомлення про клас випромінювання в залежності від
значення вводиться параметра довжини хвилі (довжина хвилі передбачається заданої в
мікронах). Для введення даних використовується стандартне угоду SQL * Plus: змінна, ім'я
якої передує знаком "&", вводиться з терміналу користувача. Приклад програми на PL /
SQL, що використовує розгалуження:

DECLARE

Lamda NUMBER:= 0.33;

BEGIN

DBMS_OUTPUT.PUT_LINE('');

IF(Lamda > 0.65)

THEN DBMS_OUTPUT.PUT_LINE(' Інфрачервоне випромінення ');

ELSIF(Lamda < 0.41)

THEN DBMS_OUTPUT.PUT_LINE(' Ультрафіолет ');

ELSE

DBMS_OUTPUT.PUT_LINE(' Видиме світло ');

END IF;

END;
Оператор GOTO
Оператор переходу GOTO дозволяє здійснити перехід по мітці, присутньої в тілі
програми. За допомогою унікального ідентифікатора, укладеного в подвійні кутові дужки,
можна помітити будь-яку частину програми PL / SQL для організації безумовного
переходу по мітці. Апелюючи до класичної аргументації Е. Дейкстри, можна
стверджувати, що використання даного оператора в програмах не є хорошим стилем для
мов, що володіють розвиненими засобами обробки подій і управління потоком команд.

Мітки і оператор безумовного переходу (GOTO)

У будь-якому місці програми може бути поставлена мітка, що має синтаксис:

<< імя_мітки >>

Оператор GOTO дозволяє здійснити безумовний перехід до мітці, ім'я якої має бути
унікальним всередині програми або блоку PL / SQL.
1) Розглянемо приклад використання GOTO для виходу з циклу коли він доходить
до 10.

DECLARE

n NUMBER:= 10;

BEGIN

FOR j in 1..ROUND(1) LOOP

IF j = n THEN

GOTO print_now;

END IF;

END LOOP;

<< print_now >>

DBMS_OUTPUT.PUT_LINE(' Цикл дійшов до 10, GOTO спрацював ');

END;
2) Розглянемо приклад використання GOTO для знаходження простого числа.

DECLARE

p VARCHAR2(30);

n PLS_INTEGER := 37;

BEGIN

FOR j in 2..ROUND(SQRT(n)) LOOP

IF n MOD j = 0 THEN

p :=' не є простим числом ';

GOTO print_now;

END IF;
END LOOP;

p := ' є простим числом ';

<<print_now>>

DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);

END;

Слід зазначити, що використання GOTO (особливо в тих випадках, коли мітка


передує оператору GOTO) може привести до складних, нерозпізнаних кодами помилок, які
важко обробляти. Тому рідше використовуйте GOTO, тим більше що цей оператор не
можна використовувати для виконання переходу:

• в IF-блок, LOOP-блок або в інший блок, що не включає поточний;

• з одного речення IF-оператора до іншого;

• з зовнішнього блоку в SUB-блок;


• з обробника особливих ситуацій в поточний блок.

CASE
Case - це оператор ВИПАДКУ вибирає з послідовності умов і запускає відповідну.

Пошук CASE оцінює кілька логічних виразів і вибирає перше, значення якого
дорівнює TRUE.

синтаксис оператора CASE

CASE [вираз]

WHEN умова_1 THEN результат_1


WHEN умова_2 THEN результат _2

WHEN умова_n THEN результат _n

ELSE результат

END

Параметри або аргументи

вираз не є обов'язковим. Це значення, яке ви порівнюєте з умовами (тобто: умова_1,


умова_2 ... умова_n).

умова_1 .. умова_n повинні бути одного типу. Умови оцінюються по порядку, одна
за одною. Після того, як умова прийме значення TRUE (істина), оператор CASE поверне
результат, і не буде оцінювати умови далі.

результат_1 .. результат_n повинні бути одного типу даних. Це значення


повертається один раз, коли умова прийме TRUE (істина).

Примітка

Якщо умова не прийме TRUE, то оператор CASE поверне значення пропозиції


ELSE. Якщо пропозиція ELSE опущено і умова не прийме TRUE, то оператор CASE
поверне NULL. Оператор CASE може мати до 255 порівнянь. Кожна пропозиція WHEN ...
THEN розглядає 2 порівняння. Розглянемо приклад роботи оператора Case.

1) Створемо процедуру в якій опишемо роботу оператора Case:


CREATE OR REPLACE PROCEDURE print_boolean (b BOOLEAN) AUTHID
DEFINER

AS

BEGIN

DBMS_OUTPUT.put_line (

CASE

WHEN b IS NULL THEN 'Unknown'

WHEN b THEN 'Yes'

WHEN NOT b THEN 'No'

END);

END;

Продемонструємо роботу процедури та побачимо, що в залежності від переданого


значення, оператор CASE видає різні результати:
BEGIN

print_boolean(TRUE);

print_boolean (FALSE);

print_boolean (NULL);

END;

2) Розглянемо приклад роботи оператора CASE, коли потрібно в залежності від


цифри вивести її значення прописом.

DECLARE

a NUMBER:= 2;

BEGIN

CASE

WHEN a = 1 THEN
DBMS_OUTPUT.PUT_LINE('Один');

WHEN a = 2 THEN

DBMS_OUTPUT.PUT_LINE('Два');

ELSE

DBMS_OUTPUT.PUT_LINE('Інше число');

END CASE;

END ;

3) Розглянемо приклад роботи оператора CASE, коли потрібно в залежності від


букви в шкалі оцінок ECTS, вивести оцінку по національній шкалі.

DECLARE

valuation VARCHAR2(5):='D';

BEGIN

CASE valuation

WHEN 'A' THEN dbms_output.put_line('відмінно');


WHEN 'B' THEN dbms_output.put_line('дуже добре');

WHEN 'C' THEN dbms_output.put_line('добре');

WHEN 'D' THEN dbms_output.put_line('задовільно');

WHEN 'F' THEN dbms_output.put_line('не задовільно');

ELSE dbms_output.put_line('Немає такої оцінки');

END CASE;

END;

Оператори циклу

Організація циклу оформляється в програмі на PL / SQL декількома


способами. Найпростіший - використання оператора LOOP. Вийти з циклу можна
декількома способами. Конструкція EXIT WHEN забезпечує вихід з циклу при
виконанні умови у відповідному операторі.
Функція Опис
DECLARE Розділ описання: змінних, типів і підпрограм
Arg Ключове слово для призначення змінної
Limit Призначення границі
BEGIN Розділ виконуючого коду: команди
процедурної і SQL-мови
LOOP Ключове слово початку блоку циклу
END LOOP Ключове слово кінця блоку циклу
EXIT Вихід з підпрограми
DBMS_OUTPUT.PUT_LINE Виводимо посилання
WHILE Цикл, керований ключовим словом WHILE.
Управління даного типу забезпечує виконання
циклу до тих пір, поки умова, визначена
ключовим словом WHILE, є істинним (TRUE).
Модифікуємо попередній приклад, змінивши
константу і задавши умову виходу з циклу
ключовим словом WHILE
FOR .. IN Цикл, керований оператором FOR,
використовується в тому випадку, коли
точно відомо, скільки разів потрібно
виконувати ітерацію циклу.

Розглянемо приклад визначення числа, факторіал якого є найменшим числом,


більшим заданої константи (наприклад, 1 000 000 000).

SQL>

DECLARE

Arg NUMBER;

I NUMBER;

Limit NUMBER := 1000000000;

Textl VARCHAR2 (80) := 'Факторіал числа, вперше перевищує 1 000 000


000 ' ;

BEGIN

I := 0;

Arg := 1;
LOOP

EXIT WHEN ARG >Limit;

Arg := Arg*(I +1);

I := I + 1;

END LOOP;

DBMS_OUTPUT.PUT_LINE(Textl) ;

DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg) ) ;

DBMS_OUTPUT.PUT_LINE(' Шукане число 1 | I TO_CHAR(I)');

END;

Факторіал числа, вперше перевищує 1000 000 000 6227020800 Знайдене число = 13
PL / SQL procedure successfully completed.
Лістинг 1. Приклад процедури на PL / SQL, що використовує цикл, керований
оператором EXIT WHEN

Ще одним поширеним варіантом організації циклу є цикл, керований


ключовим словом WHILE. Управління даного типу забезпечує виконання циклу до
тих пір, поки умова, визначена ключовим словом WHILE, є істинним (TRUE).
Модифікуємо попередній приклад, змінивши константу і задавши умову виходу з
циклу ключовим словом WHILE.

SQL>

1. DECLARE
2. Arg NUMBER; — Змінна для видачі факторіалу
3. I NUMBER; — Змінна-лічильник
4. Limit NUMBER := 1000000000000; — Границя
5. Textl VARCHAR2(80) := 'Факторіал числа, вперше перевищує 1
000 000 000 000 ';
— Виконуючий блок
6. BEGIN
7. I := 0;
8. Arg := I;
9. WHILE Arg< 1000000000000 LOOP
10. Arg := Arg*(1+1);
11. I := I + I;
12. END LOOP;
13. DBMS JDUTPU.T.PUT_LINE( Text 1);
14. DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg));.
15. DBMS_OUTPUT.PUT_LINE(Шукане число = 1| |
TO_CHAR(I)};.
16. END;
Факторіал числа, вперше перевищує 1 000 000 000 000 1307674368000
Знайдене число = 13
Лістинг 2. Приклад програми на PL / SQL з циклом, керованим оператором WHILE

Цикл, керований оператором FOR, використовується в тому випадку, коли


точно відомо, скільки разів потрібно виконувати ітерацію циклу. Розглянемо
приклад розрахунку факторіала заданого числа. Зверніть увагу, що змінну циклу (в
даному випадку I) описувати в блоці DECLARE не потрібно.

SQL>

1. DECLARE
2. Arg NUMBER:= 1;— Змінна для видачі факторіалу
3. Limit NUMBER := 20;.— Границя
4. Textl VARCHAR2(30) := 'Факторіал числа 20=';
— Виконуючийблок
5. BEGIN
6. FOR I IN 1..Limit LOOP 8 Arg := Arg*I;
7. END LOOP;
8. DBMS_OUTPUT.PUT_LINE(Textl||TO_CHAR(Arg));
9. END;

Факторіал числа 20 = 2432902008176640000

PL / SQL procedure successfully completed.


Лістинг 3. Приклад процедури на PL / SQL, з циклом, керованим оператором FOR

You might also like