Тип данных rowid oracle

Обновлено: 04.07.2024

Каждое значение, которым манипулирует база данных Oracle, имеет тип данных. Тип данных значения связывает фиксированный набор свойств со значением. Используя эти свойства, Oracle обрабатывает значения одного типа данных иначе, чем значения другого. Например, вы можете добавить значения типа данных NUMBER, но не значения типа данных CHAR.

База данных Oracle предоставляет ряд встроенных типов данных, а также несколько категорий для пользовательских типов, которые могут использоваться в качестве типов данных.

Встроенные типы данных Oracle

В следующей таблице приведены встроенные типы данных Oracle.

Типы Описание Размер
VARCHAR2 (размер [BYTE | CHAR]) Строка символов переменной длины. От 1 байта до 4КБ.
NVARCHAR2 (размер) Строка символов Unicode переменной длины, имеющая символы максимального размера. Максимальный размер определяется национальным набором символов с верхним пределом 4000 байтов. Вы должны указать размер для NVARCHAR2.
NUMBER [(p [, s])] Число с точностью p и шкалой s.
Диапазон р: от 1 до 38.
Диапазоны s: от -84 до 127.
Точность и масштаб указаны в десятичных цифрах.
Значение NUMBER требует от 1 до 22 байтов.
FLOAT [(p)] Значение FLOAT внутренне представлено как NUMBER.
Диапазон значений p: от 1 до 126 двоичных цифр.
Значение FLOAT требует от 1 до 22 байтов.
ДОЛГО Символьные данные переменной длины до 2 гигабайт, используемые для обратной совместимости. 2 31 -1 байт
ДАТА Действительный диапазон дат: с 1 января 4712 г. до н.э. до 31 декабря 9999 г. н.э.
Формат по умолчанию определяется явно параметром NLS_DATE_FORMAT или неявно параметром NLS_TERRITORY.
Размер фиксируется в 7 байтов.
BINARY_FLOAT 32-битное число с плавающей точкой. Этот тип данных требует 4 байта.
BINARY_DOUBLE 64-битное число с плавающей запятой. Этот тип данных требует 8 байтов.
TIMESTAMP [(fraal_seconds_precision)] Этот тип данных содержит поля даты и времени YEAR, MONTH, DAY, HOUR, MINUTE и SECOND. Он содержит доли секунды, но не имеет часового пояса. Размер составляет 7 или 11 байт, в зависимости от точности.
TIMESTAMP [(фракция_seconds_precision)] с зоной времени Этот тип данных содержит поля даты и времени YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR и TIMEZONE_MINUTE. У него есть доли секунды и явный часовой пояс. Размер фиксируется в 13 байт.
ИНТЕРВАЛЬНЫЙ ГОД [(year_precision)] ДО МЕСЯЦА Сохраняет период времени в годах и месяцах, где year_precision - это количество цифр в поле YEAR datetime.
Допустимые значения: от 0 до 9. По умолчанию установлено значение 2.
Размер фиксируется в 5 байтах.
ИНТЕРВАЛЬНЫЙ ДЕНЬ [(day_precision)] ДО ВТОРОГО [(фракция_презентация_precision)] Сохраняет период времени в днях, часах, минутах и секундах, где
day_precision - это максимальное количество цифр в поле DAY datetime.
Допустимые значения: от 0 до 9. По умолчанию установлено значение 2.
Размер фиксируется в 11 байтов.
RAW (размер) Необработанные двоичные данные байтов размера длины. Максимальный размер 2000 байт
ДЛИННАЯ СЫРЬЯ Необработанные двоичные данные переменной. Размер до 2 гигабайт.
ROWID Уникальный адрес (представляющий строку из 64 строк) строки в ее таблице.
UROWID [(размер)] Логический адрес строки (представляющей строку из 64 строк) организованной по индексу таблицы. Максимальный размер и значение по умолчанию составляет 4000 байтов.
CHAR [(размер [BYTE | CHAR])] Символьные данные фиксированной длины размером в байтах или символах. Максимальный размер составляет 2000 байтов или символов. Минимальный размер по умолчанию - 1 байт.
NCHAR [(размер)] Данные символа фиксированной длины символов размера длины. Количество байтов может быть в два раза больше для кодирования AL16UTF16 и в три раза больше для кодирования UTF8. Максимальный размер определяется национальным набором символов с верхним пределом в 2000 байтов. Минимальный размер по умолчанию - 1 символ.
CLOB Большой символьный объект, содержащий однобайтовые или многобайтовые символы. Максимальный размер (4 гигабайта - 1) * (размер блока базы данных).
NCLOB Большой символьный объект, содержащий символы Юникода. Максимальный размер (4 гигабайта - 1) * (размер блока базы данных). Хранит данные национального набора символов.
большой двоичный объект Большой двоичный объект. Максимальный размер 4 гигабайта.
BFILE Содержит локатор для большого двоичного файла, хранящегося за пределами базы данных. Максимальный размер 4 гигабайта.

