powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / конвертация refcursor -> setof
16 сообщений из 16, страница 1 из 1
конвертация refcursor -> setof
    #34049607
есть стороняя функция xxx.client_xxx- возвращает REFCURSOR
У меня прога VFP и ODBC 7.03 не умеет работать с REFCURSOR
Хочу написать конвертер refcursor2setof типа :
drop FUNCTION experian.proba();
CREATE FUNCTION experian.proba() RETURNS SETOF record AS
'
DECLARE
declare
r record;
ref_1 refcursor ;
BEGIN
open ref_1 for select * from xxx.client_xxx(''3909'',''2006-10-12'');


fetch ref_1 into r;
return next r;
END;
'
LANGUAGE plpgsql;

и немогу въехать как преоброзовать на стороне POSTGRE
с REFCURSOR раньше не сталкивался .... Помогите...
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34067905
J.W.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create function test() returns setof record as $$
declare
r     record;
ref_1 refcursor;

begin

ref_1 := xxx.client_xxx();

loop
  fetch ref_1 into r;
  
  if (not FOUND)
  then
    exit;
  end if;
  
  return next r;
end loop;

end;
$$ language plpgsql;
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34069046
Спасибо J.W.
Попробовал но получил вот такой ответ ,
ERROR: a column definition list is required for functions returning "record" похоже не соответсвие видов
возвращаемого аргумента хочу получить setof как курсор а некак запись.
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34069870
J.W.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно указать тип полей для возвращаемых записей. Например, если курсор возвращаемый ф-ией xxx.client_xxx(), открывается для рекордсета с полями (ID int4, CODE varchar), то вызов должен выглядеть так:
Код: plaintext
select * from test() as (ID int4, CODE varchar)
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34070678
Хочу получить одну колонку value
select value from experian.test() as (value text)

вот такая бяка :

ERROR: control reached end of function without RETURN
CONTEXT: PL/pgSQL function "test"
Чего то я не догоняю ......
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34071098
J.W.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо, рекордсет для курсора пустой, который возвращает xxx.client_xxx(). Чтобы не было ошибки в таком случае и возвращался просто пустой рекордсет - нужно исправить в функции на:
Код: plaintext
1.
2.
3.
  if (not FOUND)
  then
    return;
  end if;
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640041
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня при такой конвертации пишет следующее:
ERROR: wrong record type supplied in RETURN NEXT

Код: plaintext
1.
2.
3.
4.
	loop
	fetch rc into r;
	return next r;
	end loop;

.. в чём моя ошибка??


postgres 7.4.7
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640325
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.W.Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
  ...
  return next r;
end loop;

end;
$$ language plpgsql;


Пропустили финальный RETURN:
Код: plaintext
1.
2.
3.
4.
5.
6.
  ...
  return next r;
end loop;
  return;
end;
$$ language plpgsql;
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640504
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не в этом ошибка, ошибка в RETURN NEXT.. и финальный RETURN стоял..

ERROR: wrong record type supplied in RETURN NEXT
КОНТЕКСТ: PL/pgSQL function "test_get" line 40 at return next
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640601
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AcubedНет, не в этом ошибка, ошибка в RETURN NEXT.. и финальный RETURN стоял..

ERROR: wrong record type supplied in RETURN NEXT
КОНТЕКСТ: PL/pgSQL function "test_get" line 40 at return next

Покажите полный исходник функции
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640642
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CREATE OR REPLACE FUNCTION test_get()
  RETURNS SETOF record AS
'declare
	var_get_id int4;
	var_get_count int4;
	rc REFCURSOR;
	r record;
begin
	update vw_sms_del set vw_msg_status = vw_msg_status + 1000000;
	insert into tesmegets default values;
	var_get_id := currval(''tesmegets_id_get_seq'');
	update tesmegets set timediff = datediff(''second'', get_date, localtimestamp) where id_get = var_get_id-1;

	update tmsg_sms set msg_status = msg_status + 10000, get_id = var_get_id 
	from vw_sms_get where tmsg_sms.msg_id = vw_sms_get.msg_id;

	GET DIAGNOSTICS var_get_count = ROW_COUNT;

	update tesmegets set get_count = var_get_count where id_get = var_get_id;

	if var_get_count = 0 then var_get_count := 0;
	end if;

	var_get_count:=1;	
	
	IF  var_get_count=0 then
		OPEN rc FOR SELECT 0 AS msg_id, ''no data'' AS msg_to, '''' AS msg_text, 0 AS codepage, 0 AS smsc_id;
	ELSE
		OPEN rc FOR SELECT msg_id, msg_to, msg_text, msg_cp as codepage, smsc_id FROM tmsg_sms/* WHERE (get_id = var_get_id)*/;
	END IF;

	--RETURN rc;

	loop
	fetch rc into r;
  
	if (not FOUND)
	then
	exit;
	end if;
  
	return next r;
	end loop;

return;

end;'
  LANGUAGE 'plpgsql' VOLATILE;

postgres 7.4.7 !!
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640865
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте заменить:
Код: plaintext
RETURNS SETOF record AS
на
Код: plaintext
RETURNS SETOF tmsg_sms%ROWTYPE AS
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640891
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не прёт .. синтаксическая ошибка .. скорей всего в 7,4,7 не поддерживается .. =(

postgres 7.4.7
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640898
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или может просто покажете как мне эти селекты вывести результатом процедуры? =)
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34640995
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AcubedНу или может просто покажете как мне эти селекты вывести результатом процедуры? =)

Бррр. Ну почему не сделать вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE FUNCTION test_get()
  RETURNS REFCURSOR AS
'declare
	var_get_id int4;
	var_get_count int4;
	rc REFCURSOR;
begin
... ТРАЛАЛА
...

   IF  var_get_count=0 then
		OPEN rc FOR SELECT 0 AS msg_id, ''no data'' AS msg_to, '''' AS msg_text, 0 AS codepage, 0 AS smsc_id;
	ELSE
		OPEN rc FOR SELECT msg_id, msg_to, msg_text, msg_cp as codepage, smsc_id FROM tmsg_sms/* WHERE (get_id = var_get_id)*/;
	END IF;

	RETURN rc;
end;'
  LANGUAGE 'plpgsql' VOLATILE;

Далее в вашей программе (не знаю что там у вас delphi, c, php???) вызываете 2 SQL запроса в одной транзакции:

1.
Код: plaintext
SELECT test_get()
Получаете имя курсора типа VARCHAR

2.
Код: plaintext
FETCH ALL IN "ИМЯ_КУРСОРА_ИЗ_ПЕРВОГО_СЕЛЕКТА"

Всё. Получаете свои данные. (Не забудьте после всего сделать СОММИТ, если надо)
...
Рейтинг: 0 / 0
конвертация refcursor -> setof
    #34641036
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хым.. Пасиба %)
Фпринцыпе у меня так и есть, просто хотелось всёже, чтоб процедура сразу выдавала табличку.
Тхенкс.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / конвертация refcursor -> setof
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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