как разбить на страницы ResultSet
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
как разбить на страницы ResultSet
<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 или у меня руки кривые?
<strong>А какой JDBC driver - 1 или 2? Если 2.1 то там есть scrollable result sets</strong><hr></blockquote>
Есть то он есть, но Oracle-авский CURSOR возвращаемый из stored procedure не скролируется. Feature by design или у меня руки кривые?
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
как разбить на страницы ResultSet
<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 кстати тоже есть проблемы со скролингом в рекордсете когда его из хранимрой процедуры получаешь.
но там можно сказать что локейшен - на клиенте и тогда это все работает. а вот как в джаве то все сделать?
ну не читать же это все в массив каждый раз и рабивать уже потом ?
<strong>
Есть то он есть, но Oracle-авский CURSOR возвращаемый из stored procedure не скролируется. Feature by design или у меня руки кривые?</strong><hr></blockquote>
в ADO кстати тоже есть проблемы со скролингом в рекордсете когда его из хранимрой процедуры получаешь.
но там можно сказать что локейшен - на клиенте и тогда это все работает. а вот как в джаве то все сделать?
ну не читать же это все в массив каждый раз и рабивать уже потом ?
-
- Уже с Приветом
- Posts: 460
- Joined: 22 Dec 1999 10:01
- Location: san jose, ca
как разбить на страницы ResultSet
<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>
<strong>да, но если я делаю временную таблицу для сессии то тогда информация там будет не связана с основной таблицей и изменения сделанные в основной таблице не будут видны.
или я что то не так понял?</strong><hr></blockquote>
ну тогда не временная таблица, а view подойдет больше...
[ 13-11-2001: Message edited by: dimach ]</p>
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
как разбить на страницы ResultSet
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by dimach:
<strong>ну тогда не временная таблица, а view подойдет больше...</strong><hr></blockquote>
А если у меня выводится 6 полей таблицы да еще надо сортировать по каждому полю и порядке вознастания-убывания? У меня на пару секунд Oracle задумывается. И это без нагрузки (только я один). Так что я пока загрузил все данные себе на сервер и оттуда уже их отдаю. Благо у меня эти данные более-менее статичные и можно их обновлять где-то раз в час.
<strong>ну тогда не временная таблица, а view подойдет больше...</strong><hr></blockquote>
А если у меня выводится 6 полей таблицы да еще надо сортировать по каждому полю и порядке вознастания-убывания? У меня на пару секунд Oracle задумывается. И это без нагрузки (только я один). Так что я пока загрузил все данные себе на сервер и оттуда уже их отдаю. Благо у меня эти данные более-менее статичные и можно их обновлять где-то раз в час.
-
- Уже с Приветом
- Posts: 460
- Joined: 22 Dec 1999 10:01
- Location: san jose, ca
как разбить на страницы ResultSet
<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]
<strong>
А если у меня выводится 6 полей таблицы да еще надо сортировать по каждому полю и порядке вознастания-убывания? У меня на пару секунд Oracle задумывается. И это без нагрузки (только я один). Так что я пока загрузил все данные себе на сервер и оттуда уже их отдаю. Благо у меня эти данные более-менее статичные и можно их обновлять где-то раз в час.</strong><hr></blockquote>
12 views [img:1cce95d593]images/smiles/icon_wink.gif[/img:1cce95d593]
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
как разбить на страницы ResultSet
<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]
<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]
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
как разбить на страницы ResultSet
<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]
<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]
-
- Уже с Приветом
- Posts: 1772
- Joined: 06 Sep 2001 09:01
- Location: Boston, MA -> Charlotte,NC ->Danbury,CT
как разбить на страницы ResultSet
Чудес не бывает. Либо всю выборку тянете на клиент в разных видах - recordset на клиенте если ADO, или, например, в JavaBean, встроенный в JSP или в массив, если в сервлет etc. Либо на сервере держать в виду курсора, что не всегда хорошо. Либо запросы периодически выдавать на очередную порцию страниц. Либо комбинацией всего перечисленного.
-
- Уже с Приветом
- Posts: 134
- Joined: 19 Aug 2000 09:01
- Location: PA
как разбить на страницы ResultSet
<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).
<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).
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
как разбить на страницы ResultSet
webdeveloper, а Вы вроде до сих пор не сказали, о каком сервере БД идёт речь. Или я что-то пропустил?
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
как разбить на страницы ResultSet
Так, что, в итоге нет способа разбить ResulSet на старницы в базе данных когда используется хранимаю процедура?
Или есть?
Варианты с созданием дополнительных таблиц не предлогать [img:2c4d18eca0]images/smiles/icon_smile.gif[/img:2c4d18eca0]
Или есть?
Варианты с созданием дополнительных таблиц не предлогать [img:2c4d18eca0]images/smiles/icon_smile.gif[/img:2c4d18eca0]
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
как разбить на страницы ResultSet
<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.
<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.
-
- Уже с Приветом
- Posts: 1772
- Joined: 06 Sep 2001 09:01
- Location: Boston, MA -> Charlotte,NC ->Danbury,CT
как разбить на страницы ResultSet
Если есть primary key - с, то разве нельзя делать просто запрос типа
select top 10 from t where t.c >= c_ses order by c
где с_ses - это текущее значение ключа, которое хранится в сессионной переменной, и обновляется после каждого запроса ?
Или я неправ ?
select top 10 from t where t.c >= c_ses order by c
где с_ses - это текущее значение ключа, которое хранится в сессионной переменной, и обновляется после каждого запроса ?
Или я неправ ?
-
- Уже с Приветом
- Posts: 3127
- Joined: 10 Apr 2001 09:01
- Location: MD
как разбить на страницы ResultSet
<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
<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
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
как разбить на страницы ResultSet
<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] Поэтому про него я пока не думаю, и даже не могу про него вопрос задать. Но хотелось бы конечно знать какой нибудь универсальный способ для реализации этой задачи. Если он конечно существует.
<strong>webdeveloper, а Вы вроде до сих пор не сказали, о каком сервере БД идёт речь. Или я что-то пропустил?</strong><hr></blockquote>
В данный момент я на SQL Server, но это пока просто тренировчный проектик. Сижу изучаю JSP. Вот и заинтересовался как это можно сделать. А в книжке ответов на этот вопрос не нашел. Вот и решил спросить.
Оракл я вообще не знаю и даже ни разу не видел [img:670d15dc2d]images/smiles/icon_smile.gif[/img:670d15dc2d] Поэтому про него я пока не думаю, и даже не могу про него вопрос задать. Но хотелось бы конечно знать какой нибудь универсальный способ для реализации этой задачи. Если он конечно существует.