Типы данных персонажей Oracle

Тип данных CHAR определяет символьную строку фиксированной длины. Если вы вставите значение, которое короче длины столбца, Oracle пустым образом подставит значение в длину столбца, а если значение слишком длинное для столбца, Oracle вернет ошибку. Следующие типы данных используются для символьных данных:

Тип данных Oracle NUMBER

НОМЕР Тип данных:

Тип данных NUMBER хранит нулевые, положительные и отрицательные фиксированные числа.

Числовой формат с фиксированной точкой:

  • Где p - точность, до 20 цифр от 100 до 100, что эквивалентно 39 или 40 десятичным знакам в зависимости от положения десятичной точки.
  • s - масштаб, масштаб может варьироваться от -84 до 127.
  • Положительная шкала - это число значащих цифр справа от десятичной точки и включая наименее значимую цифру.
  • Отрицательная шкала - это число значащих цифр слева от десятичной точки, но не включая наименее значимую цифру.

Примеры:

Тип данных FLOAT:

Тип данных FLOAT является подтипом NUMBER. Вы можете указать это с точностью или без. Масштаб не может быть указан, но интерпретируется из данных. Каждое значение FLOAT требует от 1 до 22 байтов.

В следующем примере показана разница между NUMBER и FLOAT:

В приведенном выше примере возвращаемое значение FLOAT не может превышать 5 двоичных цифр. Таким образом, 123,45 округляется до 120, который имеет только две значащие десятичные цифры, требующие только 4 двоичных цифр.

Числа с плавающей точкой:

Термин с плавающей запятой происходит от того факта, что не существует фиксированного количества цифр до и после десятичной точки; то есть десятичная точка может плавать. Показатель степени может необязательно использоваться после числа для увеличения диапазона, например, 1.777 e -20 .

Пример:

В базе данных Oracle есть два числовых типа данных исключительно для чисел с плавающей запятой:

BINARY_FLOAT:
BINARY_FLOAT - это 32-битный тип данных с плавающей запятой с одинарной точностью. Каждое значение BINARY_FLOAT требует 4 байта.

BINARY_DOUBLE:
BINARY_DOUBLE - это 64-битный тип данных с плавающей запятой с двойной точностью. Каждое значение BINARY_DOUBLE требует 8 байтов.

Примеры:

Значение BINARY_FLOAT BINARY_DOUBLE
Максимальное положительное конечное значение 3.40282E + 38F 1.79769313486231E + 308
Минимальное положительное конечное значение 1.17549E-38F 2.22507485850720E-308

ДОЛГОЙ Тип данных
Используйте столбцы LOB (CLOB, NCLOB, BLOB), поскольку столбцы LONG поддерживаются только для обратной совместимости.

В столбцах LONG хранятся строки символов переменной длины, содержащие до 2 гигабайт -1 или 2 31 -1 байтов. Длинные столбцы имеют многие характеристики столбцов VARCHAR2. Вы можете использовать длинные столбцы для хранения длинных текстовых строк. Длина значений LONG может быть ограничена объемом памяти, доступной на вашем компьютере. ДЛИННЫЕ литералы формируются, как описано для «Текстовых литералов».

Типы данных даты и времени

Ниже приведены типы данных datetime:

  • ДАТА
  • TIMESTAMP
  • TIMESTAMP с зоной времени
  • TIMESTAMP с локальной зоной времени

Значения типов данных datetime иногда называют datetime.

Поля даты и значения:

