Oracle — самое низкое значение VARCHAR2

Мне нужно запросить таблицу в базе данных по столбцу, который является VARCHAR2. Мне нужно получить записи по частям, а не все за один раз. ROWNUM используется для этой цели.

Запрос такой:

select * from SOMETABLE
where SOMECOLUMN > ?
and rownum <= 100
order by SOMECOLUMN

Этот запрос выполняется повторно путем изменения значения SOMECOLUMN. Начнем с того, что этот запрос должен быть снабжен наименьшим значением VARCAHAR2, чтобы я получил первые 100 записей (хотя и не в каком-то определенном порядке). В следующий раз используется значение SOMECOLUMN в 100-й записи (для этого в запрос добавляется order by), чтобы получить следующие 100 записей и так далее.

(Предположение: значения SOMECOLUMN уникальны).

Каким может быть начальное наименьшее значение, подаваемое в этот запрос?


person Manikandan Kannan    schedule 26.12.2013    source источник
comment
Вам нужно извлекать их по частям или обрабатывать их по частям — вы просто листаете страницы для отображения? Какой механизм вы используете для их извлечения? Мне интересно, можете ли вы запрашивать все записи, но просто извлекать их партиями, что означает, что Oracle эффективно позаботится об этом для вас. Что произойдет, если данные изменятся между вашими запросами, и ваша обработка изменяет данные в этой таблице (в частности, значение somecolumn), и вы фиксируете эти изменения между запросами?   -  person Alex Poole    schedule 26.12.2013
comment
Но вернемся к вашему вопросу... ваши настройки NLS повлияют на порядок сортировки и, следовательно, на «самое низкое» значение. Индексируется ли somecolumn? Вы можете выбрать значение min() и сравнить с ним?   -  person Alex Poole    schedule 26.12.2013
comment
Моя обработка не меняет данные; Он только читает; Однако данные могут обновляться другим процессом. SOMECOLUMN всегда идет в порядке возрастания. Это пакетный процесс, который считывает данные и создает текстовый файл. Таким образом, даже если некоторые данные на этот раз будут пропущены, в следующий раз будут выбраны только что добавленные данные. Как Oracle обрабатывает это чтение по частям? Как NLS влияет на самое низкое значение?   -  person Manikandan Kannan    schedule 27.12.2013
comment
В общем случае Oracle не поддерживает выборку фрагментами! Ваша локальная настройка NLS определяет, как сортируется текст, например. обработка строчных и прописных букв.   -  person Wernfried Domscheit    schedule 27.12.2013
comment
SOMECOLUMN это какая-то метка времени или что? Изменяется ли он для конкретной записи? Есть ли у вас какой-либо флаг или другой способ понять, что какая-то запись была обновлена ​​​​с момента последнего запуска партии?   -  person Yaroslav Shabalin    schedule 29.12.2013
comment
SOMECOLUMN — это либо метка времени, либо числовой столбец в порядке возрастания.   -  person Manikandan Kannan    schedule 02.01.2014


Ответы (1)


Вы можете использовать MIN() или MAX() также для данных VARCHAR2, а не только для чисел. Вы можете использовать это:

with t as
   (select SOMETABLE.*, rownum as THE_ROW from SOMETABLE order by SOMECOLUMN)
select *
from t
where THE_ROW between 1 and 100 -- (-> between 101 and 200, between 201 and 300 ...)
person Wernfried Domscheit    schedule 26.12.2013
comment
Хорошо, я не знал о такой возможности. Я отредактировал его. - person Wernfried Domscheit; 26.12.2013
comment
Таким образом, вся таблица читается каждый раз. Это может быть проблемой, если таблица действительно огромна. - person Manikandan Kannan; 27.12.2013