
Lab_04_Oracle %28PL_SQL%29 / Додатково_Теорія_03_Вбудовані_функції
.pdf
$ |
Додавання символу $ до числа ліворуч |
$999999 |
$1234 |
|
|
|
|
|
|
. |
Десяткова крапка на заданій позиції |
999999.99 |
1234.00 |
|
|
|
|
|
|
, |
Кома – роздільник десяткових розрядів |
999,999 |
1,234 |
|
|
|
|
|
|
MI |
Постановка мінуса праворуч для |
999999MI |
1234- |
|
негативних чисел |
||||
|
|
|
||
|
|
|
|
|
RR |
Узяття негативних чисел у дужки |
999999PR |
1234 |
|
|
|
|
|
|
EEEE |
Математична нотація (повинні бути |
99. 999EEEE |
1. 234E+03 |
|
задані чотири Е) |
||||
|
|
|
||
|
|
|
|
|
|
Застосовується для множення на 10n, де |
|
|
|
V |
n – число позначених дев'ятками |
9999V99 |
123400 |
|
|
розрядів після V |
|
|
|
|
|
|
|
|
B |
Прибирання нульових значень: видавати |
B9999.99 |
1234.00 |
|
нульові значення як пробіли, без нуля |
||||
|
|
|
||
|
|
|
|
Примітка. Наведені вище числові формати можуть також використовуватися в команді COLUMN середовища SQL*Plus.
Функція TO_NUMBER
TO_NUMBER( рядок );
Функція TO_NUMBER перетворює символьні рядки, що містять цифри, у числа.
У запропонованому прикладі функція TO_NUMBER використо-вується для перетворення числа в символьному форматі в числовий формат:
SQL> ------------------
SQL> -- Вправа №43
SQL> ------------------
SQL> SELECT служ_номер, служ_имя, должность, оклад
2 |
FROM служ |
|
|
|
3 |
WHERE оклад > TO_NUMBER('1500'); |
|
||
СЛУЖ_НОМЕР СЛУЖ_ИМЯ ДОЛЖНОСТЬ |
ОКЛАД |
|||
---------------------- |
----------------- |
|
-------------------- |
--------- |
|
7499 |
Иванова |
реализатор |
1600 |
|
7566 |
Гончаров |
менеджер |
2975 |
|
7698 |
Головко |
менеджер |
2850 |
|
7782 |
Шевченко |
менеджер |
2450 |
|
7788 |
Мюллер |
аналитик |
3000 |

7839 |
Король |
президент |
5000 |
7902 |
Штирлец |
аналитик |
3000 |
7 строк выбрано.
Функція TO_DATE
TO_DATE( рядок [, формат ]);
Функція TO_DATE перетворює символьні рядки в датина підставі шаблона, заданого в форматі . Якщо формат не заданий, то за замовчуванням це DD-MM-YYYY (залежить від настроювань NLS).
Наприклад, щоб знайти всіх службовців, зарахованих на роботу в лютому 1999 року (Лютий, 1999 – нестандартний формат дати), можна скористатися функцією TO_DATE:
SQL> ------------------
SQL> -- Вправа №44
SQL> ------------------
SQL> SELECT служ_номер, служ_имя, оформлен
2FROM служ
3WHERE TRUNC(оформлен, 'MONTH') = TO_DATE('Февраль, 1999', 'Month, YYYY');
СЛУЖ_НОМЕР СЛУЖ_ИМЯ ОФОРМЛЕН
----------------------- ---------------- -------------------
7499 |
Иванова |
20.02.1999 |
7521 |
Черничная |
22.02.1999 |
Символьний рядок, трактований відповідно до маски, був перетворений в дату й рівнявся зі значеннями стовпця «оформлений» з точністю до місяця.
Функція TO_DATE часто застосовується для передачі в Oracle значень дат у нестандартному форматі. Коли заноситься дата, Oracle за замовчуванням розуміє дати у форматі DD-MM-YYYY (залежить від настроювань NLS). Якщо ви хочете ввести дату в іншому форматі, потрібно використати функцію TO_DATE для конвертування рядка в дату.

