Как получить ROWID из базы данных прогресса
-
01-07-2019 - |
Вопрос
У меня есть база данных прогресса, из которой я выполняю ETL.В одной из таблиц, которые я читаю, нет уникального ключа, поэтому мне нужно получить доступ к ROWID, чтобы иметь возможность однозначно идентифицировать строку.Каков синтаксис для доступа к ROWID в процессе выполнения?
Я понимаю, что есть проблемы с использованием ROWID для идентификации строк, но это все, что у меня есть прямо сейчас.
Решение
Небольшое предостережение к моему ответу - прошло почти 10 лет с тех пор, как я работал с Прогресс так что мои знания, вероятно, более чем немного устарели.
Проверка Ссылка на язык Прогресса [PDF] кажется, показывает, что две функции, которые я помню, все еще существуют: ROWID
и RECID
.Тот Самый ROWID
функция новее и является предпочтительной.
В Progress 4GL вы бы использовали это примерно так:
FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).
или:
FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.
Проверка Текущая ссылка на SQL [PDF] показывает ROWID
также доступно в SQL в качестве расширения Progress.Вы бы использовали это следующим образом:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
Редактировать: Отредактировано по отзывам Стефана.
Другие советы
В зависимости от вашей ситуации и поведения приложения это может иметь значение, а может и не иметь, но вы должны знать, что идентификаторы строк и RECID используются повторно и что они могут меняться.
1) Если запись будет удалена, ее ROWID в конечном итоге будет использован повторно.
2) Если таблица реорганизована с помощью dump & load или tablemove в новую область хранения, то идентификаторы строк изменятся.
Просто чтобы немного добавить к ответам Дейва Уэбба.Я попробовал ROWID в операторе select, но получил синтаксическую ошибку.ROWID работает только в том случае, если вы укажете остальные столбцы для выбора, вы не можете использовать * .
Это НЕ сработает:
SELECT ROWID, * FROM customer WHERE cust-num = 123
Это действительно работает:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
Быстрый поиск в Google выдает следующее:http://bytes.com/forum/thread174440.html
Прочитайте сообщение внизу с помощью greg@turnstep.com (вам нужен либо oid, либо ctid, в зависимости от того, какие гарантии вы хотите сохранить и уникальность)