Получить rowid в базе данных Progress OpenEdge от 1 до n

Драйвер JDBC не поддерживает функцию ROW_NUMBER. Как я могу получить идентификатор строки от 1 до n при чтении данных из таблицы?

Если у меня есть таблица с двумя столбцами в качестве имени и фамилии, я запускаю запрос типа SELECT ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) AS rowid, * FROM tableName в SQL Server. Это даст мне rowid от 1 до n вместе с содержимым firstname и lastname в ResultSet.

Так что я получу такой результат:

1, Феликс, Цао

2, Джек, Чан

3, Ник, Хо

Я хочу сделать аналогичный запрос для базы данных OpenEdge, чтобы получить идентификатор строки в указанном выше порядке.


person Cao Felix    schedule 02.11.2016    source источник
comment
Нет, похоже, вы действительно не понимаете, что такое ROWID. Я думаю, вам нужно объяснить проблему, которую вы хотите решить!   -  person Jensd    schedule 03.11.2016
comment
Хорошо, я просто задам вопрос еще раз.   -  person Cao Felix    schedule 03.11.2016
comment
Казалось бы, ваше реальное требование не имеет ничего общего с ROWID, а фактическое требование состоит в том, чтобы ваш набор результатов последовательно перечислялся?   -  person Tom Bascom    schedule 03.11.2016
comment
Правильно, я думаю, все, что я хочу узнать, - это иметь аналогичный метод, например ROW_NUMBER, который может назначать rowid для каждой строки от 1 до n. Так что я могу прочитать это из объекта набора результатов.   -  person Cao Felix    schedule 03.11.2016
comment
Теперь, когда ваше требование ясно, я обновил свой ответ. Вам это не понравится, но это то, что есть.   -  person Tom Bascom    schedule 04.11.2016


Ответы (1)


Нет, в базе данных OpenEdge нет эквивалента ROW_NUMBER.

http://knowledgebase.progress.com/articles/Article/Is-ORACLE-row-number-function-supported-in-OpenEdge

По поводу ROWID:

Отложив в сторону обсуждение того, стоит ли думать о ROWID как о целых числах ... (вам следует перечитать связанный kbase)

Нет никакой гарантии, что какое-либо конкретное значение ROWID когда-либо будет существовать, и нет причин, по которым ROWID должны начинаться с нуля, одного или любого другого значения.

Если вы думаете, что ROWID и RECID - это как бы одно и то же, а RECID - это целые числа, состоящие из блока # и позиции в этом блоке, ROWID 0 все равно никогда не будет существовать, потому что первая часть области хранения - это управляющие данные - там не хранятся строки.

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

Я думаю, вы решили, что ROWID - это решение вашей проблемы, но настоящая проблема не в том, «как получить ROWID 0». Если бы мне пришлось угадывать, я бы предположил, что вы, возможно, пытаетесь получить набор результатов партиями N. В этом случае вам следует посмотреть на это: Как имитировать SELECT ... LIMIT, OFFSET в OpenEdge SQL?

person Tom Bascom    schedule 02.11.2016
comment
извините, я не должен говорить 0. Вы правы, 0 никогда не будет существовать. ROWID дает уникальный номер, и я знаю, что он увеличивается на 1. Я просто хочу, чтобы он начинался с 1 до n вместо некоторого случайного числа. Спасибо за Ваш ответ - person Cao Felix; 02.11.2016
comment
Вы не должны думать о ROWID как о целых числах, но, оставив это в стороне, ROWID НЕ увеличиваются на 1 или любое другое значение. Значение ROWID непредсказуемо. Между самым высоким и самым низким значениями будут промежутки, и ваш код должен принять этот факт, иначе он не будет работать. - person Tom Bascom; 03.11.2016
comment
Я вижу, я тестирую только некоторое количество записей и думал, что это число будет увеличено на 1. Если будут пробелы, то я вообще не могу использовать ROWID в своем приложении. - person Cao Felix; 03.11.2016