как разбить на страницы ResultSet

User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

Вот столкнулся с проблемой - не знаю как разбить ResultSet на страницы

CallableStatement stm = conn.prepareCall();
ResultSet rs = stm.executeQuery("{call usp_someProcName}");

а вот потом как тот ResultSet разбить на страницы допустим по 10 записей.

в ASP для этого есть Recordset.Pagesize и Recordset.ActivePage, а что на джаве делать?
Igor S
Уже с Приветом
Posts: 2915
Joined: 07 Mar 2001 10:01
Location: Tar Heel State

как разбить на страницы ResultSet

Post by Igor S »

Vyvodit' po 10 zapisej za raz?
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

Ну да, тоесть в базе может быть 10000 записей но их же сразу не выведешь все на экран. Нужно делать разбивку на страницы. Но вот как?
dimach
Уже с Приветом
Posts: 460
Joined: 22 Dec 1999 10:01
Location: san jose, ca

как разбить на страницы ResultSet

Post by dimach »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>Ну да, тоесть в базе может быть 10000 записей но их же сразу не выведешь все на экран. Нужно делать разбивку на страницы. Но вот как?</strong><hr></blockquote>


запихай все во временную таблицу. то есть не все, а пары (id1,id2), id1 - identity, id2 - идентификатор записи из исходной таблицы.

а потом при выводе по параметру from (или start [img:b364ebad45]images/smiles/icon_wink.gif[/img:b364ebad45] ) выбирать из этой временной таблицы where id1>=@start and id1<=@start+@items_per_page

а убивать таблицу временную можно в session_onEnd
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

А еще как ни то можно?
Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

как разбить на страницы ResultSet

Post by Seryi »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>А еще как ни то можно?</strong><hr></blockquote>

Я не спец в JSP, но способ приведенный выше рекомендуется использовать и при работе с ASP.
Так как RS.AbsolutePage и т.д. сгружают все записи и уже на клиенте делают разбивку по страницам.
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

да, но если я делаю временную таблицу для сессии то тогда информация там будет не связана с основной таблицей и изменения сделанные в основной таблице не будут видны.

или я что то не так понял?
User avatar
KVA
Уже с Приветом
Posts: 5382
Joined: 03 Feb 1999 10:01
Location: NJ, USA

как разбить на страницы ResultSet

Post by KVA »

Еще можно совсем тупо пробежаться по всему ResultSet-у.
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
for( int i=0; i<=startRec+pageSize && rs.next(); i++ )
{
if ( i>startRec && i<=startRec+pageSize )
doSomething();
}
</pre><hr></blockquote>
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by KVA:
<strong>Еще можно совсем тупо пробежаться по всему ResultSet-у.
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
for( int i=0; i<=startRec+pageSize && rs.next(); i++ )
{
if ( i>startRec && i<=startRec+pageSize )
doSomething();
}
</pre><hr></blockquote></strong><hr></blockquote>

ну это то не фокус [img:0e588426bf]images/smiles/icon_smile.gif[/img:0e588426bf]
а если он здоровый?
stockman
Уже с Приветом
Posts: 1731
Joined: 24 Sep 1999 09:01
Location: планета Земля

как разбить на страницы ResultSet

Post by stockman »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>Вот столкнулся с проблемой - не знаю как разбить ResultSet на страницы

CallableStatement stm = conn.prepareCall();
ResultSet rs = stm.executeQuery("{call usp_someProcName}");

а вот потом как тот ResultSet разбить на страницы допустим по 10 записей.

в ASP для этого есть Recordset.Pagesize и Recordset.ActivePage, а что на джаве делать?</strong><hr></blockquote>
Саш, а там(что там в JSP с бд то работает?) нет такого метода как Move()? А то если есть то разбивку на страницы можно сделать и без ADODB-вских PageSize и AbsolutePage.
Кстати, а что ADO нельзя в JSP использовать?
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

ну какой там ADO на Unix ? [img:3cfdb81410]images/smiles/icon_smile.gif[/img:3cfdb81410]

метод такой есть - next() по моему называется

и как с ним?

p.s. Миш, если есть телефончик пришли - я в конце декабря в Москве буду - могли бы вместе пивка попить [img:3cfdb81410]images/smiles/icon_smile.gif[/img:3cfdb81410]
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

как разбить на страницы ResultSet

Post by AK70 »

it's the notorious problem [img:ccbf2db168]images/smiles/icon_smile.gif[/img:ccbf2db168]

the simplest way with Oracle is to make a view with one of the columns is rownum.

e.g.
create table T (
C varchar2(2)
);

create or replace view V as
select C, ROWNUM row from T;


so, you can do this:
select C from V where row between 1000 and 1025;

In SQL server this won't work, because SQL server sucks [img:ccbf2db168]images/smiles/icon_smile.gif[/img:ccbf2db168] Just kidding, you may use the same idea in SQL server too
stockman
Уже с Приветом
Posts: 1731
Joined: 24 Sep 1999 09:01
Location: планета Земля

как разбить на страницы ResultSet

Post by stockman »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>ну какой там ADO на Unix ? [img:fb1b0321b7]images/smiles/icon_smile.gif[/img:fb1b0321b7]
</strong><hr></blockquote>
Кто же знал что ты на Unix мигрировал [img:fb1b0321b7]images/smiles/icon_smile.gif[/img:fb1b0321b7]

[b:fb1b0321b7]
метод такой есть - next() по моему называется

и как с ним?
[/b:fb1b0321b7]
Неа, next судя по названию, аналог MoveNext в ADO. А Move позволяет сразу прыгнуть на номер записи, которую ты ему передаешь через параметр, т.е. Rs.Move(10)
На ASP будет что нибудь типа этого:

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
<%
.....
Rs.Move(pageNumb*pageSize)

For n=1 To pageSize
If RS.EOF Then
Exit For
Else
'выводим то что надо
Rs.MoveNext
End If
Next
%>
</pre><hr></blockquote>

[b:fb1b0321b7]
p.s. Миш, если есть телефончик пришли - я в конце декабря в Москве буду - могли бы вместе пивка попить [img:fb1b0321b7]images/smiles/icon_smile.gif[/img:fb1b0321b7]
[/b:fb1b0321b7]
Выслал мобильный и рабочий [img:fb1b0321b7]images/smiles/icon_smile.gif[/img:fb1b0321b7]

[ 13-11-2001: Message edited by: stockman ]</p>
stockman
Уже с Приветом
Posts: 1731
Joined: 24 Sep 1999 09:01
Location: планета Земля

как разбить на страницы ResultSet

Post by stockman »

Соори, там дописать надо:

[i:0c68e69aff]
If RS.EOF [b:0c68e69aff]OR Rs.BOF[/b:0c68e69aff] Then
Exit For
Else
[/i:0c68e69aff]

ну и еще пару проверочек, но примечательно что такой постраничный вывод должен работать на любом курсоре.
User avatar
jamm
Уже с Приветом
Posts: 478
Joined: 17 Nov 1999 10:01

как разбить на страницы ResultSet

Post by jamm »

А какой JDBC driver - 1 или 2? Если 2.1 то там есть scrollable result sets

Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);

Позиция курсора

ResultSet rst ..
rst.absolute(int row)

http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html
User avatar
KVA
Уже с Приветом
Posts: 5382
Joined: 03 Feb 1999 10:01
Location: NJ, USA

как разбить на страницы ResultSet

Post by KVA »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by jamm:
<strong>А какой JDBC driver - 1 или 2? Если 2.1 то там есть scrollable result sets</strong><hr></blockquote>

Есть то он есть, но Oracle-авский CURSOR возвращаемый из stored procedure не скролируется. Feature by design или у меня руки кривые?
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

как разбить на страницы ResultSet

Post by webdeveloper »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by KVA:
<strong>

Есть то он есть, но Oracle-авский CURSOR возвращаемый из stored procedure не скролируется. Feature by design или у меня руки кривые?</strong><hr></blockquote>

в ADO кстати тоже есть проблемы со скролингом в рекордсете когда его из хранимрой процедуры получаешь.

но там можно сказать что локейшен - на клиенте и тогда это все работает. а вот как в джаве то все сделать?

ну не читать же это все в массив каждый раз и рабивать уже потом ?
dimach
Уже с Приветом
Posts: 460
Joined: 22 Dec 1999 10:01
Location: san jose, ca

как разбить на страницы ResultSet

Post by dimach »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>да, но если я делаю временную таблицу для сессии то тогда информация там будет не связана с основной таблицей и изменения сделанные в основной таблице не будут видны.

или я что то не так понял?</strong><hr></blockquote>

ну тогда не временная таблица, а view подойдет больше...

[ 13-11-2001: Message edited by: dimach ]</p>
User avatar
KVA
Уже с Приветом
Posts: 5382
Joined: 03 Feb 1999 10:01
Location: NJ, USA

как разбить на страницы ResultSet

Post by KVA »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by dimach:
<strong>ну тогда не временная таблица, а view подойдет больше...</strong><hr></blockquote>

А если у меня выводится 6 полей таблицы да еще надо сортировать по каждому полю и порядке вознастания-убывания? У меня на пару секунд Oracle задумывается. И это без нагрузки (только я один). Так что я пока загрузил все данные себе на сервер и оттуда уже их отдаю. Благо у меня эти данные более-менее статичные и можно их обновлять где-то раз в час.
dimach
Уже с Приветом
Posts: 460
Joined: 22 Dec 1999 10:01
Location: san jose, ca

как разбить на страницы ResultSet

Post by dimach »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by KVA:
<strong>

А если у меня выводится 6 полей таблицы да еще надо сортировать по каждому полю и порядке вознастания-убывания? У меня на пару секунд Oracle задумывается. И это без нагрузки (только я один). Так что я пока загрузил все данные себе на сервер и оттуда уже их отдаю. Благо у меня эти данные более-менее статичные и можно их обновлять где-то раз в час.</strong><hr></blockquote>

12 views [img:1cce95d593]images/smiles/icon_wink.gif[/img:1cce95d593]
AK70
Уже с Приветом
Posts: 3127
Joined: 10 Apr 2001 09:01
Location: MD

как разбить на страницы ResultSet

Post by AK70 »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by dimach:
<strong>

ну тогда не временная таблица, а view подойдет больше...

[ 13-11-2001: Message edited by: dimach ]</strong><hr></blockquote>


now tell him how to make a view with oracle-like rownum in SQL Server. he doesn't know [img:d2e8e32768]images/smiles/icon_smile.gif[/img:d2e8e32768]
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

как разбить на страницы ResultSet

Post by tengiz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by webdeveloper:
<strong>Так, что, в итоге нет способа разбить ResulSet на старницы в базе данных когда используется хранимаю процедура?

Или есть?

Варианты с созданием дополнительных таблиц не предлогать [img:9f616cfe15]images/smiles/icon_smile.gif[/img:9f616cfe15] </strong><hr></blockquote>Вне зависимости от источника данных можно сделать соответсвюущий XML data island и привязять его к HTML таблице, при этом можно указать атрибут DATAPAGESIZE в количестве строк, после чего можно делать постраничную навигацию по таблице на клиенте. Это самое простое и элегантное решение для не очень больших наборов данных из тех, что я знаю. Хотя честно говоря я не слишком много в этой области знаю [img:9f616cfe15]images/smiles/icon_razz.gif[/img:9f616cfe15]
VYLE
Уже с Приветом
Posts: 1772
Joined: 06 Sep 2001 09:01
Location: Boston, MA -> Charlotte,NC ->Danbury,CT

как разбить на страницы ResultSet

Post by VYLE »

Чудес не бывает. Либо всю выборку тянете на клиент в разных видах - recordset на клиенте если ADO, или, например, в JavaBean, встроенный в JSP или в массив, если в сервлет etc. Либо на сервере держать в виду курсора, что не всегда хорошо. Либо запросы периодически выдавать на очередную порцию страниц. Либо комбинацией всего перечисленного.
Jim
Уже с Приветом
Posts: 134
Joined: 19 Aug 2000 09:01
Location: PA

как разбить на страницы ResultSet

Post by Jim »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by AK70:
<strong>it's the notorious problem [img:91c7dccac5]images/smiles/icon_smile.gif[/img:91c7dccac5]

the simplest way with Oracle is to make a view with one of the columns is rownum.

e.g.
create table T (
C varchar2(2)
);

create or replace view V as
select C, ROWNUM row from T;


so, you can do this:
select C from V where row between 1000 and 1025;

In SQL server this won't work, because SQL server sucks [img:91c7dccac5]images/smiles/icon_smile.gif[/img:91c7dccac5] Just kidding, you may use the same idea in SQL server too</strong><hr></blockquote>

Вот что я намудрил совсем недавно.

Хранимая процедура. Внутре создаётся временная таблица (та которая временная временная, то есть с одним #; после выполнения процедуры исчезнет автоматически) которая и есть резалтсет

Открываю курсор

Пробегаю курсором по записям начиная с записи N1 до записи N2, запоминая ID этих записей

Конструирую и выполняю оператор DELETE на временной таблице, который удалит все записи, НЕ упомянутые в предыдущем шаге. То есть остаются эти самые N1 - N2 записей.

Вернуть содержимое таблицы как результат хранимой процедуры.

На словах долго, но работает прилично - всё происходит на сервере, к клиенту каждый раз прилетает только одна страница записей (в моём случае 10).
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

как разбить на страницы ResultSet

Post by tengiz »

webdeveloper, а Вы вроде до сих пор не сказали, о каком сервере БД идёт речь. Или я что-то пропустил?

Return to “Вопросы и новости IT”