7.3.2.6. Функції для даних будь-якого типу
Функція DECODE
Функція DECODE може вважатися самою потужною функцією мови SQL. Вона виконує дії, подібні до дій умовного оператора типу «IF-THEN-
ELSE».
Синтаксис функції DECODE наступний:
DECODE ({ стовпецьвираз },
значення1 , результат1 , значення2 , результат2 , ..., результат_за_замовчуванням );
Значення { стовпцявиразу } порівнюється з кожним зі значень зі списку, і, у випадку збігу зі значенням1 , повертає як результат результат1 . Якщо жодне зі значень зі списку не відповідає значенню { стовпця
виразу }, то результатом дії функції буде результат_за _замовчуванням . Якщо при цьому значення за замовчуванням не задано, то результатом виконання функції буде NULL. Якщо як значення за замовчуванням стоїть таке ж { стовпець
вираз }, що й у першому параметрі функції, то функція не змінює значення стовпця при його
відсутності в списку значень.
|
|
|
|
Аргументи |
|
|
|||
|
Функція DECODE повинна мати як мінімум 3 параметри або |
||||||||
аргументи. |
|
|
|
|
|
|
|
|
|
|
{ стовпець |
вираз } – |
стовпець |
або вираз, що підлягає декоду- |
|||||
ванню; |
|
|
|
|
|
|
|
|
|
|
значення1 |
– перше |
значення, |
з |
яким порівнюються значення |
||||
{ |
стовпця |
виразу }; |
|
|
|
|
|
|
|
|
результат1 – результат декодування значення стовпця при його |
||||||||
відповідності значенню1 ; |
|
|
|
|
|
|
|||
|
пари |
значенняN - результатN |
|
можуть бути |
задані |
в будь-якій |
|||
кількості; |
|
|
|
|
|
|
|
|
|
|
результат_за_замовчуванням |
– |
результат, |
що |
повертається |
||||
функцією, |
якщо жодне значення зі списку не збігається зі значенням |
||||||||
{ |
стовпця |
виразу }. |
|
|
|
|
|
|
|
|
Варто звернути увагу: |
|
|
|
|
|
|

{ стовпець |
вираз } може бути будь-якого типу. |
Значення в |
списку повинні бути того ж типу, що й |
{ стовпецьвираз }.
Результат, що повертає функцію, має той же тип, що й тип третього аргументу функції ( результат1 ).
У запропонованому прикладі декодуються посади «менеджер» і «реалізатор»; інші посади за замовчуванням заміняються на «невідомо».
SQL> ------------------
SQL> -- Вправа №45
SQL> ------------------
SQL> SELECT служ_имя, должность,
2 |
DECODE(должность, |
3 |
'реализатор', 'РАБОЧИЙ', |
4 |
'менеджер' , 'БОСС', |
5 |
'неизвестно') "Новая" |
6 |
FROM служ; |
СЛУЖ_ИМЯ ДОЛЖНОСТЬ |
Новая |
|
------------------ --------------------- -------------- |
||
Сидоров |
шофер |
неизвестно |
Иванова |
реализатор |
РАБОЧИЙ |
Черничная |
реализатор |
РАБОЧИЙ |
Гончаров |
менеджер |
БОСС |
Морозов |
реализатор |
РАБОЧИЙ |
Головко |
менеджер |
БОСС |
Шевченко |
менеджер |
БОСС |
Мюллер |
аналитик |
неизвестно |
Король |
президент |
неизвестно |
Воронина |
реализатор |
РАБОЧИЙ |
Збруев |
телохранитель неизвестно |
|
Зайцев |
повар |
неизвестно |
Штирлец |
аналитик |
неизвестно |
Болотова |
горничная |
неизвестно |
14 строк выбрано.
Щоб одержати значення бонусу для кожної категорії окладу, виконаєте команду:
SQL> ------------------
SQL> -- Вправа №46
SQL> ------------------
SQL> SELECT категория,
2 |
DECODE(категория, |
3 |
'1', '15%', |
4 |
'2', '10%', |
5 |
'3', '8%', |
6 |
'5%') "+" |
7 |
FROM оклад; |
КАТЕГОРИЯ +
------------------ ---
115%
210%
38%
45%
55%
Результат виконання функції DECODE повинен бути того ж типу, що й третій аргумент.
У наступному прикладі задамо службовцям різне підвищення окладу залежно від типу їхніх посад:
SQL> ------------------
SQL> -- Вправа №47
SQL> ------------------
SQL> SELECT должность, оклад,
2 |
|
DECODE(должность, |
|
|
3 |
|
'аналитик' , оклад*1.1, |
||
4 |
|
'реализатор', оклад*1.15, |
||
5 |
|
'менеджер' , оклад*0.95, |
||
6 |
|
|
оклад) "Новый оклад" |
|
7 |
FROM служ; |
|
|
|
ДОЛЖНОСТЬ |
ОКЛАД Новый оклад |
|||
-------------------- |
|
|
--------- ------------------- |
|
шофер |
|
1300 |
1300 |

