THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

Функція TO_CHAR з числами

Функції перетворення даних до інших типів даних. TO_CHAR (число) перетворює число в текст. TO_NUMBER (рядок) перетворює текст в число.

SELECT TO_CHAR (123) FROM DUAL поверне рядок 123, SELECT TO_NUMBER ( `12345") FROM DUAL поверне число 12345.

Лабораторна робота. Зміна формату виведених чисел

Зміни формату числових значень в Oracle SQL, функція TO_CHAR для роботи з числовими значеннями.

завдання:

Напишіть запит, який би виводив інформацію про імені, прізвища та зарплати співробітників з таблиці hr.employees в форматі, представленому на рис. 3.4-1:

Мал. 3.4 -1

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

Примітка:

Деякі значення зарплати на рис. 3.4-1 були змінені, тому вони можуть не збігатися з вашими значеннями.

Рішення:

SELECT first_name AS «Ім'я», last_name As «Прізвище», TO_CHAR (SALARY, "L999999999.99") As «Оклад» FROM hr.employees ORDER BY SALARY DESC.

Функції TO_NUMBER і TO_DATE

Функція перетворення рядка в дату TO_DATE (рядок, формат). Можливі значення форматів вже розглянуті вище, тому наведу кілька прикладів використання даної функції. приклади:

SELECT TO_DATE ( «01.01.2010», `DD.MM.YYYY") FROM DUAL поверне дату `01.01.2010";

SELECT TO_DATE ( «01.JAN.2010", `DD.MON.YYYY") FROM DUAL поверне дату `01.01.2009";

SELECT TO_DATE ( «15-01-10», `DD-MM-YY") FROM DUAL поверне дату `15.01.2010".

Функція перетворення рядка в числове значення TO_NUMBER (рядок, формат). Найпоширеніші значення форматів перераховані в таблиці, тому розглянемо застосування даної функції на прикладах. приклади:

SELECT TO_NUMBER ( `100") FROM DUAL поверне число 100 SELECT TO_NUMBER ( `0010.01", "9999D99") FROM DUAL поверне число 10.01;

SELECT TO_NUMBER ( "500,000", "999G999") FROM DUAL поверне число 500000.

Елемент RR в форматі дати

Елемент формат дати і часу RR схожий на елемент форматі YY дати і часу, але це забезпечує додаткову гнучкість для зберігання значень дати і в інших століть. Елемент формату RR дати і часу дозволяє зберігати дати 20-го століття в 21-м столітті, вказавши тільки дві останні цифри року.

Якщо дві останні цифри поточного року є 00 до 49, то повертається рік має ті ж перші дві цифри, як в поточному році.

Якщо дві останні цифри поточного року від 50 до 99, то перші 2 цифри повернутого року є 1 більше, ніж в перші 2 цифр поточного року.

Якщо дві останні цифри поточного року є 00 до 49, то перші 2 цифри повернутого року є 1 менше перших 2 цифр поточного року.

Якщо дві останні цифри поточного року від 50 до 99, то повертається рік має ті ж перші дві цифри, як в поточному році.

функція NVL

Функція NVL, як правило, застосовується найчастіше. Функція отримує два параметри: NVL (expr1, ехрг2). Якщо перший параметр expr1 НЕ дорівнює NULL, то функція повертає його значення. Якщо перший параметр NULL, то замість нього функція повертає значення другого параметра ехрг2.

Приклад: Виберіть NVL (supplier_city, н / а ") від постачальників:

У заяві SQL вище повернеться н / ", якщо поле supplier_city міститься нульове значення. В іншому випадку він поверне значення supplier_city.

Інший приклад використання функції NVL в Oracle / PLSQL є:

виберіть supplier_id, NVL (supplier_desc, supplier_name) від постачальників.

Це SQL заяву буде повернути supplier_name поле, якщо supplier_desc міститься нульове значення. В іншому випадку він поверне supplier_desc.

Останній приклад: використовуючи функцію NVL в Oracle / PLSQL є: виберіть NVL (комісія, 0) від продажів;

Це SQL заяву повернула значення 0, якщо комісія поле міститься нульове значення. В іншому випадку, було б повернути комісії поле.

Перетворення NVL для різних типів даних

Для перетворення невизначеного значення в фактичне використовується функція NVL: NVL ( вираження1, вираз 2), де:

вираженіе1- Початкове або обчислене значення, яке може бути невизначеним.

вираженіе2 - Значення, яке підставляється замість невизначеного значення.

Примітка: Функцію NVL можна застосовувати для перетворення будь-якого типу даних, але результат завжди буде того ж типу, що й вираження1.

Перетворення NVL для різних типів:

NUMBER - NVL (Числовий стовпець, 9).

CHAR або VARCHAR2 - NVL (Символи | стовпець, "Немає доступу").

Лабораторна робота. Застосування функції NVL

Функція NVL для роботи з невизначеними значеннями в Oracle SQL.

завдання:

Напишіть запит, який виводить інформацію про ім'я та прізвища співробітників з таблиці hr.employees., А також ставку комісії (стовпець COMMISSION_PCT) для співробітника. При цьому для тих співробітників, для яких комісія не визначена, потрібно вивести значення 0. Результат виконання запиту повинен бути таким, як представлено на рис. 3.5-1.

Мал. 3.5 -1 (показані значення починаючи з рядка 51)

Рішення:

Код відповідного запиту може бути таким:

SELECT first_name AS «Ім'я», last_name As «Прізвище», NVL (COMMISSION_PCT, 0) As «Ставка комісії» FROM hr.employees.

функція NVL

Функція NVL, як правило, застосовується найчастіше. Функція отримує два параметри: NVL (expr1, expr2). Якщо перший параметр expr1 НЕ дорівнює NULL, то функція повертає його значення. Якщо перший параметр NULL, то замість нього функція повертає значення другого параметра expr2.

Розглянемо практичний приклад. Поле COMM в таблиці EMP може містити значення NULL. При виконанні запиту виду:

SELECT EMPNO, ENAME, COMM, NVL (COMM, 0) NVL_COMM

FROM SCOTT.EMP

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

EMPNO ENAME COMM NVL_COMM
7369 SMITH 0
7499 ALLEN 300 300
7521 WARD 500 500
7566 JONES 0
7654 MARTIN 1400 1400
7698 BLAKE 0
7782 CLARK 0
7839 KING 0
7844 TURNER 0 0
7900 JAMES 0
7902 FORD 0
7934 MILLER 0

Функція CEIL (n)

Функція CEIL повертає найменше ціле, більше або рівне переданому в якості параметра числа n. наприклад:

SELECT CEIL (100) X1, CEIL (-100) X2, CEIL (100.2) X3, CEIL (-100.2) X4

FROM DUAL

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

Функція TRUNC повертає число n, усеченное до m знаків після десяткового дробу. Параметр m може не вказуватися - в цьому випадку n усікається до цілого.

SELECT TRUNC (100.25678) X1, TRUNC (-100.25678) X2, TRUNC (100.99) X3,

TRUNC (100.25678, 2) X4

FROM DUAL

Функція SIGN (n)

Функція SIGN визначає знак числа. Якщо n позитивне, то функція повертає 1. Якщо негативне повертається -1. Якщо дорівнює нулю, то повертається 0. Наприклад:

SELECT SIGN (100.22) X1, SIGN (-100.22) X2, SIGN (0) X3

FROM DUAL

Цікавою особливістю даної функції є можливість передачі m рівного нулю при цьому не виникає помилки ділення на 0.

Функція POWER (n, m)

Функція POWER зводить число n в ступінь m. Ступінь може бути дробової і негативною, що істотно розширює можливості даної функції.

SELECT POWER (10, 2) X1, POWER (100, 1/2) X2,

POWER (1000, 1/3) X3, POWER (1000, -1/3) X4

FROM DUAL

X1 X2 X3 X4
100 10 10 0,1

У деяких випадках при виклику даної функції може виникнути виняткова ситуація. наприклад:

SELECT POWER (-100, 1/2) X2

FROM DUAL

В даному випадку проводиться спроба обчислення квадратного кореня від негативного числа, що призведе до виникнення помилки ORA-01428 «Аргумент поза діапазону».

Функція SQRT (n)

Ця функція повертає квадратний корінь від числа n. наприклад:

SELECT SQRT (100) X

FROM DUAL

Функції EXP (n) і LN (n)

Функція EXP зводить e в ступінь n, а функція LN обчислює натуральний логарифм від n (при цьому n повинно бути більше нуля). приклад:

SELECT EXP (2) X1, LN (1) X2, LN (EXP (2)) X3

функція NVL

Функція NVL, як правило, застосовується найчастіше. Функція отримує два параметри: NVL (expr1, expr2). Якщо перший параметр expr1 НЕ дорівнює NULL, то функція повертає його значення. Якщо перший параметр NULL, то замість нього функція повертає значення другого параметра expr2.

Розглянемо практичний приклад. Поле COMM в таблиці EMP може містити значення NULL. При виконанні запиту виду:

SELECT EMPNO, ENAME, COMM, NVL (COMM, 0) NVL_COMM

FROM SCOTT.EMP

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

EMPNO ENAME COMM NVL_COMM
7369 SMITH 0
7499 ALLEN 300 300
7521 WARD 500 500
7566 JONES 0
7654 MARTIN 1400 1400
7698 BLAKE 0
7782 CLARK 0
7839 KING 0
7844 TURNER 0 0
7900 JAMES 0
7902 FORD 0
7934 MILLER 0

Функція CEIL (n)

Функція CEIL повертає найменше ціле, більше або рівне переданому в якості параметра числа n. наприклад:

SELECT CEIL (100) X1, CEIL (-100) X2, CEIL (100.2) X3, CEIL (-100.2) X4

FROM DUAL

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

Функція TRUNC повертає число n, усеченное до m знаків після десяткового дробу. Параметр m може не вказуватися - в цьому випадку n усікається до цілого.

SELECT TRUNC (100.25678) X1, TRUNC (-100.25678) X2, TRUNC (100.99) X3,

TRUNC (100.25678, 2) X4

FROM DUAL

Функція SIGN (n)

Функція SIGN визначає знак числа. Якщо n позитивне, то функція повертає 1. Якщо негативне повертається -1. Якщо дорівнює нулю, то повертається 0. Наприклад:

SELECT SIGN (100.22) X1, SIGN (-100.22) X2, SIGN (0) X3

FROM DUAL

Цікавою особливістю даної функції є можливість передачі m рівного нулю при цьому не виникає помилки ділення на 0.

Функція POWER (n, m)

Функція POWER зводить число n в ступінь m. Ступінь може бути дробової і негативною, що істотно розширює можливості даної функції.

SELECT POWER (10, 2) X1, POWER (100, 1/2) X2,

POWER (1000, 1/3) X3, POWER (1000, -1/3) X4

FROM DUAL

X1 X2 X3 X4
100 10 10 0,1

У деяких випадках при виклику даної функції може виникнути виняткова ситуація. наприклад:

SELECT POWER (-100, 1/2) X2

FROM DUAL

В даному випадку проводиться спроба обчислення квадратного кореня від негативного числа, що призведе до виникнення помилки ORA-01428 «Аргумент поза діапазону».

Функція SQRT (n)

Ця функція повертає квадратний корінь від числа n. наприклад:

SELECT SQRT (100) X

FROM DUAL

Функції EXP (n) і LN (n)

Функція EXP зводить e в ступінь n, а функція LN обчислює натуральний логарифм від n (при цьому n повинно бути більше нуля). приклад:

SELECT EXP (2) X1, LN (1) X2, LN (EXP (2)) X3

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

вкладені функції

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

Function1 (parameter1, parameter2, ...) \u003d result

Заміна параметра функції на виклик іншої функції може привести до появи виразів виду

F1 (param1.1, F2 (param2.1, param2.2, F3 (param3.1)), param1.3)

Спочатку обчислюються вкладені функції перед тим як їх результати використовуються як вхідні значення для інших функцій. Функції обчислюються від найглибшого рівня вкладеності до самого верхнього зліва направо. Попереднє вираз виконується наступним чином

  1. Обчислюється функція F3 (param1) і повертається значення використовується як третій параметр для функції 2, назвемо його param2.3
  2. Потім обчислюється функція F2 (param1, param2.2, param2.3) і повертається значення використовується як другий параметр функції F1 - param1.2
  3. І нарешті обчислюється функція F1 (param1, param2, param1.3) і результат повертається в зухвалу програму.

Таким чином функція F3 знаходиться на третьому рівні вкладеності.

Розглянемо запит

select next_day (last_day (sysdate) -7, 'tue') from dual;

  1. У цьому запиті три функції, від нижнього рівня до верхнього - SYSDATE, LAST_DAY, NEXT_DAY. Запит виконується наступним чином
  2. Виконується сама вкладена функція SYSDATE. Вона повертає поточний системний час. Припустимо, що поточна дата 28 жовтня 2009 року
  3. Далі обчислюється результат функція другого рівня LAST_DAY. LAST_DATE ('28 -OCT-2009 ') повертає останній день окбября 2009 року, тобто значення 31 жовтня 2009.
  4. Потім відбувається вирахування з цієї дати семи днів - виходить 24 жовтня.
  5. І нарешті обчислюється функція NEXT_DAY ('24 -OCT-2009 ',' tue '), і запит повертає останній вівторок жовтня - що в нашому прикладі 27-OCT-2009.

Досить складно розбиратися і будувати складні вирази використовуючи багато вкладених викликів функцій, але це приходить з часом і практикою. Можна розбивати такі вирази на частини і тестувати окремо. Таблиця DUAL дуже корисно для тестування з.апросов і результатів виконання функцій. Можна тестувати і налагоджувати невеликі компоненти, які потім поєднувати в одне велике потрібне вираз.

функції розгалуження

Функції розгалуження, також відомі як ЯКЩО-ТО-ІНАКШЕ, використовується для визначення шляху виконання в залежності від будь-яких обставин. Функції розгалуження повертають різні результат базуючись не результаті обчислення умови. У групі таких функцій виділяють функції роботи зі значенням NULL: NVL, NVL2, NULLIF і COALESCE. І також загальні функції, представлені функцією DECODE і виразом CASE. Функція DECODE є Oracle функцією, тоді як CASE вираз присутній в стандарті ANSI SQL.

функція NVL

Функція NVL перевіряє значення стовпця або вираження будь-якого типу даних на значення NULL. Якщо значення NULL - вона повертає альтернативне НЕ-NULL значення за замовчуванням, інакше повертається вихідне значення.

У функції NVL два обов'язкових параметра і синтаксис NVL (original, ifnull) де original це початкове значення для перевірки і ifnull результат повертається функцією якщо original значення дорівнює NULL. Тип даних параметрів ifnull і original повинен бути сумісний. Тобто або тип даних повинен бути однаковим або повинна бути можливість неявній конвертації значень з одного типу в інший. Функція NVL повертає значення такого ж типу даних як тип даних параметра original. Розглянемо три запиту

Query 1: select nvl (-1234) from dual;

Query 2: select nvl (,-1234) from dual;

Query 3: select nvl (substr ( 'abc', 4), 'No substring exists') from dual;

Так як функції NVL необхідно два параметра, запит 1 поверне помилку ORA-00909: invalid number of arguments. Запит 2 поверне 1234 так як перевіряється значення NULL і воно дорівнює NULL. Запит три використовується вкладену SUBSTR функцію яка намагається виділити четвертий символ з рядка довжиною в три символи, повертає значення NULL, а функція NVL повертає рядок 'No sbustring exists'.

Функція NVL дуже корисна при роботі з числами. Вона використовується для конвертації NULL значень в 0, щоб арифметичні операції над числами не повертали NULL

функція NVL2

Функція NVL2 надає більше функціоналу ніж NVL, але служить також для обробки значення NULL. Вона перевіряє значення стовпця або вираження будь-якого типу на значення NULL. Якщо значення не дорівнює NULL, то вовзращается другий параметр, інакше повертається третій параметр, на відміну від функції NVL, яка в цьому випадку повертає початкове значення.

У функції NVL2 три обов'язкових параметра і синтаксис NVL2 (original, ifnot, ifnull), де original - це перевіряється значення, ifnotnull значення повертається в разі якщо original не дорівнює NULL і ifnull значення повертається в випадком якщо original одно NULL. Типи даних параметрів ifnotnull і ifnull повинен бути сумісні, і вони не можуть бути типу LONG. Тип даних, що повертаються функцією NVL2 дорівнює типу даних параметра ifnotnull. Розглянемо кілька прикладів

Query 1: select nvl2 (1234, 1, 'a string') from dual;

Query 2: select nvl2 (, 1234, 5678) from dual;

Query 3: select nvl2 (substr ( 'abc', 2), 'Not bc', 'No substring') from dual;

Параметра ifnotnull в запиті 1 це число, а параметр ifnull - це рядок. Так як типи даних несумісні, повертається помилка "ORA-01722: invalid number". Запит два повертає ifnull параметр, так як original одно NULL і результатом буде 5678. Запит три використовує функція SUBSTR яка повертає 'bc' і відбувається виклик NVL2 ( 'bc', 'Not bc', 'No substring') - який повертає ifnotnull параметр - 'Not bc'.

функція NULLIF

Функція NULLIF перевіряє два значення на ідентичність. Якщо вони однакові - повертається NULL інакше повертається перший параметр. У функції NULLIF два обов'язкових параметра і синтаксис NULLIF (ifunequal, comparison_item). Функція порівнює два параметра і якщо вони ідентичні - повертається NULL, інакше параметр ifunequal. Розглянемо запити

Query 1: select nullif (1234,-1234) from dual;

Запит один повертає NULL так як параметри ідентичні. Рядки в запиті 2 цієї статті не конвертуються в дату, а порівнюються як ланцюжки. Так як рядки різної довжини - повертається параметра ifunequal 24-JUL-2009.

На малюнку 10-4 функція NULLIF вкладена у функцію NVL2. У функції NULLIF в свою чергу використовуються функції SUBSTR і UPPER як частини вираження в параметрі ifunequal. Стовпець EMAIL порівнюється з цим виразом, повертається першу букву імені, об'єднану з прізвищем для співробітників у яких ім'я довжиною в 4 символи. Коли ці значення рівні, NULLIF поверне NULL, іначеніе поверне значення параметра ifunequal. Ці значення використовуються як параметр для функції NVL2. NVL2 в свою чергу повертає опис збігалися чи порівнювані елементи чи ні.

Малюнок 10-4 - Використання функції NULLIF

функція COALESCE

Функція COALESCE повертає перше значення не рівне NULL зі списку параметрів. Якщо всі параметри рівні NULL, то повертається NULL. У функції COALESCE два обов'язкових параметра і скільки завгодно необов'язкових параметрів і синтаксис COALESCE (expr1, expr2, ..., exprn) де результатом буде expr1 якщо значення expr 1не NULL, інакше результатом буде expr2 якщо воно не NULL і т.д. COALESCE одно за змістом вкладеним функцій NVL

COALESCE (expr1, expr2) \u003d NVL (expr1, expr2)

COALESCE (expr1, expr2, expr3) \u003d NVL (expr1, NVL (expr2, expr3))

Тип даних, що повертається значення якщо виявлено не NULL значення дорівнює типу даних Перший не NULL значення. Для того щоб уникнути помилки 'ORA-00932: inconsistent data types' все не NULL параметри повинні бути сумісні з першим не NULL параметром. Розглянемо три приклади

Query 1: select coalesce (, , , 'a string') from dual;

Query 2: select coalesce (, , null) from dual;

Query 3: select coalesce (substr ( 'abc', 4), 'Not bc', 'No substring') from dual;

Запит 1 повертає четвертий параметр: рядок, так як це перший НЕ NULL параметр. Запит два повертає NULL так як всі параметри дорівнюють NULL. Запит 3 обчислює перший параметр, отримує значення NULL і повертає другий параметр, так як він перший НЕ NULL параметр.

Параметри функції NVL2 можуть заплутати якщо ви вже знайомі з функцие NVL. NVL (original, ifnull) повертає original якщо значення НЕ NULL, інакше ifnull. NVL2 (original, ifnot, ifnull) повертає ifnotnull якщо значення original не дорівнює NULL інакше ifnull. Плутанина відбувається через те, що другий параметр функції NVL if, тоді як у NVL2 це ifnotnull. Так що не сподівайтеся на позицію параметра у функції.

функція DECODE

Функція DECODE реалізує if-then-else логіку перевіряючи перші два параметра на рівність і повертаючи третє значення в разі їх рівності або інше значення в разі нерівності. У функції DECODE три обов'язкових параметра і синтаксис DECODE (expr1, comp1, iftrue1,,). Ці параметри використовуються як показано в слеующем прикладі псевдокоду

IF expr1 \u003d comp1 then return iftrue1

Else if expr1 \u003d comp2 then return iftrue2

Else if exprN \u003d compN then return iftrueN

Else return NULL | iffalse;

Спочатку expr1 порівнюється з comp1. Якщо вони рівні повертається значення iftrue1. Якщо expr1 не дорівнює comp1, то що відбувається далі залежить від того задані параметри comp2 і iftrue2. Якщо задані, тов значення expr1 порівнюється з comp2. Якщо значення рівні, то повертається iftrue2. Якщо немає, то якщо є пари параметрів compN, iftrueN відбувається порівняння expr1 і compN і в разі равнества повертається iftrueN. Якщо не було знайдено збіг ні в одному наборі параметрів, то повертається або iffalse якщо цей параметр був заданий, або NULL.

Всі параметри в функції DECODE можуть бути виразами. Тип значення, що повертається дорівнює типу першого перевіряючого елемента - параметраcomp 1. Вираз expr 1 неявно перетвориться до типу даних параметра comp1. Всі інші доступні параметри comp1 ... compN також неявно перетворюються до типу comp1. DECODE розглядає значення NULL як рівне іншому значенню NULL, тобто якщо expr1 is NULL і comp3 is NULL, а comp2 НЕ NULL, то повертається значення iftrue3. Розглянемо кілька прикладів

Query 1: select decode (1234, 123, '123 is a match') from dual;

Query 2: select decode (1234, 123, '123 is a match', 'No match') from dual;

Query 3: select decode ( 'search', 'comp1', 'true1', 'comp2', 'true2', 'search', 'true3', substr ( '2search', 2, 6), 'true4', ' false ') from dual;

Запит один порівнює значення 1234 і 123. Так як вони не рівні то iftrue1 ігнорується і тому що не визначено значення iffalse то повертається NULL. Запит два ідентичний запитом 1 за тим винятком що значення iffalse визначено. Так як +1234 не дорівнює 123 то повертається iffalse - 'No match'. Запит три перевіряє значення параметрів на збіги значенням search. Параметри comp1 і comp2 нерівні 'search' тому результати iftrue1 і iftrue2 пропускаються. Збіг знайдено в третій операції порівняння елемента comp3 (позиція параметра 6) і повертається значення iftrue3 (параметр 7) що дорівнює 'true3'. Так як збіг знайдено більше обчислення не виробляються. Тобто незважаючи на те що значення comp4 (параметр 8) також збігається з expr1 - це вираз ніколи не розраховується так як збіг було знайдено в попередньому порівнянні.

вираз CASE

Всі мови програмування третього і четвертого покоління реалізують конструкцію case. Як і функція DECODE, вираз CASE дозволяє реалізовувати if-then-else логіку. Доступні два варіанти використання виразу CASE. Просте CASE вираз встановлює вихідний елемент для порівняння одного разу, а потім перераховує все необхідні умови перевірки. Складний (searched) CASE обчислює обидва оператора для кожного умови.

У вирази CASE три обов'язкових параметра. Синтаксис виразу залежить від типу. Для простого CASE вираження він виглядає так

CASE search_expr

WHEN comparison_expr1 THEN iftrue1

}

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму