Типы данных (только актуальные)

 

1. Посмотреть все доступные типы:

SELECT * FROM All_objects WHERE object_type LIKE '%TYPE%';

2. Символьные: CHAR (2000), VARCHAR2 (4000), NCHAR, NVARCHAR2, CLOB (128Tb), NCLOB:

 

Создадим таблицу с двумя полями разных подтипов символьного типа данных, заполним ее строками:

CREATE TABLE Test_char(

employee_name VARCHAR2(25)

,job CHAR(25));

INSERT INTO Test_char (employee_name, job)

VALUES ('Vasia', 'engineer');

INSERT INTO Test_char (employee_name, job)

VALUES ('Petia', 'manager');

COMMIT;

 

После команды «коммит» результаты запроса зафиксируются в БД. Попробуем получить данные из таблицы, сначала сами по себе, а затем промаркированные следующим образом:

'engineer' - 'инженер', 'manager' - 'менеджер', по умолчанию - 'рабочий'

 

SELECT employee_name, job

FROM Test_char;

SELECT employee_name

,job

,DECODE(job, 'engineer', 'инженер', 'manager', 'менеджер', 'рабочий')

FROM Test_char;

 

Запрос сформирован без синтаксических ошибок, почему тогда все сотрудники промапились как рабочий? Почему результат получится другим, если запрос доработать показанным ниже образом?

 

SELECT employee_name

,job

,DECODE(TRIM(job), 'engineer', 'инженер', 'manager', 'менеджер', 'рабочий') AS job

FROM Test_char;

 

Убедимся, что вариант по умолчанию тоже работает:

 

INSERT INTO Test_char (employee_name, job)

VALUES ('John', '');

Если подлежащих выводу данных предполагается большое количество и/или количество пар значений большое, следует использовать более современную и оптимальную конструкцию:

 

SELECT employee_name

,job

,CASE

WHEN TRIM(job) = 'engineer' THEN 'инженер'

WHEN TRIM(job) = 'manager' THEN 'менеджер'

ELSE 'рабочий'

END AS "Должность"

FROM Test_char

ORDER BY "Должность" ASC;

 

3. NUMBER (38,0) – (максимальное число знаков, число знаков после запятой), BINARY_FLOAT, BINARY_DOUBLE, SIMPLE_INTEGER (разные способы упаковки дают разное изменение занимаемого объема памяти).

В каких ситуациях лучше использовать типы с динамическим размером, и в каких – со статическим?

 

CREATE TABLE Test_char_number(

c CHAR(1000)

, v VARCHAR2(1000)

, n NUMBER

, d binary_double

, f binary_float);

 

INSERT INTO Test_char_number VALUES ('1', '1', 1, 1, 1);

INSERT INTO Test_char_number VALUES ('10', '10', 10, 10, 10);

INSERT INTO Test_char_number VALUES ('100', '100', 100, 100, 100);

INSERT INTO Test_char_number VALUES ('1000', '1000', 1000, 1000, 1000);

INSERT INTO Test_char_number VALUES ('10000', '10000', 10000, 10000, 10000);

 

INSERT INTO Test_char_number VALUES ('100000000', '100000000', 100000000, 100000000, 100000000);

 

INSERT INTO Test_char_number VALUES ('100000001', '100000001', 100000001, 100000001, 100000001);

 

COMMIT;

 

SELECT c, VSIZE(c), VSIZE(v), VSIZE(n), VSIZE(d), VSIZE(f)

FROM Test_char_number;

 

4. Преобразования число-строка и обратно:

 

SELECT TO_CHAR(100500) FROM Dual;

SELECT TO_NUMBER('100500') FROM Dual;

 

SELECT TO_CHAR(100500) || 100500 FROM Dual;

SELECT TO_NUMBER('100500') + 100500 FROM Dual;

 

SELECT 100500 || 100500 FROM Dual;

SELECT '100500' + 100500 FROM Dual;

 

5. Дата и время: Date – всегда 7B в памяти, по умолчанию – в формате DD-MON-YY НН:МM:SS поддерживает арифметические операции, INTERVAL YEAR TO MONTH и INTERVAL DAY TO SECOND – интервалы времени (после переключения культуры сиквел сервера верните прежнюю настройку):

 

CREATE TABLE Test_date_interval(

d DATE

, iytm INTERVAL YEAR TO MONTH

, idts INTERVAL DAY TO SECOND);

INSERT INTO Test_date_interval (d, iytm, idts)

VALUES (SYSDATE, INTERVAL '3'YEAR, INTERVAL '5'MINUTE);

COMMIT;

INSERT INTO Test_date_interval (d, iytm, idts)

VALUES (SYSDATE, INTERVAL '3-2'YEAR TO MONTH, INTERVAL '6 2:10:5'DAY TO SECOND);

COMMIT;

--ROLLBACK;

SELECT * FROM Test_date_interval;

----------

ALTER SESSION SET NLS_TERRITORY=AMERICA;

ALTER SESSION SET NLS_LANGUAGE=AMERICAN;

SELECT TO_CHAR(SYSDATE) FROM Dual;

SELECT TO_CHAR(SYSDATE, 'day, Month, Year') FROM Dual;

 

6. Двоичные данные: RAW – до 2Kb, BLOB – до 4Gb (значения действительно физически хранятся в таблице РБД);

 

7. Адрес строки ROWID – не устанавливается вручную, но можно прочесть. Для выполнения приведенного ниже запроса предварительно создайте три таблицы из сценария «Учебная БД для IBM DB2». Попробуйте выполнить сценарий их заполнения (из того же файла). В чем проблема? Обратите внимание на переключение настройки культуры из пункта 5. Когда строки все же будут вставлены, выполните запрос:

 

SELECT dname, rowid FROM Dept;

 

8. Номер последней транзакции, в которой менялось содержимое строки:

 

SELECT dname, ora_rowscn FROM Dept;

 

9. Значение NULL (неопределенность), не имеющее типа. Обратите внимание, какой результат дает сложение этого значения со значением некоторого типа данных:

 

CREATE TABLE Test_null(

employee_name VARCHAR2(50)

,salary NUMBER

,commision NUMBER);

INSERT INTO Test_null (employee_name, salary, commision)

VALUES ('Vasia', 5000, 1000);

INSERT INTO Test_null (employee_name, salary)

VALUES ('Petia', 5000);

COMMIT;

SELECT employee_name, salary + commision AS salary_sum

FROM Test_null;

SELECT employee_name, salary + nvl(commision, 0) AS salary_sum

FROM Test_null;

SELECT employee_name

,nvl2(commision, 'Получает' || commision, 'Не получает') AS commision

FROM Test_null;

 

10.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: