Create distinct type money as decimal (9,2);
ТИПЫ ДАННЫХ
В спецификации SQL:признаны пять предопределенных, общих типов, внутри которых могут быть подтипы:
строковый (символьный):
1. • CHARACTER (ИЛИ CHAR);
2. • CHARACTER VARYING (ИЛИ VARCHAR))
3. • CHARACTER LARGE ОВJЕСТ (ИЛИ CLOB);
ЧИСЛОВОЙ:
точные числовые типы:
1. INTEGER;
2. SMALLINT;
3. BIGINT;
4. NUMERIC;
5. DECIMAL;
приблизительные числовые типы:
1. REAL;
2. DOUBLE PRECISION;
3. FLOAT;
логический (булевский) — BOOLEAN;
даты-времени:
1. • DATE;
2. • TIME WITHOUT TIME ZONE;
3. • TIME WITH TIME ZONE;
4. •TIMESTAMP WITHOUT TIME ZONE;
5. TIMESTAMP WITH TIME ZONE;
интервальный.
Интервалы
YEAR — год;
MONTH — месяц;
DAY — день;
HOUR — час;
MINUTE — минута;
6. SECOND — секунда.
Кроме того, существуют особые типы:
Row (запись),
ARRAY (массив) и
MULTISET (мультимножество).
В следующем примере на основе типа ROW создается тип addr, а затем он назначается столбцу Адрес при создании таблицы клиенты.
CREATE ROW TYPE addr
( PostCode VARCHAR (9),
City VARCHAR (30),
Street VARCHAR (30),
House VARCHAR (10) );
CREATE TABLE клиенты
(ID_клиента INTEGER PRIMARY KEY,
Имя VARCHAR ( 2 5 ),
Адрес addr,
Телефон VARCHAR (15) );
Пример, в котором каждая ячейка столбца телефон может содержать до трех номеров телефона:
CREATE TABLE Клиенты (
ID_клиента INTEGER PRIMARY KEY,
Имя VARCHAR (2 5 ),
Адрес addr,
Телефон VARCHAR (15) ARRAY [3] );
Следующее SQL-выражение добавляет в таблицу клиенты новую запись и вводит в нее значения столбцов:
INSERT INTO Клиенты (Имя, Телефон)
VALUES ('Петров Петр Петрович', ('444-4444', '123-4567',
'777-8899'));
Пользовательские типы данных
(User Defined Types, UDT)
Отдельные типы
Синтаксис создания отдельного типа данных такой:
CREATE DISTINCT TYPE имяТипа AS определенныйТип;
Определим в качестве примера тип MONEYдля хранения денежных сумм. С этой целью можно воспользоваться уже определенным
числовым типомDECIMAL:
CREATE DISTINCT TYPE MONEY AS DECIMAL (9,2);
По аналогии с типом MONEY можно создать типы данных для различных валют, чтобы исключить возможность сравнения их просто как обычных чисел:
CREATE DISTINCT TYPE EURO AS DECIMAL (9,2);
CREATE DISTINCT TYPE USD AS DECIMAL (9,2);
CREATE DISTINCT TYPE RU AS DECIMAL (9,2);
Предположим, что курс доллара к рублю изменился, и мы хотим изменить цены в рублях. Если бы столбцы цена_USD и цена_RU были одного и того же типа, то данную операцию можно было бы выполнить с помощью следующего SQL-выражения:
UPDATE Прайс_лист SET Цена_RU = k * Цена_USD
Здесь k — коэффициент конвертации.
Но поскольку столбцы цена_USD и цена_RU имеют различные типы, то необходимо выполнить такое выражение:
UPDATE Прайс_лист
SET CAST(Цена_RU AS DECIMAL (9,2) = k * CAST(Цена_USD
AS DECIMAL (9,2));
Структурированные типы
При создании структурированного типа СУБД автоматически создает для него три функции:
· функцию-конструктор с именем, совпадающим с именем создаваемого типа;
· функцию-мутатор, с помощью которой можно изменить значение атрибута создаваемого типа;
· функцию-наблюдатель, позволяющую узнать значение атрибута создаваемого типа.
.
Рассмотрим пример, в котором создаются некий тип и его подтип данных, таблица со столбцом созданного типа, а также блок операторов SQL, которые производят изменения данных в таблице. Вначале создадим тип данных Book, содержащий сведения (атрибуты) о книгах, затем создадим его подтип myBooks, который наследует атрибуты своего супертипа Books.
CREATE TYPE Books AS
Title CHAR (50),
Author CHAR (20),
Publisher CHAR (20),
Year INTEGER,
Volume INTEGER,
N0T FINAL;
Здесь в типе Books (книги) определяются атрибуты (имена и типы данных):
Title (наименование), Author (автор), Publisher (издательство), Year (год издания), Volume (количество страниц). Ключевые слова N0T FINAL (не конец) означают, что данный тип имеет хотя бы один подтип.
Определим подтип myBooks для хранения данных, например, о моих любимых книгах:
CREATE TYPE myBooks UNDER Books FINAL;
По-русски это выглядит как:
СОЗДАТЬ ТИП myBooks ПОД Books ЗАКОНЧИТЬ;
Создадим таблицу, которая использует тип myBooks
CREATE TABLE Книги
(
Книга myBooks,
Цена NUMERIC (6,2)
);
Теперь добавим новые записи в созданную таблицу книги.
BEGlN
DECLARE хmyBooks; /* объявление переменной х типа myBooks*/
SET х =myBooks(); /* Вьполняем функцию-конструктор */ /* Вызов функций-мутаторов */
SET х = х.Title('HTML,скрипты и стили');
SET х =х .Author('Дунаев Вадим');
SET х =х.Publisher('БХВ-Петербург');
SET х =х.Year(2005);
SET х.Volume(832);
/* Добавление новой записи с установкой значений столбцов */ INSERT INTO книги (х,350.50);
END;
Здесь ключевые слова BEGIN (начало) и END (конец)
В следующем примере из таблицы Клиенты выбираются все записи, в которых не определено имя клиента:
SELECT * FROM Клиенты WHEREИМЯ IS NULL;
Преобразование типов
Чтобы выполнить какую-либо операцию над данными различных типов, необходимо сделать преобразование типов. Точнее, необходимо выполнить приведение данных одного типа к другому типу, чтобы участвующие в операции данные были либо однотипными, либо их типы были соответствующими. Соответствующими типами являются:
· строковые CHARACTER и CHARACTER VARYING;
· все числовые типы;
· дата, время, дата-время и соответствующие интервалы. Соответствующие типы не обязательно приводить друг к другу. Приведение значения одного типа к другому осуществляется
с помощью функции CAST ():
CAST (выражение AS тип);
Например:
CAST ('1234.52' AS NUMERIC (9, 2) );
CAST ('2005-10-03 ' AS DATE);
CAST (CURRENT TIMESTAMP (2) AS CHAR (20) );
· SELECT 'Цена: ' || CAST (Цена AS CHAR(5) ) FROM Продажи;
· В последнем примере пара вертикальных черт означает операцию конкатенации строк.
Основное SQL-выражение для выборки данных
· Чтобы выбрать из таблицы базы данных требуемые записи, следует, по крайней мере, указать столбцы и имя этой таблицы. Это требование было бы естественно сформулировать так: