
- •Работа с таблицами в системе управления базами данных oracle
- •Типы данных Oracle
- •Строки символов
- •Числовые типы
- •Двоичные данные
- •Дата и время
- •Преобразование типов данных
- •Правила сравнения типов данных
- •Значения Null
- •Псевдостолбцы
- •Объекты базы данных
- •Создание таблиц
- •Ограничения для таблиц и столбцов
- •Alter table
- •Удаление таблицы
- •Ввод данных в таблицы
- •Удаление таблицы
- •Представление
- •Индексы
- •Create sequence
- •Create synonym
- •Индексы
- •Работа с индексами
- •Явные и неявные индексы
- •Изменение индекса
- •Удаление индексов
- •Битовые индексы
- •Кластеры
- •Создание кластеров
- •Удаление кластеров
Преобразование типов данных
Фразы WHERE и выражения (булевские, арифметические или строчные) могут использовать при сравнении данные различных типов. В этих случаях для выполнения оператора ORACLE обязательно использует преобразование данных. В следующих примерах ORACLE автоматически выполнит необходимые преобразования данных:
SELECTENAMEFROMEMPWHEREENAME= 135
SELECT ENAME FROM EMP WHERE EMPNO = '7936'
SELECT ENAME FROM EMP WHERE HIREDATE = '12-MAR-86'
SELECT ENAME FROM EMP WHERE ROWID = '00002514.0001.0001'
Для выполнения преобразования ORACLE может:
* преобразовать константу в тип данных столбца
* преобразовать значение столбца к типу данных константы
* преобразовать тип данных столбца к типу данных другого столбца.
Для преобразования используются функции TO_NUMBER,TO_DATETO_CHAR.
Преобразования данных являются контекстно-зависимыми, поэтому нельзя ожидать, что во всех случаях будет выполняться тот же вид преобразования. Вместо того, чтобы полагаться на неявные или автоматические преобразования, необходимо указывать явные преобразования, обеспечиваемые функциями SQL. Это диктуется следующими соображениями:
* если применяются функции явного преобразования, SQL - операторы становятся проще для понимания;
* автоматическое преобразование данных может негативно влиять на производительность, особенно если столбец преобразовывается к типу данных константы;
* алгоритмы неявного преобразования могут меняться от версии к версии и от одного продукта ORACLE к другому и, следовательно, поведение явных преобразований более предсказуемо.
Правила сравнения типов данных
Для положительных чисел сравнение обычное. Все отрицательные числа "меньше" положительных. Таким образом: -1 меньше 100, а -100 меньше чем -1.
Более поздняя дата рассматривается "больше", чем более ранняя. Например, '29-MAR-88' "меньше" чем '05-JAN-89', а '1:35pm' больше чем '10:09am'.
Для символьных данных значения сравниваются символ за символом, пока не обнаружится несовпадение. Какая строка имеет больший символ в этой позиции, та и считается "больше". Если две строки одинаковы по всем символам более короткой строки, то более длинная считается больше.
Символы сравниваются в соответствии с "последовательностью слияния" компьютера, на котором работает ORACLE. Один символ больше другого, если он находится после него в последовательности слияния.
ORACLE использует последовательность слияния своего компьютера. Буквы верхнего и нижнего регистров не эквивалентны. В ASCII все буквы нижнего регистра больше всех букв нижнего, для EBCDIC верно обратное.
В ASCII символьные литералы от '0' до '9' сортируются ниже алфавита, для EBCDIC также верно обратное.
Значения Null
Если в определенном столбце строки данные отсутствуют, говорят что его значение null. Столбец с данными любого типа может содержать значение null, если только он специально не описан как NOT NULL в момент создания.
Значение null обладает следующими свойствами:
* присваивается, когда действительное значение неизвестно или бессмысленно;
* не эквивалентно значению нуль;
* будет превращать в null любое выражение. Например NULL множенное на 10 дает NULL.
Для временного преобразования null в действительное значение используется функция NVL. Например NVL(COMM,0) возвращает 0, если значение в столбце COMM – null, и действительное значение, если оно не null.
Большинство групповых функций игнорирует значения null. Например запрос, вычисляющий среднее из пяти значений: 1000, NULL, NULL, NULL, 2000 возвратит 1500, так как (1000+2000)/2 =1500.
Напрямую со значениями null должны работать только операции сравнения (IS NULL или IS NOT NULL). Если со значением null используется любой другой оператор, результат всегда неизвестный. Так как NULL представляет собой отсутствие данных, он не может быть равен или не равен любому другому значению, кроме null.
ORACLE трактует условия, приводящие к неизвестному результату как FALSE. Например, если условие COMM = NULL всегда неизвестно, оператор SELECT с этим условием во фразе WHERE не будет возвращать ни одной строки. Заметьте, что в такой ситуации ORACLE не возвращает сообщение об ошибке.
Следующая таблица показывает результаты сравнений со значением null:
-
10
10
NULL
NULL
10
10
NULL
NULL
IS NULL
IS NOT NULL
IS NULL
IS NOT NULL =NULL !=NULL =NULL !=NULL
FALSE
TRUE
TRUE
FALSE
неизвестный
неизвестный
неизвестный
неизвестный