powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка при вызове одной функции из другой.
3 сообщений из 3, страница 1 из 1
Ошибка при вызове одной функции из другой.
    #39281701
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;
...
Рейтинг: 0 / 0
Ошибка при вызове одной функции из другой.
    #39281711
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
DROP function IF EXISTS pg_temp.test1();
CREATE OR REPLACE function pg_temp.test1()
RETURNS refcursor
AS 
$$
DECLARE 
	--cur1 cursor FOR select 1;
	cur1 refcursor;
BEGIN
	open cur1 FOR select 1;	
	return cur1;
END;
$$
language plpgsql;

CREATE OR REPLACE function pg_temp.test2()
RETURNS VOID 
AS 
$$
DECLARE 
	--cur1 cursor FOR select 1;
	cur1 refcursor;
BEGIN
	open cur1 FOR select 1;	
END;
$$
language plpgsql;

SELECT pg_temp.test2(), pg_temp.test1();



хотя в вашем случае само использование курсоров -- лишняя операция. Достаточно было сказать FOR .... IN SELECT .... LOOP
...
Рейтинг: 0 / 0
Ошибка при вызове одной функции из другой.
    #39281791
FndCentu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое Вам спасибо.
Проблема разрешилась.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ошибка при вызове одной функции из другой.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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