Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Нужна помощь в ХП / 6 сообщений из 6, страница 1 из 1
07.10.2008, 13:31
    #35580264
LeonidMV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Добрый день!

Опыта по написанию ХП еще маловато. Пересмотрел весь форум - ничего для себя не нашел.

Итак, имеем некую ХП :
...
DECLARE GLOBAL TEMPORARY TABLE SESSION.TABOS1101
(...
,T_FULLCOD DECIMAL (8,0) NOT NULL
...
) ON COMMIT PRESERVE ROWS
NOT LOGGED
WITH REPLACE
;
CREATE INDEX SESSION.TOS_FULLCOD_IDX ON SESSION.TABOS1101 (T_FULLCOD ASC);

-- Читаем Table_1 и заполняем временную таблицу
BEGIN
DECLARE A_END INTEGER;
DECLARE Cur_1 CURSOR ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET A_END = 1;
OPEN Cur_1;
SET A_END = 0;
FETCH FROM Cur_1 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
WHILE (A_END = 0) DO
-- Здесь собственно анализ Table_1 и Insert/Update во временную таблицу
SET A_END = 0;
FETCH FROM Cur_1 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
END WHILE;
CLOSE Cur_1;
END;

-- Читаем Table_2 и заполняем временную таблицу
BEGIN
DECLARE B_END INTEGER;
DECLARE Cur_2 CURSOR ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET B_END = 1;
OPEN Cur_2;
SET B_END = 0;
FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
WHILE (B_END = 0) DO
-- Здесь собственно анализ Table_2 и Insert/Update во временную таблицу
SET B_END = 0;
FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
END WHILE;
CLOSE Cur_2;
END;
...
Ну далее собственно читаем то, что есть во временной таблице (это уже непринципиально).

Вопрос:
1) В таком варианте отрабатывает только первый BEGIN (по Table_1)
2) Если закоментировать первый BEGIN (по Table_1), то прекрасно отрабатывает второй BEGIN (по Table_2)
2) Если закоментировать второй BEGIN (по Table_2), то прекрасно отрабатывает первый BEGIN (по Table_1), т.е. как в случае 1)

Что у меня не так?

С уважением Леонид
...
Рейтинг: 0 / 0
07.10.2008, 14:02
    #35580369
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Добрый день.

Как вы определяете, отрабатывает какой-то BEGIN или нет?
Может, 1-й делает такие изменения в базовых таблицах, что 2-й начинает ничего не вставлять/изменять после этого?
...
Рейтинг: 0 / 0
07.10.2008, 14:11
    #35580401
LeonidMV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Mark BarinsteinДобрый день.

Как вы определяете, отрабатывает какой-то BEGIN или нет?
Может, 1-й делает такие изменения в базовых таблицах, что 2-й начинает ничего не вставлять/изменять после этого?

Достаточно просто: CALL PROC - и вижу результаты, какие столбцы заполнены, какие нет (скажем первый пять столбцов - это результат обработки Table_1; следующие пять - Table_2)
...
Рейтинг: 0 / 0
07.10.2008, 14:28
    #35580470
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Вставьте отладочные set out_par команды и посмотрите, до[одит ли у вас дело до команд изменения:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create proc (..., out_par varchar( 20 ))
...
OPEN Cur_2;
set out_par='cursor opened';
FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
WHILE (B_END =  0 ) DO
-- Здесь собственно анализ Table_2 и Insert/Update во временную таблицу
 ...
 set out_par = 'record updated';
 ...
 SET B_END =  0 ;
 FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
END WHILE;

Или из data studio в отладке запустите процедуру.
...
Рейтинг: 0 / 0
07.10.2008, 15:11
    #35580627
LeonidMV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Mark BarinsteinВставьте отладочные set out_par команды и посмотрите, до[одит ли у вас дело до команд изменения:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create proc (..., out_par varchar( 20 ))
...
OPEN Cur_2;
set out_par='cursor opened';
FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
WHILE (B_END =  0 ) DO
-- Здесь собственно анализ Table_2 и Insert/Update во временную таблицу
 ...
 set out_par = 'record updated';
 ...
 SET B_END =  0 ;
 FETCH FROM Cur_2 INTO v_FULLCOD, v_CODSD, v_GRPOSTICK;
END WHILE;

Или из data studio в отладке запустите процедуру.

Идея понятна. Буду пробовать. Точнее уже на скорую руку попробовал. Что-то страннное. Все попадает, но как-то не так. Внимательно еще изучу сам код.
А вот Data Studio - нет. Только голимый DB2 и Far - все что есть...Пока...
...
Рейтинг: 0 / 0
07.10.2008, 17:09
    #35581146
LeonidMV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в ХП
Спасибо за подсказки. Проблема оказалась в следующем:
DECLARE GLOBAL TEMPORARY TABLE SESSION.TABOS1101
( T_FOPFR SMALLINT
, T_FULLCOD DECIMAL (8,0) NOT NULL
, T_NAMSD VARCHAR (100) NOT NULL
, T_COL3 SMALLINT
, T_COL4 SMALLINT
, T_COL5 SMALLINT
, T_COL6 SMALLINT
, T_COL7 SMALLINT
, T_COL8 SMALLINT
, T_COL9 SMALLINT
, T_COL10 SMALLINT
, T_COL11 SMALLINT
, T_COL12 SMALLINT
, T_COL13 SMALLINT
, T_COL14 SMALLINT
, T_COL15 SMALLINT
, T_COL16 SMALLINT
) ON COMMIT PRESERVE ROWS
NOT LOGGED
WITH REPLACE
;

-- Обновление в первом BEGIN-е
IF EXISTS (SELECT T_FULLCOD FROM SESSION.TABOS1101 WHERE T_FULLCOD=v_FULLCOD) THEN
UPDATE SESSION.TABOS1101 SET (T_COL3, T_COL4, T_COL5, T_COL6, T_COL7)=
(T_COL3+v_COL3, T_COL4+v_COL4, T_COL5+v_COL5,
T_COL6+v_COL6, T_COL7+v_COL7)
WHERE T_FULLCOD=v_FULLCOD;
ELSE
INSERT INTO SESSION.TABOS1101 (
T_FOPFR, T_FULLCOD, T_NAMSD,
T_COL3, T_COL4, T_COL5, T_COL6, T_COL7,
T_COL10, T_COL11, T_COL12, T_COL13, T_COL14 ) VALUES (
v_FOPFR, v_FULLCOD, v_NAMSD,
v_COL3, v_COL4, v_COL5, v_COL6, v_COL7,
0, 0, 0, 0, 0);
END IF;

-- Обновление во втором BEGIN-е
IF EXISTS (SELECT T_FULLCOD FROM SESSION.TABOS1101 WHERE T_FULLCOD=v_FULLCOD) THEN
UPDATE SESSION.TABOS1101 SET (T_COL10, T_COL11, T_COL12,
T_COL13,T_COL14)=
(T_COL10+v_COL10,
T_COL11+v_COL11, T_COL12+v_COL12,
T_COL13+v_COL13, T_COL14+v_COL14)
WHERE T_FULLCOD=v_FULLCOD;
ELSE
INSERT INTO SESSION.TABOS1101 (
T_FOPFR, T_FULLCOD, T_NAMSD,
T_COL3, T_COL4, T_COL5, T_COL6, T_COL7,
T_COL10, T_COL11, T_COL12, T_COL13,
T_COL14) VALUES (
v_FOPFR, v_FULLCOD, v_NAMSD,
0, 0, 0, 0, 0,
v_COL10, v_COL11, v_COL12, v_COL13,
v_COL14);
END IF;

Красным выделен код, который отсутствовал, т.е. инициализировал при добавлении записи, отстутствующие 0, а то в противном случае сложения не получалось. Вот уж не знал, что значение NULL = NULL+значение, в оконцовке даст NULL
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Нужна помощь в ХП / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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