Поле даты и времени Допустимые значения для даты и времени Допустимые значения для INTERVAL
ГОД От -4712 до 9999 (исключая год 0) Любое положительное или отрицательное целое число
МЕСЯЦ 01 до 12 От 0 до 11
ДЕНЬ С 01 по 31 (ограничено значениями MONTH и YEAR в соответствии с правилами текущего параметра календаря NLS) Любое положительное или отрицательное целое число
ЧАС От 00 до 23 От 0 до 23
МИНУТЫ От 00 до 59 От 0 до 59
ВТОРОЙ От 00 до 59,9 (n), где 9 (n) - это точность долей времени в секундах. 9 (n) часть не относится к DATE. От 0 до 59,9 (n), где 9 (n) - точность интервала долей секунд
TIMEZONE_HOUR От -12 до 14 (этот диапазон учитывает изменения летнего времени.) Неприменимо для DATEor TIMESTAMP. Непригодный
TIMEZONE_MINUTE От 00 до 59. Не применимо для даты или времени. Непригодный
TIMEZONE_REGION Запросите столбец TZNAME представления словаря данных V $ TIMEZONE_NAMES. Не применимо для DATE или TIMESTAMP. Непригодный
TIMEZONE_ABBR Запросите столбец TZABBREV представления словаря данных V $ TIMEZONE_NAMES. Не применимо для DATE или TIMESTAMP. Непригодный

ДАТА Тип данных:

Тип данных DATE хранит информацию о дате и времени (представленную как символьными, так и числовыми типами данных). Для каждого значения DATE Oracle хранит год, месяц, день, час, минуту и секунду.

Используя юлианские дни:

Юлианский номер дня - это количество дней с 1 января 4712 года до нашей эры. Вы можете использовать модель формата даты "J" с функциями даты TO_DATE и TO_CHAR для преобразования между значениями Oracle DATE и их юлианскими эквивалентами.

Значения даты по умолчанию:

  • Год - это текущий год, возвращаемый SYSDATE.
  • Месяц является текущим месяцем, возвращаемым SYSDATE.
  • День 01 (первый день месяца).
  • Час, минута и секунда - все 0.

Функция TO_DATE преобразует символьное или числовое значение в дату.

Вы можете использовать модель формата даты "J" с функциями даты TO_DATE и TO_CHAR для преобразования между значениями Oracle DATE и их юлианскими эквивалентами. Следующий оператор возвращает юлианский эквивалент 1 января 2015 года:

Тип данных TIMESTAMP:
Тип данных TIMESTAMP является расширением типа данных DATE и хранит год, месяц и день типа данных DATE, а также значения часов, минут и секунд. Это полезно для хранения точных значений времени, а также для сбора и оценки информации о дате по географическим регионам.

TIMESTAMP с временной зоной Тип данных:
TIMESTAMP WITH TIME ZONE - это вариант TIMESTAMP, который включает в себя имя региона часового пояса или смещение часового пояса в своем значении. Это полезно для сохранения информации о часовом поясе.

TIMESTAMP с локальной зоной времени Тип данных:

TIMESTAMP с локальной зоной времени - еще один вариант TIMESTAMP, чувствительный к информации о часовых поясах. Он отличается от TIMESTAMP WITH TIME ZONE тем, что данные, хранящиеся в базе данных, нормализуются к часовому поясу базы данных, а информация о часовом поясе не сохраняется как часть данных столбца. Когда пользователь получает данные, Oracle возвращает их в часовом поясе локального сеанса пользователя. Этот тип данных полезен для информации о дате, которая всегда должна отображаться в часовом поясе клиентской системы в двухуровневом приложении.

ИНТЕРВАЛ ГОДА В МЕСЯЦ Тип данных:

ИНТЕРВАЛ ГОДА В МЕСЯЦ хранит период времени, используя поля даты и года ГОД и МЕСЯЦ. Этот тип данных полезен для представления разницы между двумя значениями даты и времени, когда значимы только значения года и месяца.

ДЕНЬ ИНТЕРВАЛА ДЛЯ ВТОРОГО Типа данных:

INTERVAL DAY TO SECOND хранит период времени в виде дней, часов, минут и секунд. Этот тип данных полезен для представления точной разницы между двумя значениями даты и времени.

  • day_precision - количество цифр в поле даты и времени DAY. Допустимые значения: от 0 до 9. По умолчанию установлено значение 2.
  • fraal_seconds_precision - количество цифр в дробной части поля ВРЕМЯ datetime. Допустимые значения: от 0 до 9. По умолчанию установлено значение 6.

