Professional Documents
Culture Documents
Lab 4 Oracle 18c New
Lab 4 Oracle 18c New
Щоб створити процедуру або функцію, необхідно мати системні привілеї CREATE
PROCEDURE.
Після визначення імені нової процедури або функції необхідно задати імена, типи і
види параметрів. Для кожного параметра зазвичай вказується вид - IN, OUT або IN OUT.
Вид параметра IN передбачає, що значення параметра має бути визначено при зверненні до
програми і не змінюється програмою. Спроба змінити в тілі програми значення параметра
виду IN приведе до повідомлення про помилку. Вид параметра OUT передбачає зміну
значення параметра в процесі роботи програми, тобто параметр виду OUT - це
повертаємий параметр. Параметр IN OUT - це параметр, якому при виклику повинно бути
присвоєно значення, яке може бути змінено в тілі програми.
...])]
Tabl4.
Приклад створення процедури, за допомогою SQL-запитів
(Arg1 IN NUMBER)
AS
BEGIN
END;
Виклик процедури та подальша вибірка з таблиці Tabl ілюструє зміни в базі даних,
здійснені викликом процедури InsRec.
BEGIN
InsRec(240);
END;
(Arg1 IN NUMBER)
AS
BEGIN
WHERE (ATL)=120;
END;
Виклик процедури:
BEGIN
Pr2(555);
END;
Подальша вибірка з таблиці Tabl ілюструє зміни в базі даних, здійснені викликом
процедури Pr2.
3)Процедура, що прізвище директора пише великими буквами.
SQL-процедура:
begin
lab3_p1;
end;
SQL-процедура:
begin
end;
5)Процедура, що оновлює таблицю: переводить им’я у нижній регістр, якщо корінь
ІД більше 3 та одиниці у верхній, якщо синус ціни більше за 0,5. Потім встановлює дату
на 2 місяці більше.
SQL-процедури:
update products set unit = upper(unit) where sin(price) > 0.5; --оновити таблицю,
встановити ім’я продукту в верхньому регістрі якщо синус більше 0,5
begin
lab3_p3;
end;
Створення процедури за допомогою інтерфейсу
В полі Procedure Body вводи потрібний нам код та натискаємо кнопку Next
[ім'я_схеми. ] ім'я_функції
....])]
RETURN тип_даних
SumVar NUMBER := 0;
BEGIN
SELECT Sum(At1) INTO SumVar FROM Tabl2
RETURN SumVar;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(SumRecInt(SYSDATE-1/2, SYSDATE+1/2));
END;
2) Розглянемо приклад створення функції, яка обчислює середнє значень атрибутів,
таких, що дата потрапляє в заданий параметрами функції інтервал.
BEGIN
FROM Tabl2
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; --закінчення тіла
В полі Function Body вводи потрібний нам код та натискаємо кнопку Next
BEGIN
DBMS_OUTPUT.PUT_LINE(Func3('10.05.17'));
END;
{BEFORE | AFTER}
[ , ім'я_стовпця... ]] }
[ , ім'я_стовпця... ]] }...]
специфікація_программи_на_ PL/SQL
У Oracle для отримання нових значень необхідно додати до імені стовпця префікс:
new. Так, наприклад, при вставці в таблицю CUSTOMER змінна: new.Name містить
значення стовпця Name рядки, що вставляється. У разі поновлення змінна: new.Name
містить значення, яке буде мати стовпець Name після виконання запиту. Аналогічним
чином, для отримання старих значень необхідно додати до імені цікавить нас стовпчика
префікс: old. Наприклад, при видаленні, змінна old.Name містить значення стовпця Name
рядка, що видаляється. У разі поновлення ця змінна містить значення стовпця Name до
виконання запиту.
DECLARE
StatAvg NUMBER;
StatStd NUMBER;
StatN NUMBER;
BEGIN
IF (ABS(StatAvg -
END IF;
END;
Роботу механізму тригера проілюструємо на прикладі. При введенні значення,
досить близького до середнього (в даному випадку 4), тригер запускається і "нічого не
відбувається". При введенні значення атрибута, рівного 7 відповідна статистика вказує на
велике ухилення, походить ходить спрацьовування тригера і новий рядок не включається.
Представлена в лістингу 2 операція вибірки підтверджує очікувана зміна в таблиці.
Далі заповнюємо поле, де вказуємо ім'я таблиці для котрої робимо тригер та
натискаємо кнопку Next
заповнюємо поле Trigger Name, де вказуємо ім'я тригера, в полі Firing Point вказуємо
коли запускати тригер та у полі Options вказуємо для якої команди буде тригер. В полі
Trigger Body вводи потрібний нам код та натискаємо кнопку Next
Тригег готовий для створення, для підтвердження натискаемо Finish
BEFORE
BEGIN
END;
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; --закінчення тіла
Функція 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
Функція 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. Степінь може бути дробова і
від'ємна, що істотно розширює можливостіданої Функції
Параметр Пояснення
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.
Функція 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
Функція 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 нижній регістр
Верне string.
Функція INITCAP перетворює кожен перший символ слова до верхнього
регістру, а всі інші символи до нижнього за умови, що символ-роздільник між
словами пропуск.
Оператор розгалуження
Оператори умовного переходу (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, що задають структури
розгалуження більш глибокого рівня.
IF умова _1 THEN
оператори_1; -- гілка1
ELSIF умова _2 THEN
оператори_2; — гілка 2
ELSE IF
END IF;
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE('');
ELSE
END IF;
END;
Оператор GOTO
Оператор переходу GOTO дозволяє здійснити перехід по мітці, присутньої в тілі
програми. За допомогою унікального ідентифікатора, укладеного в подвійні кутові дужки,
можна помітити будь-яку частину програми PL / SQL для організації безумовного
переходу по мітці. Апелюючи до класичної аргументації Е. Дейкстри, можна
стверджувати, що використання даного оператора в програмах не є хорошим стилем для
мов, що володіють розвиненими засобами обробки подій і управління потоком команд.
Оператор GOTO дозволяє здійснити безумовний перехід до мітці, ім'я якої має бути
унікальним всередині програми або блоку PL / SQL.
1) Розглянемо приклад використання GOTO для виходу з циклу коли він доходить
до 10.
DECLARE
n NUMBER:= 10;
BEGIN
IF j = n THEN
GOTO print_now;
END IF;
END LOOP;
END;
2) Розглянемо приклад використання GOTO для знаходження простого числа.
DECLARE
p VARCHAR2(30);
n PLS_INTEGER := 37;
BEGIN
IF n MOD j = 0 THEN
GOTO print_now;
END IF;
END LOOP;
<<print_now>>
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);
END;
CASE
Case - це оператор ВИПАДКУ вибирає з послідовності умов і запускає відповідну.
Пошук CASE оцінює кілька логічних виразів і вибирає перше, значення якого
дорівнює TRUE.
CASE [вираз]
ELSE результат
END
умова_1 .. умова_n повинні бути одного типу. Умови оцінюються по порядку, одна
за одною. Після того, як умова прийме значення TRUE (істина), оператор CASE поверне
результат, і не буде оцінювати умови далі.
Примітка
AS
BEGIN
DBMS_OUTPUT.put_line (
CASE
END);
END;
print_boolean(TRUE);
print_boolean (FALSE);
print_boolean (NULL);
END;
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 ;
DECLARE
valuation VARCHAR2(5):='D';
BEGIN
CASE valuation
END CASE;
END;
Оператори циклу
SQL>
DECLARE
Arg NUMBER;
I NUMBER;
BEGIN
I := 0;
Arg := 1;
LOOP
I := I + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(Textl) ;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg) ) ;
END;
Факторіал числа, вперше перевищує 1000 000 000 6227020800 Знайдене число = 13
PL / SQL procedure successfully completed.
Лістинг 1. Приклад процедури на PL / SQL, що використовує цикл, керований
оператором EXIT WHEN
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
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;