Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Кол-во строк в курсоре. / 15 сообщений из 15, страница 1 из 1
15.01.2008, 06:43
    #35061326
OlegA67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Добрый день. Всех с прошедшими праздниками.
В хранимой процедуре создаю курсор, что- то вроде
Код: plaintext
1.
2.
DECLARE cursor3 CURSOR WITH RETURN FOR SELECT .......;
......
OPEN cursor3;
И в этой же процедуре мне надо знать, кол-во записей в этом курсоре. Как можно узнать это кол-во, не запуская дополнительный запрос с параметром INTO
...
Рейтинг: 0 / 0
15.01.2008, 09:07
    #35061477
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Надо открыть курсор с возможностью "листать". По умолчанию курсор открывается только на последовательное чтение.
Далее, можно будет спозиционировать курсор в конец списка и получить номер последней записи. После этого вернуться назад и начать обычный цикл последовательного чтения записей.

Можно сделать ваш запрос как часть сложного запроса. Подсчитать количество записей в подзапросе и выдать это число как самостоятельную колонку в сложном запросе.
...
Рейтинг: 0 / 0
15.01.2008, 09:10
    #35061483
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
gals, можно подробнее про листать?
...
Рейтинг: 0 / 0
15.01.2008, 10:00
    #35061594
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
OlegA67Добрый день. Всех с прошедшими праздниками.
В хранимой процедуре создаю курсор, что- то вроде
Код: plaintext
1.
2.
DECLARE cursor3 CURSOR WITH RETURN FOR SELECT .......;
......
OPEN cursor3;
И в этой же процедуре мне надо знать, кол-во записей в этом курсоре. Как можно узнать это кол-во, не запуская дополнительный запрос с параметром INTOДобрый день.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create procedure count_rows
(
  in  sel_stmt varchar( 1024 )
, in  tmptbl varchar( 16 )
, out rcnt int
)
dynamic result sets  1 
begin
  declare stmt varchar( 1024 );
  declare c1 cursor with return for s1;
  
  set stmt = 
    'declare global temporary table '||tmptbl
  ||' as ('||sel_stmt||') definition only with replace not logged';
  execute immediate stmt;
  set stmt = 
    'select * from final table(insert into '||tmptbl||' '||sel_stmt||') t';
  prepare s1 from stmt;
  open c1;
  GET DIAGNOSTICS rcnt = ROW_COUNT;
end@
...
Рейтинг: 0 / 0
15.01.2008, 12:16
    #35062147
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Mark Barinstein, скажите GET DIAGNOSTICS срабатывает на open cursor?
...
Рейтинг: 0 / 0
15.01.2008, 12:36
    #35062237
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
я призадумался...
Вы хотите использовать так сказать "голый" набор статических команд.
Я, лет 5-6 назад, писал на С, используя CLI. Cursor positioning rules for SQLFetchScroll() (CLI)
Ныне пишу на Java:
Код: plaintext
1.
2.
3.
4.
5.
6.
Statement stmt = con.createStatement(
   ResultSet.TYPE_SCROLL_INSENSITIVE,
   ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs will be scrollable, will not show changes made by others,
// and will be updatable
...
Рейтинг: 0 / 0
15.01.2008, 14:04
    #35062641
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
TORTMark Barinstein, скажите GET DIAGNOSTICS срабатывает на open cursor?В данном случае (select from data-change-table-reference) - да.
Насколько я знаю, в процедурах создаются только non-scrollable курсоры.
...
Рейтинг: 0 / 0
15.01.2008, 17:56
    #35063628
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
А как вам моя вторая идея:
Код: plaintext
1.
2.
3.
4.
with temp_a as (select column1, column2, ... from table_a),
temp_b (size) as (select count(column1) from temp_a)
select temp_a.column1, temp_a.column2, ..., temp_b.size
from temp_a, temp_b
...
Рейтинг: 0 / 0
16.01.2008, 13:13
    #35065225
OlegA67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Mark BarinsteinGET DIAGNOSTICS rcnt = ROW_COUNT;
Почему то у меня всегда rcnt = 0, хотя кол-во записей в курсоре больше нуля. С чем это может быть связано. Версия DB2 8.2
...
Рейтинг: 0 / 0
16.01.2008, 13:33
    #35065316
OlegA67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Я так понял, что GET DIAGNOSTICS rcnt = ROW_COUNT;
отрабатывает только на операторах INSERT, UPDATE, DELETE.
А как мне тогда подсчитать, кол-во записей в курсоре на оператор SELECT
...
Рейтинг: 0 / 0
16.01.2008, 16:11
    #35065933
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
OlegA67Я так понял, что GET DIAGNOSTICS rcnt = ROW_COUNT;
отрабатывает только на операторах INSERT, UPDATE, DELETE.
А как мне тогда подсчитать, кол-во записей в курсоре на оператор SELECT
Насколько я понимаю, потому Марк и привёл пример, который делает вставку во временную таблицу, т.е. в его примере ROW_COUNT вернет действительное кол-во записей в запросе. gals также приводит пример, но его использование зависит от функционала, который Вы закладываете в процедуру. Поскольку получить кол-во записей Вы сможете только после первого FETCH.
Согласно описанию команды GET DISGNOSTICS, она возвращает кол-во обработанных записей в операторах INSERT, UPDATE, DELETE, а в случае PREPARE предполагаемое кол-во записей, что Вы уже навернякка прочитали здесь
...
Рейтинг: 0 / 0
16.01.2008, 17:02
    #35066140
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
OlegA67Почему то у меня всегда rcnt = 0, хотя кол-во записей в курсоре больше нуля. С чем это может быть связано. Версия DB2 8.2Я пробовал это на v9.1.
Вполне вероятно, что на v8 оно по-другому работает, т.к. дока на этот счет ничего конкретного не говорит.
Разбейте 'select * from final table...' на 2 операции:
1. insert в темповую таблицу
1.1. get diagnostics
2. select из темповой таблицы
...
Рейтинг: 0 / 0
17.01.2008, 09:03
    #35067147
OlegA67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Mark Barinstein Разбейте 'select * from final table...' на 2 операции:
1. insert в темповую таблицу
1.1. get diagnostics
2. select из темповой таблицы
Упростил задачу, оставил только insert, и стал анализировать
Код: plaintext
GET DIAGNOSTICS rcnt = ROW_COUNT
, в результате не понял логику, откуда берется значение rcnt. Там где кол-во строк должно быть 0, значение rcnt = 2, где кол-во строк д.б. 5 , значение rcnt = 20. Версия DB2 14 фикспак 8 версии
Vladimir Kiselev получить кол-во записей Вы сможете только после первого FETCH
Если идти по пути предложенному gals, то после одного FETCH, кол-во записей возвращаемое курсором, будет на одну запись меньше. Как я понял возможности, вернуться на начало курсора нет. Что бы пользователь получил весь курсор, надо повторно его открыть. Получается что запрос будет выполняться два раза, тогда не имеет смыла в этом сложном запросе.

Вечный вопрос что делать?
...
Рейтинг: 0 / 0
17.01.2008, 12:35
    #35068000
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Прям меня заинтриговали :) Да, как Марк и говорил, на моей 9.1.3 тоже всё работает прекрасно. К сожалению восьмерки нет под рукой, проверить не могу, к тому же мы с семерки на 9 перешли сразу.
Вот такой тестовый скрипт получился:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
CONNECT TO TESTER@

