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

Ниже процедурка, которая путем вызова системной ХП 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
CALL ADMIN_CMD в цикле по курсору
    #36415266
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
db2тестЕсли убрать вызов ADMIN_CMD, то отрабатывает. Но хочется реорг запускать. :)
Как бы её забороть ?Добрый день.
Похоже на то, что курсор внутри REORGCHK_TB_STATS открывается без указания with hold, а reorg делает commit перед выполнением, поэтому курсор закрывается.
Выход может быть в том, чтобы переписывать result set процедуры REORGCHK_TB_STATS во временную таблицу, затем открывать with hold курсор на неё, и уже внутри цикла по этому курсору делать вызов admin_cmd.
...
Рейтинг: 0 / 0
CALL ADMIN_CMD в цикле по курсору
    #36416404
db2тест
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
CALL ADMIN_CMD в цикле по курсору
    #36417271
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
CALL ADMIN_CMD в цикле по курсору
    #36418362
db2тест
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

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


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