Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / конвертация refcursor -> setof / 16 сообщений из 16, страница 1 из 1
12.10.2006, 11:24
    #34049607
конвертация refcursor -> setof
есть стороняя функция 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
19.10.2006, 19:09
    #34067905
J.W.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Как-то так:
Код: 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
20.10.2006, 11:37
    #34069046
конвертация refcursor -> setof
Спасибо J.W.
Попробовал но получил вот такой ответ ,
ERROR: a column definition list is required for functions returning "record" похоже не соответсвие видов
возвращаемого аргумента хочу получить setof как курсор а некак запись.
...
Рейтинг: 0 / 0
20.10.2006, 14:14
    #34069870
J.W.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Нужно указать тип полей для возвращаемых записей. Например, если курсор возвращаемый ф-ией xxx.client_xxx(), открывается для рекордсета с полями (ID int4, CODE varchar), то вызов должен выглядеть так:
Код: plaintext
select * from test() as (ID int4, CODE varchar)
...
Рейтинг: 0 / 0
20.10.2006, 16:50
    #34070678
конвертация refcursor -> setof
Хочу получить одну колонку value
select value from experian.test() as (value text)

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

ERROR: control reached end of function without RETURN
CONTEXT: PL/pgSQL function "test"
Чего то я не догоняю ......
...
Рейтинг: 0 / 0
20.10.2006, 18:46
    #34071098
J.W.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Видимо, рекордсет для курсора пустой, который возвращает xxx.client_xxx(). Чтобы не было ошибки в таком случае и возвращался просто пустой рекордсет - нужно исправить в функции на:
Код: plaintext
1.
2.
3.
  if (not FOUND)
  then
    return;
  end if;
...
Рейтинг: 0 / 0
05.07.2007, 10:23
    #34640041
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
У меня при такой конвертации пишет следующее:
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
05.07.2007, 11:30
    #34640325
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
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
05.07.2007, 12:08
    #34640504
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Нет, не в этом ошибка, ошибка в RETURN NEXT.. и финальный RETURN стоял..

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

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

Покажите полный исходник функции
...
Рейтинг: 0 / 0
05.07.2007, 12:43
    #34640642
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Код: 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
05.07.2007, 13:34
    #34640865
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Попробуйте заменить:
Код: plaintext
RETURNS SETOF record AS
на
Код: plaintext
RETURNS SETOF tmsg_sms%ROWTYPE AS
...
Рейтинг: 0 / 0
05.07.2007, 13:38
    #34640891
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Нет, не прёт .. синтаксическая ошибка .. скорей всего в 7,4,7 не поддерживается .. =(

postgres 7.4.7
...
Рейтинг: 0 / 0
05.07.2007, 13:40
    #34640898
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Ну или может просто покажете как мне эти селекты вывести результатом процедуры? =)
...
Рейтинг: 0 / 0
05.07.2007, 14:03
    #34640995
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
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
05.07.2007, 14:11
    #34641036
Acubed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
конвертация refcursor -> setof
Хым.. Пасиба %)
Фпринцыпе у меня так и есть, просто хотелось всёже, чтоб процедура сразу выдавала табличку.
Тхенкс.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / конвертация refcursor -> setof / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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