drop procedure my.count_rows@

create procedure my.count_rows
(
  in  sel_stmt varchar( 1024 )
, in  tmptbl varchar( 16 )
, out rcnt int
)
dynamic result sets  1 
begin
  declare stmt varchar( 1024 );
  declare c1 cursor with return for s1;
  
  set stmt = 
    'declare global temporary table '||tmptbl
  ||' as ('||sel_stmt||') definition only with replace not logged';
  execute immediate stmt;
  set stmt = 
    'select * from final table(insert into '||tmptbl||' '||sel_stmt||') t';
  prepare s1 from stmt;
  open c1;
  GET DIAGNOSTICS rcnt = ROW_COUNT;
end@

DROP TABLE MY.TORT@

CREATE TABLE MY.TORT
(
  ID         INT NOT NULL PRIMARY KEY,
  NAME    VARCHAR( 200 ) NOT NULL
)@

INSERT INTO MY.TORT VALUES(  1 , 'First row' )@
INSERT INTO MY.TORT VALUES(  2 , 'Second row' )@
INSERT INTO MY.TORT VALUES(  3 , 'Third row' )@
INSERT INTO MY.TORT VALUES(  4 , 'Fourth row' )@

DROP TABLESPACE torts1@

COMMIT@

CREATE USER TEMPORARY TABLESPACE torts1 MANAGED BY SYSTEM USING ('torts')@

CALL MY.COUNT_ROWS('SELECT * FROM MY.TORT','session.TMPT',?)@

ROLLBACK@

CONNECT RESET@

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  Значение выходных параметров
  --------------------------
  Имя параметра   : RCNT
  Значение парам. :  4 


  Набор результатов  1 
  --------------

  ID          NAME                                                                                                                                                                                                    
             1  First row                                                                                                                                                                                               
             2  Second row                                                                                                                                                                                              
             3  Third row                                                                                                                                                                                               
             4  Fourth row                                                                                                                                                                                              

   4  записей выбрано.

  Статус возврата =  0 
...
Рейтинг: 0 / 0
17.01.2008, 13:58
    #35068390
OlegA67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во строк в курсоре.
Спасибо Mark Barinstein и Vladimir Kiselev за участие в моей проблеме .
Но на 8 версии у меня так и не удалось получить такой же результат как в скрипте у Vladimir Kiselev, может руки кривые :о)).
Зато после долгих мучений получилось, сделать так, как посоветовал Mark Barinstein с разбивкой на два этапа
INSERT и SELECT. После INSERT во временную таблицу строка
Код: plaintext
GET DIAGNOSTICS rcnt = ROW_COUNT
отрабатывает корректно. В общем добился чего хотел, еще раз всем спасибо.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Кол-во строк в курсоре. / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]