Почему этот запрос добавляет ноль в таблицу вместо выбранной строки? - PullRequest
0 голосов
/ 28 мая 2019

Я выполняю приведенный ниже запрос в Oracle SQL. Таблица имеет 2 столбца, первый тип rowid, а второй тип varchar.

INSERT INTO MYTABLE SELECT 'AAAAAAAAAAAAAAAAAA' RID, NULL FROM DUAL;

В результате добавляется ноль в обоих столбцах.

Почему это происходит?

Не следует ли добавить «AAAAAAAAAAAAAAAAAA» в первый столбец таблицы?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Когда вы добавляете 'AAAAAAAAAAAAAAAAAA' в столбец типа строки rowid, oracle преобразует строку в rowid и сохраняет ее там.

select chartorowid('AAAAAAAAAAAAAAAAAA') from dual; -- Result: NULL

rowid 'AAAAAAAAAAAAAAAAAA' не представляет никакого физического местоположения. Фактически, Oracle использует rowid «AAAAAAAAAAAAAAAAAA» для представления строк, которые в настоящий момент обрабатываются, но не существуют физически. например В триггере (новый ряд).

Рассмотрим упомянутый rowid как специальный rowid, используемый Oracle, который выделяется всем строкам, которые существуют логически, а не физически.

Надеюсь, это ответ, который вы ищете.

0 голосов
/ 28 мая 2019

ROWID - это псевдостолбец , который вы не сохраняете и можете выбирать только из.Таким образом, ваш RID не является идентификатором строки.

Без каких-либо других деталей, похоже, что вместо этого вы используете EXTENDED ROWID :

Расширенные строки хранятся какзначения base 64, которые могут содержать символы AZ, az, 0-9 и знак плюс (+) и косую черту (/).Расширенные строки не доступны напрямую.Вы можете использовать поставляемый пакет DBMS_ROWID для интерпретации расширенного содержимого rowid.Функции пакета извлекают и предоставляют информацию, которая будет доступна непосредственно из ограниченного rowid, а также информацию, относящуюся к расширенным rowid.

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

...