Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2897
Блог
IBM Informix Dynamic Server Version 11.10.FC2TL
Проверяем работоспособность рекурсивного вызова ХП:
(предупреждаю заранее: некоторые вариации эксперимента ложили сервер - особенно при попытках TRACE ON)

(с)

CREATE TEMP TABLE tmp_tb_check_recurs(
id SERIAL
, p_cycle_num INTEGER,
, i INTEGER,
, v VARCHAR(30)
) WITH NO LOG;

CREATE PROCEDURE "informix".tmp_sp_check_recurs(
p_cycle_num INT -- текущий счетчик
, p_max_count INT -- ограничитель рекурсии
) RETURNING
INT;

DEFINE v_res INT;

LET v_res = 0;

LET p_cycle_num = p_cycle_num + 1;

INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) VALUES (p_cycle_num, 1, 'старт');

IF (p_cycle_num > p_max_count) THEN
INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) VALUES (p_cycle_num, 2, 'if - before return');
RETURN -1;
END IF;

FOREACH
EXECUTE PROCEDURE tmp_sp_check_recurs(p_cycle_num, p_max_count)
INTO v_res

INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v)
VALUES (p_cycle_num, 5, 'EXECUTE PROCEDURE');
EXIT FOREACH;
END FOREACH;

INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) VALUES (p_cycle_num, 8, 'END');
RETURN v_res;

END PROCEDURE

EXECUTE PROCEDURE tmp_sp_check_recurs(1, 200);

SELECT * FROM tmp_tb_check_recurs;

ХП должна вернуть -1, а во временной таблице должны были бы получить результат в стиле

id	p_cycle_num	i	v
1	1	1	старт
2	2	1	старт
...
100	200	1	старт
101	201	1	старт
102	201	2	if - before return
103	200	5	EXECUTE PROCEDURE
104	200	8	END
..
599	2	5	EXECUTE PROCEDURE
600	2	8	END
601	1	5	EXECUTE PROCEDURE
602	1	8	END

А получаем NULL, никаких сообщений об ошибке, и во временной

автор
id p_cycle_num i v
1 1 1 старт
2 2 1 старт
..
177 177 1 старт
178 178 1 старт



П.С.: для тех, кто по окончанию экспериментов чистит за собой хвосты:

(с)
DROP TABLE tmp_tb_check_recurs;
DROP PROCEDURE "informix".tmp_sp_check_recurs(INT, INT);
27 мар 08, 16:18    [5468806]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
АнатоЛой


  FOREACH
    EXECUTE PROCEDURE tmp_sp_check_recurs(p_cycle_num, p_max_count)
      INTO v_res

    INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) 
       VALUES (p_cycle_num, 5, 'EXECUTE PROCEDURE');
    EXIT FOREACH;
  END FOREACH;


а зачем FOREACH?
 EXECUTE PROCEDURE tmp_sp_check_recurs(p_cycle_num, p_max_count) INTO v_res;
 INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) VALUES (p_cycle_num, 5, 'EXECUTE PROCEDURE');
2 апр 08, 14:49    [5492606]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2897
Блог
Журавлев Денис

а зачем FOREACH?
 EXECUTE PROCEDURE tmp_sp_check_recurs(p_cycle_num, p_max_count) INTO v_res;
 INSERT INTO tmp_tb_check_recurs (p_cycle_num, i, v) VALUES (p_cycle_num, 5, 'EXECUTE PROCEDURE');

Остался от оригинальной процедуры, которая возвращала данные WITH RESUME'ом...
Расклада с рекурсией это менять не дожно... Но я, конечно же, проверю :)
2 апр 08, 15:35    [5492988]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
без foreach, везде разный результат 10.00.UC3 11.10.UC1 11.10.UC2

onstat -
IBM Informix Dynamic Server Version 10.00.UC3 -- On-Line -- Up 00:02:30 -- 85096 Kbytes

(expression)
-1

id p_cycle_num i v
1 2 1 start
2 3 1 start
3 4 1 start
...
201 201 2 if - before return
202 200 5 EXECUTE PROCEDURE
203 200 8 END
204 199 5 EXECUTE PROCEDURE
205 199 8 END
...
595 4 8 END
596 3 5 EXECUTE PROCEDURE
597 3 8 END
598 2 5 EXECUTE PROCEDURE
599 2 8 END

-------------------------------------------------------------------------------
onstat -
IBM Informix Dynamic Server Version 11.10.UC1 -- On-Line -- Up 00:03:31 -- 47188 Kbytes

(expression)


id p_cycle_num i v

1 2 1 start
2 3 1 start
3 4 1 start
4 5 1 start
5 5 5 EXECUTE PROCEDURE
6 5 8 END
7 4 5 EXECUTE PROCEDURE
8 4 8 END
9 3 5 EXECUTE PROCEDURE
10 3 8 END
11 2 5 EXECUTE PROCEDURE
12 2 8 END

-------------------------------------------------------------------------------
onstat -
IBM Informix Dynamic Server Version 11.10.UC2 -- On-Line -- Up 00:00:14 -- 47188 Kbytes

id p_cycle_num i v

1 2 1 start
2 3 1 start
3 4 1 start
4 5 1 start
5 6 1 start
6 7 1 start
7 8 1 start
8 9 1 start
9 10 1 start
10 11 1 start
11 12 1 start
12 13 1 start
13 14 1 start
14 15 1 start
15 16 1 start
16 17 1 start
17 18 1 start
18 18 5 EXECUTE PROCEDURE
19 18 8 END
20 17 5 EXECUTE PROCEDURE
21 17 8 END
22 16 5 EXECUTE PROCEDURE
23 16 8 END
24 15 5 EXECUTE PROCEDURE
25 15 8 END
...
36 9 5 EXECUTE PROCEDURE
37 9 8 END
38 8 5 EXECUTE PROCEDURE
39 8 8 END
40 7 5 EXECUTE PROCEDURE
...
49 3 8 END
50 2 5 EXECUTE PROCEDURE
51 2 8 END

2 апр 08, 16:15    [5493321]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
что-то испортили с рекурсивными процедурами имеющими RETURNING
2 апр 08, 17:34    [5494050]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
GVF112GVF
Guest
Уже исправили в IDS 11.50 !!!

С уважением,
Вадим.
14 май 08, 22:48    [5664796]     Ответить | Цитировать Сообщить модератору
 Re: IDS 11.10.FC2TL: нерабочая рекурсия ХП  [new]
zaiets
Guest
И не только там исправлено.
В 11.10.FC2W1 тоже исправлено.
15 май 08, 17:20    [5669757]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить