Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибка при вызове одной функции из другой.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Помогите, пожалуйста, решить проблему. Опишу только суть проблемы. Есть две функции - функция f_01 и f_02 . Из функции f_01 вызывается функция f_02 . Эти функции писали разные разработчики. Как в той так и в другой функции используются курсоры. По несчастливой случайности курсорам было присвоено одно и то же имя cur_01 о обеих функциях. В результате получаю ошибку : cursor "cur_01" already in use; Может быть, есть какая-то системная переменная, которая отвечает за глобальность имен курсоров ? Как можно обойти эту ситуацию? Представить себе, что нужно договариваться со всеми разработчиками о именах курсоров вообще нелепо. Спасибо. Ниже привожу тексты функций, отражающие только суть проблемы. CREATE OR REPLACE FUNCTION f_01() RETURNS integer AS $BODY$ DECLARE MIR_id bigint; TEST_value int; GET_value int; def_text CONSTANT text = 'Процедура f_01 --->>> '; text_ERR1 text; text_ERR2 text; text_ERR3 text; /* Курсор по REDMINE_MIRROR.TABLE_NAME */ cur_01 CURSOR FOR SELECT id FROM redmine_production.members LIMIT 2; BEGIN TEST_value = 0; FOR recordvar IN cur_01 LOOP BEGIN MIR_id = recordvar.id; SELECT f_01() INTO GET_value; TEST_value = TEST_value + GET_value; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS text_ERR1 = MESSAGE_TEXT, text_ERR2 = PG_EXCEPTION_DETAIL, text_ERR3 = PG_EXCEPTION_HINT; INSERT INTO redmine_production."SYNC_ERROR_LOG" (message) VALUES (def_text || text_ERR1 || '; ' || text_ERR2 || '; ' || text_ERR3); END; END LOOP; RETURN TEST_value; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION f_02() RETURNS integer AS $BODY$ DECLARE MIR_id bigint; TEST_value int; def_text CONSTANT text = 'Процедура f_02 --->>> '; text_ERR1 text; text_ERR2 text; text_ERR3 text; /* Курсор по REDMINE_MIRROR.TABLE_NAME */ cur_01 CURSOR FOR SELECT id FROM redmine_production.issues LIMIT 2; BEGIN TEST_value = 0; FOR recordvar IN cur_01 LOOP BEGIN MIR_id = recordvar.id; TEST_value = TEST_value + 1; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS text_ERR1 = MESSAGE_TEXT, text_ERR2 = PG_EXCEPTION_DETAIL, text_ERR3 = PG_EXCEPTION_HINT; INSERT INTO redmine_production."SYNC_ERROR_LOG" (message) VALUES (def_text || text_ERR1 || '; ' || text_ERR2 || '; ' || text_ERR3); END; END LOOP; RETURN TEST_value; END; $BODY$ LANGUAGE plpgsql; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 10:29 |
|
||
|
Ошибка при вызове одной функции из другой.
|
|||
|---|---|---|---|
|
#18+
FndCentuДобрый день. Помогите, пожалуйста, решить проблему. Опишу только суть проблемы. Есть две функции - функция f_01 и f_02 . Из функции f_01 вызывается функция f_02 . Эти функции писали разные разработчики. Как в той так и в другой функции используются курсоры. По несчастливой случайности курсорам было присвоено одно и то же имя cur_01 о обеих функциях. В результате получаю ошибку : cursor "cur_01" already in use; Может быть, есть какая-то системная переменная, которая отвечает за глобальность имен курсоров ? Как можно обойти эту ситуацию? Представить себе, что нужно договариваться со всеми разработчиками о именах курсоров вообще нелепо. Спасибо. Ниже привожу тексты функций, отражающие только суть проблемы. CREATE OR REPLACE FUNCTION f_01() RETURNS integer AS $BODY$ DECLARE MIR_id bigint; TEST_value int; GET_value int; def_text CONSTANT text = 'Процедура f_01 --->>> '; text_ERR1 text; text_ERR2 text; text_ERR3 text; /* Курсор по REDMINE_MIRROR.TABLE_NAME */ cur_01 CURSOR FOR SELECT id FROM redmine_production.members LIMIT 2; BEGIN TEST_value = 0; FOR recordvar IN cur_01 LOOP BEGIN MIR_id = recordvar.id; SELECT f_01() INTO GET_value; TEST_value = TEST_value + GET_value; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS text_ERR1 = MESSAGE_TEXT, text_ERR2 = PG_EXCEPTION_DETAIL, text_ERR3 = PG_EXCEPTION_HINT; INSERT INTO redmine_production."SYNC_ERROR_LOG" (message) VALUES (def_text || text_ERR1 || '; ' || text_ERR2 || '; ' || text_ERR3); END; END LOOP; RETURN TEST_value; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION f_02() RETURNS integer AS $BODY$ DECLARE MIR_id bigint; TEST_value int; def_text CONSTANT text = 'Процедура f_02 --->>> '; text_ERR1 text; text_ERR2 text; text_ERR3 text; /* Курсор по REDMINE_MIRROR.TABLE_NAME */ cur_01 CURSOR FOR SELECT id FROM redmine_production.issues LIMIT 2; BEGIN TEST_value = 0; FOR recordvar IN cur_01 LOOP BEGIN MIR_id = recordvar.id; TEST_value = TEST_value + 1; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS text_ERR1 = MESSAGE_TEXT, text_ERR2 = PG_EXCEPTION_DETAIL, text_ERR3 = PG_EXCEPTION_HINT; INSERT INTO redmine_production."SYNC_ERROR_LOG" (message) VALUES (def_text || text_ERR1 || '; ' || text_ERR2 || '; ' || text_ERR3); END; END LOOP; RETURN TEST_value; END; $BODY$ LANGUAGE plpgsql; use unbound cursor, Luke! Код: sql 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. хотя в вашем случае само использование курсоров -- лишняя операция. Достаточно было сказать FOR .... IN SELECT .... LOOP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2016, 10:53 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39281711&tid=1997090]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 17ms |
| total: | 260ms |

| 0 / 0 |