реализатор |
1600 |
1840 |
реализатор |
1250 |
1437,5 |
менеджер |
2975 |
2826,25 |
реализатор |
1250 |
1437,5 |
менеджер |
2850 |
2707,5 |
менеджер |
2450 |
2327,5 |
аналитик |
3000 |
3300 |
президент |
5000 |
5000 |
реализатор |
1500 |
1725 |
телохранитель |
1100 |
1100 |
повар |
950 |
950 |
аналитик |
3000 |
3300 |
горничная |
800 |
800 |
14 строк выбрано.
Функція NVL
NVL({ |
стовпець вираз }, результат ); |
|
Перетворить порожні значення стовпця в результат. Якщо значення |
||
{ стовпця |
виразу } не порожнє, то воно залишається без зміни. Тип |
|
результату повинен відповідати типу { стовпця |
виразу }. |
|
Наприклад: |
|
|
SQL> |
------------------ |
|
SQL> -- |
Вправа №48 |
|
SQL> ------------------
SQL> SELECT оклад*12+NVL(премия,0), NVL(премия,1000),
2оклад*12+NVL(премия,0)
3FROM служ
4WHERE отдел_номер = 10;
ОКЛАД*12+NVL(ПРЕМИЯ,0) NVL(ПРЕМИЯ,1000) ОКЛАД*12+NVL(ПРЕМИЯ,0)
------------------------------------------- -------------------------- --------------------------------------
29400 |
1000 |
29400 |
60000 |
1000 |
60000 |
9600 |
1000 |
9600 |

Функція GREATEST
GREATEST({ стовпець1вираз1 }, { стовпець2
вираз2 }, ...);
Вибирає максимальне значення зі списку в дужках. Перед проведенням порівняння всі значення аргументів, починаючи із другого, автоматично конвертуються в тип першого аргументу.
Наприклад:
SQL> ------------------
SQL> -- Вправа №49
SQL> ------------------
SQL> SELECT GREATEST(1000, 2000), GREATEST(оклад, премия)
2 FROM служ
3 WHERE отдел_номер = 30;
GREATEST(1000,2000) GREATEST(ОКЛАД,ПРЕМИЯ)
---------------------------------- ----------------------------------------
2000 |
1600 |
2000 |
1250 |
2000 |
1400 |
2000 |
|
2000 |
1500 |
2000 |
|
6 строк выбрано.
Функція LEAST
LEAST({ стовпець1вираз1 }, { стовпець2
вираз2 }, ...);
Вибирає мінімальне значення зі списку в дужках. Перед проведенням порівняння всі значення аргументів, починаючи з другого, автоматично конвертуються в тип першого аргументу.
SQL> -----------------
SQL> -- Вправа №50
SQL> -----------------