Типы данных ANSI, DB2 и SQL / DS

Oracle распознает имя типа данных ANSI или IBM, которое отличается от имени типа данных Oracle Database, и преобразует тип данных в эквивалентный тип данных Oracle. Следующая таблица показывает конверсии :,

Тип данных ANSI SQL Тип данных Oracle
СИМВОЛЫ (п)
СИМ (п)
СИМ (п)
VARING CHARACTER (n)
CHAR VARYING (n)
VARCHAR2 (п)
НАЦИОНАЛЬНЫЙ ХАРАКТЕР (n)
НАЦИОНАЛЬНЫЙ ЧАР (n)
NCHAR (п)
NCHAR (п)
НАЦИОНАЛЬНЫЙ ХАРАКТЕР ИЗМЕНЕНИЯ (n)
НАЦИОНАЛЬНЫЙ ЧАР ВАРЬИНГ (н)
NCHAR VARYING (n)
NVARCHAR2 (п)
ЧИСЛОВОЙ [(P, S)]
DECIMAL [(p, s)] (примечание 1)
НОМЕР (р, с)
INTEGER
INT
SMALLINT
НОМЕР (р, 0)
FLOAT (примечание 2)
ДВОЙНАЯ ТОЧНОСТЬ (Примечание 3)
РЕАЛЬНО (Примечание 4)
ПОПЛАВКОВЫЕ (126)
ПОПЛАВКОВЫЕ (126)
ПОПЛАВКОВЫЙ (63)

Типы, предоставляемые Oracle

Oracle предоставляет некоторые новые типы данных, которых нет во встроенных или поддерживаемых ANSI типах. Эти типы могут быть реализованы в C / C ++, Java или PL / SQL. Вот подробности:

Любые типы:
Типы Any обеспечивают очень гибкое моделирование параметров процедуры и столбцов таблицы, где фактический тип неизвестен. Эти типы данных позволяют динамически инкапсулировать и получать доступ к описаниям типов, экземплярам данных и наборам экземпляров данных любого другого типа SQL. Эти типы имеют интерфейсы OCI и PL / SQL для создания и доступа.

Типы XML:
Этот тип, предоставляемый Oracle, можно использовать для хранения и запроса данных XML в базе данных. XMLType имеет функции-члены, которые вы можете использовать для доступа, извлечения и запроса данных XML с использованием выражений XPath. XMLType является системным типом, поэтому вы можете использовать его как аргумент функции или как тип данных таблицы или столбца представления. Вы также можете создавать таблицы и представления XMLType. Когда вы создаете столбец XMLType в таблице, вы можете сохранить данные XML в столбце CLOB, как двоичный XML (хранящийся внутри как CLOB), или как объект реляционного типа.

Типы данных URI

Пространственные типы

Oracle Spatial разработан, чтобы сделать управление пространственными данными более простым и естественным для пользователей приложений с поддержкой определения местоположения, приложений геоинформационных систем (ГИС) и приложений геоизображения. После того, как пространственные данные сохранены в базе данных Oracle, вы можете легко манипулировать ими, извлекать и связывать их со всеми другими данными, хранящимися в базе данных. Следующие типы данных доступны, только если вы установили Oracle Spatial.

Тип данных Описание
SDO_GEOMETRY Геометрическое описание пространственного объекта хранится в одной строке, в одном столбце типа объекта SDO_GEOMETRY в пользовательской таблице. Любая таблица, имеющая столбец типа SDO_GEOMETRY, должна иметь другой столбец или набор столбцов, определяющих уникальный первичный ключ для этой таблицы. Таблицы такого рода иногда называют таблицами геометрии.
SDO_TOPO_GEOMETRY Этот тип описывает геометрию топологии, которая хранится в одной строке в одном столбце типа объекта SDO_TOPO_GEOMETRY в пользовательской таблице.
SDO_GEORASTER В объектно-реляционной модели GeoRaster растровая сетка или объект изображения хранятся в одной строке в одном столбце типа объекта SDO_GEORASTER в пользовательской таблице. Таблицы такого типа называются таблицами GeoRaster.

Типы СМИ

