Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Добрый день! Опыта по написанию ХП еще маловато. Пересмотрел весь форум - ничего для себя не нашел. Итак, имеем некую ХП : ... 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) Что у меня не так? С уважением Леонид ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 13:31 |
|
||
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Добрый день. Как вы определяете, отрабатывает какой-то BEGIN или нет? Может, 1-й делает такие изменения в базовых таблицах, что 2-й начинает ничего не вставлять/изменять после этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 14:02 |
|
||
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinДобрый день. Как вы определяете, отрабатывает какой-то BEGIN или нет? Может, 1-й делает такие изменения в базовых таблицах, что 2-й начинает ничего не вставлять/изменять после этого? Достаточно просто: CALL PROC - и вижу результаты, какие столбцы заполнены, какие нет (скажем первый пять столбцов - это результат обработки Table_1; следующие пять - Table_2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 14:11 |
|
||
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Вставьте отладочные set out_par команды и посмотрите, до[одит ли у вас дело до команд изменения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Или из data studio в отладке запустите процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 14:28 |
|
||
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinВставьте отладочные set out_par команды и посмотрите, до[одит ли у вас дело до команд изменения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Или из data studio в отладке запустите процедуру. Идея понятна. Буду пробовать. Точнее уже на скорую руку попробовал. Что-то страннное. Все попадает, но как-то не так. Внимательно еще изучу сам код. А вот Data Studio - нет. Только голимый DB2 и Far - все что есть...Пока... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 15:11 |
|
||
|
Нужна помощь в ХП
|
|||
|---|---|---|---|
|
#18+
Спасибо за подсказки. Проблема оказалась в следующем: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 17:09 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35580470&tid=1603655]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 346ms |

| 0 / 0 |
