Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / CALL ADMIN_CMD в цикле по курсору / 5 сообщений из 5, страница 1 из 1
15.01.2010, 11:45
    #36411729
db2тест
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CALL ADMIN_CMD в цикле по курсору
Добрый день.

Ниже процедурка, которая путем вызова системной ХП REORGCHK_TB_STATS получает список таблиц для реорга и пытается запускать его через XП ADMIN_CMD в цикле:

Код: 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.
CREATE PROCEDURE "DB2ADMIN"."REORGTABS" () 
SPECIFIC REORGTABS
P1: BEGIN 
DECLARE procresult RESULT_SET_LOCATOR VARYING; 
DECLARE TABLE_SCHEMA VARCHAR( 128 ); 
DECLARE TABLE_NAME VARCHAR( 128 );
DECLARE P_REORG_TEXT VARCHAR( 256 );
DECLARE DATAPART_NAME VARCHAR( 128 );
DECLARE SQLSTATE CHAR( 5 ) DEFAULT '00000'; 
DECLARE CARD INTEGER; 
DECLARE OVERFLOW INTEGER; 
DECLARE NPAGES INTEGER; 
DECLARE FPAGES INTEGER; 
DECLARE ACTIVE_BLOCKS INTEGER; 
DECLARE TSIZE BIGINT; 
DECLARE F1 FLOAT; 
DECLARE F2 FLOAT; 
DECLARE F3 FLOAT; 
DECLARE REORG CHAR( 3 ); 
DECLARE reorgcmd VARCHAR( 512 ); 

CALL REORGCHK_TB_STATS('T','ALL'); 

ASSOCIATE RESULT SET LOCATOR (procresult) WITH PROCEDURE REORGCHK_TB_STATS; 

ALLOCATE rsCur CURSOR FOR RESULT SET procresult; 

FETCH rsCur INTO TABLE_SCHEMA ,TABLE_NAME , DATAPART_NAME, CARD ,OVERFLOW ,NPAGES ,FPAGES ,ACTIVE_BLOCKS ,TSIZE ,F1 ,F2 ,F3 ,REORG;
WHILE ( SQLSTATE = '00000' ) DO

IF (LOCATE('*',REORG) >  0 ) THEN 
SET reorgcmd = 'reorg table "'||RTRIM(TABLE_SCHEMA)||'"."'||RTRIM(TABLE_NAME)||'"';
CALL SYSPROC.ADMIN_CMD(reorgcmd); 
INSERT INTO DB2ADMIN.TEST (TABLE_SCHEMA, TABLE_NAME) VALUES(TABLE_SCHEMA, TABLE_NAME); 
END IF; 

FETCH FROM rsCur INTO TABLE_SCHEMA ,TABLE_NAME , DATAPART_NAME, CARD ,OVERFLOW ,NPAGES ,FPAGES ,ACTIVE_BLOCKS ,TSIZE ,F1 ,F2 ,F3 ,REORG; 
END WHILE;
END P1; 

При её вызове получается :
Код: plaintext
1.
2.
3.
4.
CALL DB2ADMIN.REORGTABS();
SQL0501N  The cursor specified in a FETCH statement or CLOSE statement is not 
open or a cursor variable in a cursor scalar function reference is not open.  
SQLSTATE= 24501 

Если убрать вызов ADMIN_CMD, то отрабатывает. Но хочется реорг запускать. :)
Как бы её забороть ?

P.S. DB2 9.7.1
...
Рейтинг: 0 / 0
18.01.2010, 09:57
    #36415266
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CALL ADMIN_CMD в цикле по курсору
db2тестЕсли убрать вызов ADMIN_CMD, то отрабатывает. Но хочется реорг запускать. :)
Как бы её забороть ?Добрый день.
Похоже на то, что курсор внутри REORGCHK_TB_STATS открывается без указания with hold, а reorg делает commit перед выполнением, поэтому курсор закрывается.
Выход может быть в том, чтобы переписывать result set процедуры REORGCHK_TB_STATS во временную таблицу, затем открывать with hold курсор на неё, и уже внутри цикла по этому курсору делать вызов admin_cmd.
...
Рейтинг: 0 / 0
18.01.2010, 16:55
    #36416404
db2тест
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CALL ADMIN_CMD в цикле по курсору
Mark Barinstein,
Спасибо, но видимо дело не в этом. Переписал так, чтобы список нужных таблиц брался не из резалтсета процедуры REORGCHK_TB_STAT, а просто из локальной таблицы.

Код: 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.
CREATE PROCEDURE "DB2ADMIN"."REORGTABS" ( ) 
  SPECIFIC "DB2ADMIN"."REORGTABS"
P1: BEGIN 
DECLARE procresult RESULT_SET_LOCATOR VARYING; 
DECLARE TABLE_SCHEMA VARCHAR( 128 ); 
DECLARE TABLE_NAME VARCHAR( 128 );
DECLARE P_REORG_TEXT VARCHAR( 256 );
DECLARE DATAPART_NAME VARCHAR( 128 );
DECLARE SQLSTATE CHAR( 5 ) DEFAULT '00000'; 
DECLARE CARD INTEGER; 
DECLARE OVERFLOW INTEGER; 
DECLARE NPAGES INTEGER; 
DECLARE FPAGES INTEGER; 
DECLARE ACTIVE_BLOCKS INTEGER; 
DECLARE TSIZE BIGINT; 
DECLARE F1 FLOAT; 
DECLARE F2 FLOAT; 
DECLARE F3 FLOAT; 
DECLARE REORG CHAR( 3 ); 
DECLARE reorgcmd VARCHAR( 512 ); 

DECLARE RCUR CURSOR WITH HOLD FOR SELECT * FROM DB2ADMIN.TEST;
OPEN RCUR;

FETCH RCUR INTO TABLE_SCHEMA ,TABLE_NAME;
WHILE ( SQLSTATE = '00000' ) DO
SET reorgcmd = 'reorg table "'||RTRIM(TABLE_SCHEMA)||'"."'||RTRIM(TABLE_NAME)||'"';
CALL SYSPROC.ADMIN_CMD(reorgcmd);
FETCH RCUR INTO TABLE_SCHEMA ,TABLE_NAME;
END WHILE;

END P1;

Результат такой же. Странно как-то.
...
Рейтинг: 0 / 0
19.01.2010, 09:52
    #36417271
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CALL ADMIN_CMD в цикле по курсору
db2тест,

REORG настолько суров, что закрывает все курсоры, даже WITH HOLD:
---
Be sure to complete all database operations and release all locks before invoking REORG TABLE. This can be done by issuing a COMMIT after closing all cursors opened WITH HOLD, or by issuing a ROLLBACK. After reorganizing a table, use RUNSTATS to update the table statistics, and REBIND to rebind the packages that use this table. The reorganize utility will implicitly close all the cursors .
---
т.е. можно делать типа такого что-то:
Код: plaintext
1.
2.
3.
4.
5.
L: loop
  select 'reorg table "'||RTRIM(TABLE_SCHEMA)||'"."'||RTRIM(TABLE_NAME)||'"' into reorgcmd
  from old table(delete from (select table_schema, table_name from DB2ADMIN.TEST fetch first  1  row only));
  if ( SQLSTATE <> '00000' ) then leave L; end if;
  CALL SYSPROC.ADMIN_CMD(reorgcmd);
end loop L;
...
Рейтинг: 0 / 0
19.01.2010, 15:40
    #36418362
db2тест
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CALL ADMIN_CMD в цикле по курсору
Mark Barinstein,

:) Изящно.
Все работает.
Спасибо!
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / CALL ADMIN_CMD в цикле по курсору / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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