Oracle Multimedia использует типы объектов, подобные классам Java или C ++, для описания мультимедийных данных. Экземпляр этих типов объектов состоит из атрибутов, включая метаданные и медиаданные, а также методов. Мультимедийные типы данных создаются в схеме ORDSYS. Публичные синонимы существуют для всех типов данных, поэтому вы можете получить к ним доступ без указания имени схемы.
Oracle Multimedia предоставляет следующие типы объектов:

Тип данных Описание
ORDAudio Поддерживает хранение и управление аудиоданными.
ORDDicom Поддерживает хранение и управление цифровыми изображениями и коммуникациями в медицине (DICOM), формат, общепризнанный в качестве стандарта для медицинских изображений.
ORDDoc Поддерживает хранение и управление медиа-данными любого типа, включая аудио, изображения и видео. Используйте этот тип, если вы хотите, чтобы все мультимедиа хранились в одном столбце.
ORDImage Поддерживает хранение и управление данными изображения.
ORDVideo Поддерживает хранение и управление видеоданными.
ORDImageSignature Тип объекта ORDImageSignature устарел и больше не должен вводиться в ваш код. Существующие вхождения этого типа объекта будут продолжать функционировать как в прошлом.

Тип объекта ORDImageSignature устарел и больше не должен вводиться в ваш код. Существующие вхождения этого типа объекта будут продолжать функционировать как в прошлом.

Предыдущая: Oracle Home
Далее: Литералы

Я нашел, что он применяется для быстрого удаление дубликатов записей в таблице:

Подскажите, как еще можно использовать это свойство? Или это больше не практическое, а теорическое свойство для понимания устройства БД?


50.3k 153 153 золотых знака 54 54 серебряных знака 211 211 бронзовых знаков 503 1 1 золотой знак 5 5 серебряных знаков 17 17 бронзовых знаков По идее, использовать ROWID в голом виде это тыкать пальцем в БД, не зная, куда именно. Правильно использовать поля структуры таблицы для работы с БД, иначе можно поломать её целостность вплоть до необходимости поднимать из бэкапа и выплачивать отступные.

ROWID - это физический адрес строки, поэтому доступ к строке по ее ROWID является наиболее быстрым способом.

ROWID уникален для каждой строки, поэтому его можно использовать в качестве суррогатного первичного ключа в различных запросах. Oracle гарантирует, что пока строка существует ее ROWID не изменится.

Но, постоянно полагаться на ROWID в качестве первичного ключа опасно.
Во-первых, строка может перемещаться (delete+insert) в результате различных действий (импорт\экспорт, перемещение строки в секционированной таблице при изменении значения ее колонок входящих в ключ секционирования, перемещение таблицы (alter table move), сжатии таблицы (alter table shrink) и т.п.).

Во-вторых, после удаления строки ее ROWID может быть переприсвоен какой-либо новой строке.


3,727 1 1 золотой знак 16 16 серебряных знаков 26 26 бронзовых знаков

ROWID -- это псевдоколонка. Она имеет одноимённый тип данных, их не следует путать.
В SQL запросе эта псевдоколонка возвращает адрес записи, служащий для её локализации.

Основные применения значений псевдоколонки ROWID :

  • Обеспечивают самый быстрый путь доступа к записи.
  • Дают информацию о месте хранении записи (см. описание пакета DBMS_ROWID)
  • Они уникальны для каждой записи в таблице (см. пример в вопросе).

Для чего эти значения не следует использовать:

You should not use ROWID as the primary key of a table.

Значения ROWID актуальны только в текущий момент времени, но нет гарантии их неизменности. Их не следует использовать для первичных ключей, или хранить в БД для каких то других целей.

Важное замечание об уникальности значений псевдоколонки ROWID :

Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.

Они уникальны для таблицы, но не для БД в целом.

Практическое применение в SQL запросе относительно не частое.
В PL/SQL коде напротив - повседневно. Например, чтобы избежать повторного поиска записи в последующих статических запросах (быстрый доступ к уже найденной записи).

Так для явного указания в запросе:

А так неявно в предикате CURRENT OF , который определяет текущую запись по ROWID :

Я понимаю, что ROWID является уникальным значением для каждой строки в результате, возвращаемом запросом.

зачем нам этот ROWID? В ORACLE уже есть ROWNUM.

кто-нибудь использовал ROWID в SQL-запросе?

