ROWID состоит из (но не обязательно в этом порядке, хотя часть ROWNUM, насколько я помню, является последней частью ROWID):
- ObjId
Уникальный идентификатор объекта.
- FILENO
Относительный номер файла данных в табличном пространстве.
- БЛОКНО
Относительный номер блока в файле данных после заголовка файла.
- ROWNUM
Относительный rownum в пределах блока.
Вы можете легко разбить ROWID на его составные поля (OBJID, FILENO, BLOCKNO, ROWNUM), используя SQL-функцию ROWIDTOCHAR (), или использовать:
SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
2 DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
3 DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
4 DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
5 from dual
6 /
OBJECT FILE BLOCK ROW
---------- ---------- ---------- ----------
258 1 2082 0
Обратите внимание, что поле ROWNUM (или ROW в приведенном выше запросе) имеет значение , а не такое же значение ROWNUM, что и псевдостолбец SQL ROWNUM, который вы используете в запросе SELECT, который является просто динамически генерируемым номером строки строки в набор результатов.
Обратите внимание, что из-за этой реализации строки, блоки, экстенты и сегменты не могут быть переданы без нарушения ROWID, что делает индексы недействительными.
ROWID является наиболее прямым путем доступа к блоку, в котором находится строка, и однозначно идентифицирует строку, поскольку он кодирует уникальный файл и уникальный блок в этом файле и уникальную строку в этом блоке.
Дополнительная информация:
Примечание:
Если вы немного разбираетесь в том, как oracle структурирует файлы и блоки базы данных, и знаете немного программирования на C, вы можете довольно легко создать программу, которая отображает содержимое блока, заданного ROWID (8k или любой другой размер блока). используется в базе данных, блок начинается с fileheadersize + BLOCKNO * BLOCK_SIZE. Блок содержит заголовок блока, а затем (при условии, что таблица не кластеризована) rowdir, который для каждой строки дает относительное смещение в блоке для каждой строки. Так, например, в позиции 0 в rowdir - относительное смещение 0-й строки в блоке, в позиции 1 в rowdir - относительная позиция 1-й строки и т. Д. Количество самих строк хранится где-то в заголовок блока (см. документацию по макету блока).
Приложив немного знаний в области программирования и просмотрев документацию по файлам базы данных Oracle, блоков для точной компоновки блоков, вы сможете увидеть, как строки хранятся на диске, и даже восстановить все значения, которые строки хранят для каждого столбца. , Каждая строка содержит метаданные для длины строки и количества столбцов, а для каждого столбца указывается тип столбца, а также размер байта и последующее значение. Байт 0 означает, что данные столбца пустые (или: NULL).