Как получить ROWID из базы данных Progress

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

Я понимаю, что есть проблемы с использованием ROWID для идентификации строк, но сейчас это все, что у меня есть.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
4
0
6 323
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Быстрый поиск в Google показывает это: http://bytes.com/forum/thread174440.html

Прочтите сообщение внизу на [email protected] (вам нужен либо oid, либо ctid, в зависимости от того, какие гарантии вы хотите повторного сохранения и уникальности)

У меня есть база данных Progress, а не база данных PostgreSQL.

Stefan Moser 19.09.2008 02:21

Распространенная ошибка, о Progress мало кто даже слышал :-)

Stefan Moser 19.09.2008 02:30
Ответ принят как подходящий

Небольшая оговорка для моего ответа - прошло почти 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 ... Просто способы избежать сообщений об ошибках, если нет подходящего клиента.

Jason Down 09.11.2008 22:00

Просто чтобы добавить немного к ответам Дэйва Уэбба. Я пробовал 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. Тем не менее, насколько я помню, это отличная база данных с красивой архитектурой, и жаль, что она так редко используется.

Dave Webb 19.09.2008 19:34

после того, как вы укажете столбец, вы должны поставить префикс * перед именем таблицы. Итак, в примере SELECT RowID, "cust-num".* FROM ...бы работает

David J 09.04.2012 22:35

В зависимости от вашей ситуации и поведения приложения это может иметь значение, а может и не иметь значения, но вы должны знать, что идентификаторы ROWID и RECID используются повторно и могут измениться.

1) Если запись удалена, ее ROWID в конечном итоге будет повторно использован.

2) Если таблица реорганизуется с помощью дампа и загрузки или перемещения таблицы в новую область хранения, то ROWID изменятся.

Другие вопросы по теме