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.