powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с функцией!!!
13 сообщений из 13, страница 1 из 1
Помогите с функцией!!!
    #34356547
guest62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
У меня здесь функция Она компилируется нормално, но не выполняетсся выдает ошибку ERROR: a column definition list is only allowed for functions returning "record"


CREATE OR REPLACE FUNCTION "public"."f_sel_table1" (out v_id integer, out v_name varchar, out v_fname varchar) RETURNS SETOF "pg_catalog"."record" AS
$body$
declare
rec record;
begin
for rec in
select ta_id, ta_name, ta_fname
from public.table1
loop
v_id := rec.ta_id;
v_name := rec.ta_name;
v_fname := rec.ta_fname;
return next;
end loop;
return;
end
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Не понимаю что здесь нитак?
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358112
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest62Привет всем!
У меня здесь функция Она компилируется нормално, но не выполняетсся выдает ошибку ERROR: a column definition list is only allowed for functions returning "record"

Не понимаю что здесь нитак?

A kak vy ee vyzyvaete ?
Potomu chto u menia f-ia:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION "public"."f_sel_table1" (out ra double precision, out path varchar) RETURNS SETOF pg_catalog.record AS
$body$
declare
rec record;
begin
for rec in select * from file_list loop
ra := rec.ra;
path := rec.path;
return next;
end loop;
return;
end
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
vpolne normalno rabotaet, esli ee vyzyvat' vot tak:
Код: plaintext
wsdb=# select * from public.f_sel_table1();
Podozrevau, chto Vy ee ne tak vyzyvaete...
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358596
guest62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо она уже сработала
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358611
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че-то какой-то бред у тебя! Тебе нужно возвратить набор данных (т.е. SET), а out переменные пригодны только для возврата одиночных значений. А RETURN NEXT должна быть обязательно с аргументом-переменной, чего ты собственно возвращаешь. Как у тебя компилится не знаю, по крайней мере в 8.2 у тебя должна возникать ошибка компиляции.
Так что для начала надо переписать функцию твою:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
REATE OR REPLACE FUNCTION f_sel_table1()
  RETURNS SETOF record AS
$BODY$DECLARE
	rec record;
BEGIN
for rec in
select ta_id, ta_name, ta_fname
from public.table1
loop
   return next rec;
end loop;
return;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;

а теперь вызываем ее в селекте
Код: plaintext
select * from test() AS (ta_id integer,ta_name varchar,ta_fname varchar);

AS (ta_id integer,ta_name varchar,ta_fname varchar) - как раз лечит ошибку ERROR: a column definition list is only allowed for functions returning "record". Без нее Postgres просто не знает ничего о структуре твоей записи.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358705
Poligon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NetFantomче-то какой-то бред у тебя! Тебе нужно возвратить набор данных (т.е. SET), а out переменные пригодны только для возврата одиночных значений. А RETURN NEXT должна быть обязательно с аргументом-переменной, чего ты собственно возвращаешь.

нормально все написано, через out - return next тоже можно возвращать выборки.
Не спиши говорить "бред" если чего - то не понимаешь =)
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358765
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мм..а где это в документации написано, что OUT параметры могут возвращать SETOF, а не одиночные значения, не подскажешь?
Я вот так думаю, что после выполнения функции в OUT параметрах будет возвращено последнее значение LOOP цикла, а вовзрат набора данных обеспечиватеся только RETURNS SETOF record.
Так что если нам не нужны последние значения цикла, то и OUT переменные тоже лишние.
Читай документацию:
http://www.postgresql.org/docs/8.2/interactive/xfunc-sql.html#XFUNC-OUTPUT-PARAMETERS
http://www.postgresql.org/docs/8.2/interactive/xfunc-sql.html#AEN36424

Может в ранних версиях PostgreSQL было по-другому, и потому мы расходимся во мнениях? Я работал активно только с 8.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358775
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, только если OUT параметры не композитного или array типа, но тогда они вообщем уже не будут набором табличных данных.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358793
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аха, сам нашел в описании return next
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html
сори
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34358832
Poligon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NetFantomАха, сам нашел в описании return next
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html
сори

я и говорю, не спеши гнать, как ты сам сказал NetFantomЧитай документацию

=)
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34359088
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну не разобрался сразу, сори, просто использование out переменных в данном случае масло маслянной, то что я написал короче, и, возможно, выполняться быстрее будет.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34359808
Poligon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NetFantomну не разобрался сразу, сори, просто использование out переменных в данном случае масло маслянной, то что я написал короче

то, что короче эт, не факт, т.е. сама функция короче, но при вызове твоей ф-ии надо будет указыать названия и типы всех столбцов, например
Код: plaintext
select * from func() as (col0 int2, col2 int4, col3 varchar)

ИМХО эт оч. не удобно, особенно, когда полей много.

NetFantom и, возможно, выполняться быстрее будет.
Интересно с чего бы.

Просто можно возвращать выборки несколькими способами, но не думаю, что будет разница в производительности.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34417585
guest62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята этот функция тоже не работаетю Не понимаю в чем дело:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION "public"."function1" (ow_type smallint) RETURNS SETOF "pg_catalog"."record" AS
$body$
declare rec record;
begin
if $ 1 = 1  then
begin
for rec in
select tu_name from tb_tutor
loop return next rec;
end loop;
return;
END;
ELSE
begin
for rec in
select lc_name from tb_learncenter
loop return next rec;
end loop;
return;
end;
end if;
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Нормално компилируются но когда визиваю дает ощибку:

Код: plaintext
1.
ERROR:  function public.function1(integer) does not exist at character  15 
HINT:  No function matches the given name and argument types. You may need to add explicit type casts.
...
Рейтинг: 0 / 0
Помогите с функцией!!!
    #34417626
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * from function1(1::smallint)
?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с функцией!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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