ROWID-это физическое расположение строки. Следовательно, это самый быстрый способ поиска строки, даже быстрее, чем поиск первичного ключа. Поэтому он может быть полезен в определенных типах транзакций, где мы выбираем некоторые строки, храним их ROWIDs, а затем используем ROWIDs в where предложения для DML против тех же строк.

выбор Oracle . Для синтаксиса обновления неявно используется ROWID, когда мы обновляем заблокированную строку, используя where CURRENT OF. Также Таблица исключений (ссылка при применении ограничений с исключениями в предложение) имеет столбец ROW_ID. Это позволяет нам быстро идентифицировать строки, которые нарушают наше ограничение.

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

ROWNUM, с другой стороны, является псевдо-столбцом, который помечает строку в заданном результирующем наборе. Оно имеет никакого постоянного значения.

редактировать

ROWID для данной записи может изменяться в течение всего времени существования системы, например, через перестроение таблицы. Кроме того, если одна запись удалена, новой записи может быть присвоен этот ROWID. Следовательно, ROWIDs не подходят для использования в качестве UIDs в долгосрочной перспективе. Но они достаточно хороши для использования в рамках транзакции.

теперь я знаю пример для этого.

предположим, что у вас есть таблица без первичных ключей. таким образом, эта таблица может иметь повторяющиеся строки. Как бы вы удалили повторяющиеся строки, но сохранили точно одну из них?

Oracle предоставляет ROWID в качестве замены первичного ключа. Вы можете написать вложенный запрос, который имеет коррелированный тип [(group by all columns in The row и take MIN (ROWID) в каждой группе во внутреннем запросе, для каждой группы удалите другие строки в группе в outerquery)]

обратите внимание, что ROWID не сохраняется в цикле экспорта и импорта базы данных. вы никогда не должны хранить rowid в своих таблицах в качестве ключевого значения.

ROWID однозначно идентифицирует строку в таблице. ROWNUM дает номер строки результата для определенного запроса. Они очень различны и не взаимозаменяемы.

также есть ROW_NUMBER, который является более современной версией ROWNUM, и ведет себя немного иначе. Проверьте в этой статье что объясняет разницу.

ROWID состоит из (Но не обязательно в этом порядке, хотя часть ROWNUM является последней частью ROWID, насколько я помню):

  • OBJID Уникальный идентификатор объекта.
  • FILENO Относительное число файла данных в табличном пространстве.
  • в BLOCKNO Относительный номер блока в файле данных после fileheader.
  • этот параметр rownum Относительный rownum внутри блока.

вы можете легко сломать ROWID в составные поля (OBJID, FILENO, BLOCKNO, ROWNUM) с помощью SQL-функции ROWIDTOCHAR () или используйте:

обратите внимание, что поле ROWNUM (или строка в приведенном выше запросе) -не тот же ROWNUM, что и псевдо-столбец SQL ROWNUM, который вы используете в запросе SELECT, который является динамически генерируемым номером строки в результирующем наборе.

обратите внимание, что из-за этой реализации строки, блоки, экстенты и сегменты не переносятся не нарушая ROWID, который делает индексы недействительными.

ROWID-это самый прямой путь доступа к блоку, в котором находится строка, и уникально индентифицирует строку, потому что он кодирует уникальный файл и уникальный блок в этом файле и уникальную строку в этом блоке.

посмотреть: Примечания СУБД по формату ROWID

