Реализовать Oracle Paging For ЛЮБОЙ запрос? - PullRequest
3 голосов
/ 04 апреля 2011

Я нашел много примеров пейджинга в Oracle. Конкретный, который я использую сейчас, выглядит примерно так:

SELECT * FROM (
  SELECT a.*, ROWNUM RNUM FROM (
    **Select * From SomeTable**) a 
  WHERE ROWNUM <= 500) b 
WHERE b.RNUM >= 1

Строка, выделенная жирным шрифтом, представляет «оригинальный» запрос. Остальная часть SQL существует для реализации подкачки страниц. Проблема, с которой я сталкиваюсь, - это запрос, который сам по себе является совершенно допустимым; произойдет сбой, когда я помещу его в код подкачки.

Как пример - этот запрос не будет выполнен:

SELECT TABLE1.*, TABLE1.SomeValue FROM TABLE1

С неоднозначной ошибкой столбца. Но без моего дополнительного кода; это будет работать просто отлично. У меня есть большое количество «сохраненных» запросов, но я должен убедиться, что мое решение по поисковому вызову не делает их недействительными.

Я использовал SQL Developer в качестве инструмента запросов Oracle, и ему удается реализовать подкачку, которая работает даже с вышеуказанным запросом, который не выполняется, когда я оборачиваю его в код подкачки. Может кто-нибудь сказать мне, как им удается это осуществить?

Ответы [ 2 ]

7 голосов
/ 04 апреля 2011

Во-первых, исходный запрос должен иметь предложение ORDER BY, чтобы обеспечить разумную работу решения для пейджинга. В противном случае было бы совершенно правильно, чтобы Oracle возвращал те же 500 строк для первой страницы, второй страницы и N-й страницы.

SQL Developer не меняет ваш запрос для реализации подкачки. Это просто отправка полного запроса в Oracle и подкачка результатов непосредственно с помощью JDBC. Клиентское приложение JDBC может указывать размер выборки , который определяет, сколько строк возвращается из базы данных клиенту за раз. Затем клиентское приложение может ждать, пока пользователь не решит перейти на следующую страницу или сделать что-то еще, и в этом случае курсор будет закрыт.

То, имеет ли смысл подход разработчика SQL, во многом зависит от архитектуры вашего приложения. Если вы пытаетесь разместить данные в веб-приложении без сохранения состояния, оно, вероятно, не будет работать, потому что вы не собираетесь держать сеанс базы данных открытым для нескольких запросов страниц. С другой стороны, если у вас полнофункциональное клиентское приложение с выделенным подключением к базе данных Oracle, это вполне разумно.

0 голосов
/ 05 апреля 2011

Прежде всего, какой смысл делать

SELECT TABLE1.*, TABLE1.someValue from TABLE1

Не будет ли TABLE1. * Автоматически выбирать «someValue», так зачем запрашивать его избыточно?

Во-вторых, для разбивки на страницы попробуйтеПодход аналитического запроса

SELECT * FROM {
    SELECT col1, col2, col3
    , row_number() OVER (order by col1) position
    FROM TABLE1
} WHERE rn >= p_seek and rn < (p_seek+p_count)

p_seek - это начальная позиция, а p_count - количество строк для выборки.

Здесь вместо col1, col2, col3 и т. д. вы можете выполнить TABLE1. *, TABLE1.someValue и т. Д.

...