Вопрос

У меня есть база данных прогресса, из которой я выполняю 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, в зависимости от того, какие гарантии вы хотите сохранить и уникальность)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top