SQL> SELECT LEAST(1000, 2000), LEAST(оклад, премия)
2FROM служ
3WHERE отдел_номер = 30;
LEAST(1000,2000) LEAST(ОКЛАД,ПРЕМИЯ)
--------------------------- ----------------------------------
1000 |
300 |
1000 |
500 |
1000 |
1250 |
1000 |
|
1000 |
0 |
1000 |
|
6 строк выбрано.
Функція VSIZE
GREATEST({ стовпецьвираз });
Видає кількість байтів, що використовується для зберігання в пам'яті значення стовпця.
SQL> |
------------------ |
SQL> -- |
Вправа №51 |
SQL> ------------------ |
|
SQL> SELECT отдел_номер, VSIZE(отдел_номер), VSIZE(оформлен), |
|
2 |
VSIZE(оклад), VSIZE(служ_имя) |
3FROM служ
4WHERE отдел_номер = 10;
ОТДЕЛ_НОМЕР VSIZE(ОТДЕЛ_НОМЕР) VSIZE(ОФОРМЛЕН) VSIZE(ОКЛАД) VSIZE(СЛУЖ_ИМЯ)
---------------------- ---------------------------------- ---------------------------- --------------------- ---------------------------
10 |
2 |
7 |
3 |
8 |
10 |
2 |
7 |
2 |
6 |
10 |
2 |
7 |
2 |
8 |
Ще раз про вкладеність функцій
Варто запам'ятати, що функції можуть бути вкладені одна в одну будь-яке число раз, виконання функцій ведеться від внутрішніх рівнів вкладеності до зовнішнього. Важливо при цьому правильно розставити дужки й вести облік їхньої кількості: число дужок, що відкривається, повинне збігатися з числом дужок, що закривається.
У запропонованому прикладі містяться вкладені функції:
SQL> ------------------
SQL> -- Вправа №52
SQL> ------------------
SQL> SELECT служ_имя, NVL(TO_CHAR(менеджер), 'без менеджера')
2FROM служ
3WHERE менеджер IS NULL;
СЛУЖ_ИМЯ NVL(TO_CHAR(МЕНЕДЖЕР),'БЕЗМЕНЕДЖЕРА')
------------------ ----------------------------------------------------------------------
Король без менеджера
1.Значення стовпця «менеджер» конвертується в символьний тип.
2.Функція NVL заміняє порожні значення стовпця «менеджер» на рядок «без менеджера». Без використання функції TO_CHAR виконання функції NVL було б неможливо, тому що тип поля «менеджер» – числовий,
азначення другого аргументу повинне бути відповідним йому за типом. Вкладені функції можуть також бути використані для одержання,
наприклад дати, що відповідає першій п'ятниці через два місяці після поточної дати, у форматі «Day dd Month YYYY».
SQL> ------------------
SQL> -- Вправа №53
SQL> ------------------
SQL> SELECT SYSDATE, TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE, 2), 'ПЯТНИЦА'),
2 |
'Day dd Month YYYY') |
3 |
FROM SYS.DUAL; |
SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(
------------------ ------------------------------------------------------

22.10.2000 |
Пятница 29 Декабрь 2000 |
1.Функція ADD_MONTHS додає два місяці до поточної дати
2.Функція NEXT_DAY визначає найближчу п'ятницю після знайденої
дати.
3. Функція TO_CHAR переводить знайдені значення в символьний рядок відповідно до маски форматування «Day dd Month YYYY».
7.3.2.7. Групові функції
Запропонований розділ демонструє, як статистична інформація (така, як середнє або сумарне значення) може бути отримана для групи рядків таблиці за допомогою так званих групових функцій. Тут буде розглянуто, як розбивати рядки таблиць на групи і як задавати критерій пошуку для груп і окремих рядків.
Групові функції оперують із набором рядків. Вони формують результати, засновані на обробці групи рядків і для цієї групи, на відміну від простих функцій, що працюють із окремими рядками. За замовчу-ванням всі рядки таблиці результатів трактуються як одна група. Щоб розбити рядки на групи, використовується команда GROUP BY, що специфікується
вкоманді SELECT.
Унаступній таблиці 7.16 наведений список групових функцій:
|
|
|
|
|
Таблиця 7.16 |
|
|
|
|
|
Групові функції |
||
|
|
|
|
|
|
|
|
Функція |
|
|
Значення, що повертає |
|
|
|
|
|
|
|
|
|
AVG ( [{DISTINCT |
ALL}] n |
); |
|
Середнє значення групи полів у стовпці, не |
|
|
|
|
|
|
|
включаючи порожніх значень |
|
|
|
|
|
|
||
COUNT ( [{DISTINCT ALL}] |
|
|
Кількість рядків у групі, в яких вираз має |
|
||
вираз |
); |
|
|
|
непусте значення |
|
|
|
|
|
|
|
|
MAX ( [{DISTINCT |
ALL}] |
|
|
Максимальне значення виразу в групі |
|
|
вираз |
); |
|
|
|
|
|
|
|
|
|
|
|
|
MIN ( [{DISTINCT |
ALL}] |
|
|
Мінімальне значення виразу в групі |
|
|
вираз |
); |
|
|
|
|
|
|
|
|
|
|
||
STDDEV ( [{DISTINCT ALL}] |
n ); |
|
Функція, що визначає математичне |
|
||
|
|
|
|
|
очікування в групі |
|
|
|
|
|
|
|
|