2016-11-02 6 views
0

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

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

Так что получите результат, как:

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

2, Джек, Чан

3, Ник, Ho

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

+0

Нет, вы действительно не понимаете, что такое ROWID. Я думаю, вам нужно объяснить проблему, которую вы хотите решить! – Jensd

+0

Хорошо, я просто задам вопрос еще раз. –

+0

Казалось бы, ваше реальное требование не имеет ничего общего с ROWID и что фактическое требование состоит в том, что вы хотите, чтобы ваш результирующий набор был последовательно перечислил? –

ответ

3

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

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

Что касается ROWID:

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

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

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

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

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

+0

Извините, я не должен сказать 0. Вы правы, 0 никогда не будет существовать. ROWID дает уникальный номер, и я знаю, что он увеличивается на 1. Я просто хочу, чтобы он начинался от 1 до n вместо некоторого случайного числа.Спасибо за ваш ответ. –

+0

Вы не должны думать о ROWID как целые числа, но, устанавливая это в сторону, ROWID не увеличиваются на 1 или какое-либо другое значение. Значение ROWID не предсказуемо. Будут промежутки между самыми высокими и самыми низкими значениями, и ваш код должен принять этот факт или он не будет работать. –

+0

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