Если у вас есть немного понимания того, как оракул структур файлы и блоки базы данных, а также знать некоторые программирования C, вы можете довольно легко сделать программу, которая отображает содержимое блока, заданного ROWID (8k, или любой размер блока используется в базе данных, блок, который начинается с fileheadersize + BLOCKNO * BLOCK_SIZE. Блок содержит заголовок блока, а затем (если таблица не кластеризована) rowdir, который для каждой строки дает относительное смещение внутри блока для каждой строки. Так, например, в позиции 0 в rowdir является относительное смещение 0-й строки внутри блока, в позиции 1 в rowdir относительной позиции 1-й строки и т. д. Само количество строк хранится где-то в заголовке блока (см. документацию orale по компоновке блока).

имея немного знаний программирования и просматривая документацию по файлам баз данных oracle и блокам для точного расположения блоков, вы можете увидеть, как строки хранятся на диске, и даже восстановить все значения, которые хранит строка для каждый столбец. Каждая строка содержит метаданные для длины строки и количества столбцов, а для каждого столбца-указание типа столбца, байт-размера и последующего значения. Bytesize 0 означает, что данные столбца пусты (или: NULL).

ROWID в основном позволяет иметь две строки с точно такими же данными. Хотя вы обычно хотите, чтобы ваш первичный ключ был немного более значимым, чем RowID, это просто простой способ автоматического обеспечения уникальности между строками.

Псевдонимы таблиц и столбцов

севдонимы (от англ. aliases, часто можно встретить жаргонный термин «алиас») позволяют задать в рамках запроса альтернативные имена для столбцов и таблиц. С помощью псевдонимов можно решить следующие задачи:

  • назначение для столбца или таблицы такого имени, которое более понятно для программиста (что соответственно упрощает сопровождение и отладку запросов) или является коротким именем (что сокращает размер текста и повышает его читаемость);
  • устранение неоднозначности при извлечении данных из нескольких таблиц, имеющих столбцы с одинаковыми именами;
  • присвоение имен для результатов вычисления.

SELECT EMPNO, ENAME, JOB

FROM SCOTT.EMP emp

В данном случае для таблицы SCOTT.EMP в запросе задан псевдоним «emp», но он нигде не используется. Кроме того, допустим запрос вида:

SELECT emp.EMPNO, ENAME, emp.JOB

FROM SCOTT.EMP emp

В данном случае псевдоним применяется, но не для всех извлекаемых столбцов. Такой запрос будет выполняться, так как отсутствует неоднозначность. Кроме того, вместо псевдонима таблицы допустимо указание ее полного имени:

SELECT emp.EMPNO, SCOTT.EMP.ENAME, emp.JOB

FROM SCOTT.EMP emp

Как легко заметить, запись с использованием псевдонимов гораздо компактнее и лучше читается. Это очень важно при построении сложных запросов, особенно если их разработкой занимается несколько программистов.

SELECT EMPNO, ENAME

FROM SCOTT.EMP e, SCOTT.DEPT d

WHERE e.DEPTNO = d.DEPTNO

В данном запросе производится соединение двух таблиц, причем обе содержат столбец с именем DEPTNO. Использование псевдонима позволяет однозначно указать, столбец какой из таблиц применяется в условии. Если немного модифицировать данный запрос (добавив извлечение столбца DEPTNO), то мы получим ту самую неоднозначность, о которой шла речь выше:

SELECT EMPNO, ENAME, DEPTNO

FROM SCOTT.EMP e, SCOTT.DEPT d

WHERE e.DEPTNO = d.DEPTNO

Попытка выполнения запроса завершится ошибкой «ORA-00918: column ambiguously defined (столбец определен неоднозначно)». Для устранения ошибки необходимо конкретизировать принадлежность столбца DEPTNO при помощи псевдонимов:

SELECT e.EMPNO, e.ENAME, d.DEPTNO

FROM SCOTT.EMP e, SCOTT.DEPT d

WHERE e.DEPTNO = d.DEPTNO

SELECT e.EMPNO TABNOM, e.ENAME AS NAIM

FROM SCOTT.EMP e

SELECT e.EMPNO "THIS IS TABNOM", e.ENAME AS "Это имя сотрудника"

FROM SCOTT.EMP e

Несмотря на то что создание псевдонимов для столбцов не является обязательным, следует отметить ряд случаев, в которых настоятельно рекомендуется их применять. Во-первых, при использовании вычислений. Например, рассмотрим запрос, который выводит зарплату сотрудников, повышенную на 5%:

SELECT e.EMPNO, e.ENAME, e.SAL*1.05

FROM SCOTT.EMP e

Данный запрос будет отлично работать, но если выяснить имена возвращаемых запросом столбцов, то мы получим следующие данные:

EMPNO NUMBER (4)

ENAME VARCHAR (10)

E.SAL*1.05 NUMBER

SELECT e.EMPNO, e.ENAME, e.SAL*1.05 CALC_SAL

FROM SCOTT.EMP e

Во-вторых, при запросе, в котором извлекаются два столбца с одинаковыми именами, например:

SELECT e.EMPNO, e.ENAME, e.DEPTNO, d.DEPTNO

FROM SCOTT.EMP e, SCOTT.DEPT d

WHERE e.DEPTNO = d.DEPTNO

К сожалению, в такой ситуации сервер Oracle не считает запрос ошибочным и, обнаруживая совпадение имен, автоматически генерирует уникальные имена. В нашем случае имена столбцов будут иметь вид:

EMPNO NUMBER (4)

ENAME VARCHAR (10)

DEPTNO NUMBER (2)

DEPTNO_1 NUMBER (2)

Как видно, сервер просто добавляет к имени номер через «_». Использовать такие имена в программе не ремомендуется, так как в ходе модернизации запроса они могут изменяться непредсказуемым образом. Особенно чреваты подобными ошибками запросы вида:

SELECT e.*, d.*

FROM SCOTT.DEPT d, SCOTT.EMP e

WHERE e.DEPTNO = d.DEPTNO

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

Исходя из вышесказанного можно сформулировать несколько практических правил использования псевдонимов:

  • если в запросе применяется более одной таблицы, то необходимо снабдить их псевдонимами и указывать имена столбцов только с псевдонимами. Это повысит читаемость запроса и защитит его от возможных сбоев и ошибок в случае модификации базы;
  • все вычисляемые поля запроса необходимо снабжать псевдонимами. Желательно выработать некий стандарт именования, подчеркивающий тот факт, что это результат вычислений, а не значение одного из столбцов таблицы;
  • в случае извлечения двух столбцов с одинаковыми именами как минимум для одного из них должен быть задан псевдоним.

Псевдостолбец ROWID

Необходимо отметить, что существование ROWID противоречит как минимум двум из двенадцати известных правил Кодда, описывающих требования к реляционной СУБД. Во-первых, ROWID нарушает правило номер 2, которое гласит: «К каждому элементу данных должен быть обеспечен доступ при помощи комбинации имени таблицы, первичного ключа строки и имени столбца». В данном случае ROWID не является первичным ключом, хотя ввиду его уникальности для каждой строки он может выступать в роли первичного ключа.

Во-вторых, нарушается правило Кодда номер 8: «Прикладные программы не должны зависеть от используемых способов хранения данных на носителях и методов обращения к ним». Нарушение этого правила происходит из-за того, что ROWID по своей сути является физической координатой записи, поэтому он будет изменяться в случае пересоздания таблицы, перезагрузки данных, перемещения таблицы из одного табличного пространства в другое и т.п. Однако ROWID уникален и неизменен в течение сеанса пользователя, поэтому приложение может считать его неизменным.

ROWID существенно упрощает работу с базой данных, поскольку позволяет однозначно идентифицировать любую строку таблицы, что, в частности, позволяет удалять и редактировать строки таблиц без первичного ключа. Кроме того, поиск строки по ее ROWID является самым быстрым из возможных, что положительно сказывается на быстродействии приложений, активно модифицирующих данные. Однако ROWID является специфической особенностью Oracle, а следовательно, его нельзя применять при разработке приложений, рассчитанных на работу с базами других типов.

Рассмотрим простейший пример запроса, извлекающего ROWID строк:

SELECT e.ROWID, e.ENAME

FROM SCOTT.EMP e

Псевдостолбец RONUM

Как и ROWID, псевдостолбец ROWNUM является специфичным для Oracle. ROWNUM содержит порядковый номер строки запроса, например:

SELECT ROWNUM, e.ENAME

FROM SCOTT.EMP e

В данном запросе производится нумерация извлекаемых строк. Однако чаще всего ROWNUM применяется не для нумерации, а для ограничения количества обрабатываемых строк. Так, данный запрос извлекает первые пять строк данных:

SELECT ROWNUM, e.ENAME

FROM SCOTT.EMP e

WHERE ROWNUM <= 5

SELECT ROWNUM, e.ENAME

FROM SCOTT.EMP e

WHERE ROWNUM <= 5

order by e.ENAME

Сначала может показаться, что список сотрудников будет отсортирован по их именам в алфавитном порядке, а затем будут выбраны первые пять записей этого списка. Но на самом деле будет выбрано пять первых попавшихся в базе сотрудников (из-за того, что ROWNUM присваивается до сортировки), а уже затем полученный список будет отсортирован по имени сотрудника:

2 ALLEN

4 JONES

5 MARTIN

1 SMITH

3 WARD

Читайте также: