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

User avatar
KVA
Уже с Приветом
Posts: 5347
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: 5347
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, а Вы вроде до сих пор не сказали, о каком сервере БД идёт речь. Или я что-то пропустил?
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

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

Post by webdeveloper »

Так, что, в итоге нет способа разбить ResulSet на старницы в базе данных когда используется хранимаю процедура?

Или есть?

Варианты с созданием дополнительных таблиц не предлогать [img:2c4d18eca0]images/smiles/icon_smile.gif[/img:2c4d18eca0]
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 Jim:
<strong>
запоминая ID этих записей
</strong><hr></blockquote>

do you mean ROWID of Oracle?
I bet you won't get the grand prix for performance with your solution [img:9e563c8c62]images/smiles/icon_smile.gif[/img:9e563c8c62]

if you use deletion on the temp table, it means that your solution is naturally ineffective, because first you created those rows, then deleted 'em, both operations are not the quickest ones.

the solution with views is elegant, and not the slowest one. I advised it to some of my clients, they are happy. it's Oracle, of course. in SQL server it's not that nice.

something like this:
CREATE VIEW V AS
SELECT C,
(SELECT COUNT(*) FROM T t1 WHERE t1.C <= T.C) row
FROM T

this works when you have a primary key on C, like
create table T(
C VARCHAR2(2) primary key
)

-------------
obviously, this looks uglier than in Oracle, because MS SQL sucks [img:9e563c8c62]images/smiles/icon_smile.gif[/img:9e563c8c62] just kidding

If there's no primary key, then you are going to create a temp table like
CREATE TABLE TT (
C VARCHAR2(2),
row int IDENTITY (1, 1)
)

I don't like temp tables. They may be more effective than views, usually, but for aestethical reasons I hate them.
VYLE
Уже с Приветом
Posts: 1772
Joined: 06 Sep 2001 09:01
Location: Boston, MA -> Charlotte,NC ->Danbury,CT

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

Post by VYLE »

Если есть primary key - с, то разве нельзя делать просто запрос типа
select top 10 from t where t.c >= c_ses order by c

где с_ses - это текущее значение ключа, которое хранится в сессионной переменной, и обновляется после каждого запроса ?

Или я неправ ?
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 VYLE:
<strong>Если есть primary key - с, то разве нельзя делать просто запрос типа
select top 10 from t where t.c >= c_ses order by c

где с_ses - это текущее значение ключа, которое хранится в сессионной переменной, и обновляется после каждого запроса ?

Или я неправ ?</strong><hr></blockquote>

if it was just top 10, there wouldn't be a discussion here [img:cde53abb6b]images/smiles/icon_smile.gif[/img:cde53abb6b]
say you want rows between 100th and 125th. there's no standard SQL construct for that. so, we do all vendor specific tricks
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 tengiz:
<strong>webdeveloper, а Вы вроде до сих пор не сказали, о каком сервере БД идёт речь. Или я что-то пропустил?</strong><hr></blockquote>

В данный момент я на SQL Server, но это пока просто тренировчный проектик. Сижу изучаю JSP. Вот и заинтересовался как это можно сделать. А в книжке ответов на этот вопрос не нашел. Вот и решил спросить.

Оракл я вообще не знаю и даже ни разу не видел [img:670d15dc2d]images/smiles/icon_smile.gif[/img:670d15dc2d] Поэтому про него я пока не думаю, и даже не могу про него вопрос задать. Но хотелось бы конечно знать какой нибудь универсальный способ для реализации этой задачи. Если он конечно существует.

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