У меня есть база данных Progress, из которой я выполняю ETL. Одна из таблиц, которые я читаю, не имеет уникального ключа, поэтому мне нужно получить доступ к ROWID, чтобы иметь возможность однозначно идентифицировать строку. Каков синтаксис для доступа к ROWID в процессе?
Я понимаю, что есть проблемы с использованием ROWID для идентификации строк, но сейчас это все, что у меня есть.

Быстрый поиск в Google показывает это: http://bytes.com/forum/thread174440.html
Прочтите сообщение внизу на [email protected] (вам нужен либо oid, либо ctid, в зависимости от того, какие гарантии вы хотите повторного сохранения и уникальности)
Распространенная ошибка, о Progress мало кто даже слышал :-)
Небольшая оговорка для моего ответа - прошло почти 10 лет с тех пор, как я работал с Прогресс, поэтому мои знания, вероятно, более чем немного устарели.
Проверка Справочник по языку Progress [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
Редактировать: Отредактировано после отзыва Стефана.
Вы должны указать NO-ERROR в первых двух примерах, а в первом добавить клиента IF AVAIL THEN перед назначением ROWID. В качестве альтернативы вы можете поместить оператор assign внутри FOR FIRST CUSTOMER NO-LOCK WHERE ... Просто способы избежать сообщений об ошибках, если нет подходящего клиента.
Просто чтобы добавить немного к ответам Дэйва Уэбба. Я пробовал ROWID в операторе select, но получил синтаксическую ошибку. ROWID работает только в том случае, если вы укажете остальные столбцы для выбора, вы не можете использовать *.
Это не работает:
SELECT ROWID, * FROM customer WHERE cust-num = 123
Это действительно работает:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
Это хорошо знать. Когда я работал с Progress, все было связано с поддержкой 4GL, а поддержка SQL была довольно новой, поэтому я никогда не запрашивал базу данных Progess с помощью SQL. Тем не менее, насколько я помню, это отличная база данных с красивой архитектурой, и жаль, что она так редко используется.
после того, как вы укажете столбец, вы должны поставить префикс * перед именем таблицы. Итак, в примере SELECT RowID, "cust-num".* FROM ...бы работает
В зависимости от вашей ситуации и поведения приложения это может иметь значение, а может и не иметь значения, но вы должны знать, что идентификаторы ROWID и RECID используются повторно и могут измениться.
1) Если запись удалена, ее ROWID в конечном итоге будет повторно использован.
2) Если таблица реорганизуется с помощью дампа и загрузки или перемещения таблицы в новую область хранения, то ROWID изменятся.
У меня есть база данных Progress, а не база данных PostgreSQL.