Попытка выяснить максимальную длину Rowid в Oracle - PullRequest
0 голосов
/ 29 мая 2018

В соответствии с моим дизайном я хочу извлечь rowid как в

select rowid r from table_name;

в переменную C.Мне было интересно, каков максимальный размер / длина в символах rowid.

В настоящее время в одной из самых больших таблиц в моей БД мы имеем максимальную длину 18 и ее 18 по всей таблице для rowid.

Заранее спасибо.

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

select rowid from table_name ... where ....;

delete from table_name where rowid = selectedrowid;

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

Пожалуйста, обратитесь кответ ниже: Безопасно ли использовать ROWID для поиска строки / записи в Oracle?

Я бы сказал, нет.Это может быть безопасно, если, например, приложение временно сохраняет ROWID (скажем, генерирует список элементов с возможностью выбора, каждый из которых идентифицируется с помощью ROWID, но список регулярно обновляется и не сохраняется).Но если ROWID используется каким-либо постоянным способом, это небезопасно.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Согласно документации ROWID имеет длину 10 байт:

Rowids of Row Pieces

rowid фактически равен 10-байтный физический адрес строки.

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

Oracle также документирует (текущий) формат, см. Формат строки

Как правило, вы можете использовать ROWID в вашем приложении, при условии, что затронутые строки заблокированы !

Таким образом, ваше утверждение может выглядеть так:

CURSOR ... IS
select rowid from table_name ... where .... FOR UPDATE;

delete from table_name where rowid = selectedrowid;

см. ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ и ОБНОВЛЕНИЯ Курсоры

Oracle даже предоставляет ярлык.Вместо where rowid = selectedrowid вы можете использовать WHERE CURRENT OF ...

0 голосов
/ 29 мая 2018

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

Поскольку дела в мире ИТ продолжают расти, можно с уверенностью предположить, что формат в будущем изменится,

Помимо объема, существуют также структурные изменения, такие как появление переносимых табличных пространств, из-за которых необходимо сохранить номер объекта (= внутренний номер таблицы / раздела / подраздела) внутри ROWID.

Или появление организованных по индексу таблиц (упомянутых @ ibre5041), которые выглядят как таблица, но на самом деле являются просто индексом без такого физического адреса (потому что в индексе все постоянно движется).Это сделало необходимым введение UROWID, которые могут хранить физические и основанные на индексах ROWID.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...