CREATE FUNCTION retrieve_add_friends(user_id text[])
RETURNS SETOF user_rows AS
$BODY$
BEGIN
FOR user_rows IN EXECUTE SELECT * FROM user_details where user_id= $1
LOOP
FOR user_friends IN EXECUTE SELECT * FROM user_add_friends where user_id= $1
LOOP
IF user_rows.user_id!=user_friends.user_friend_id THEN
RETURN NEXT user_rows;
END IF;
END LOOP;
RETURN;
END LOOP;
RETURN;
END
$BODY$
language plpgsql VOLATILE;
Когда я выполняю это, я получаю следующую ошибку:
ERROR: return type mismatch in function declared to return user_details
DETAIL: Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING. CONTEXT: SQL function "retrieve_add_friends"
Кто-нибудь может мне с этим помочь?
Предоставление фактического вызова функции (и всегда вашей версии Postgres) значительно упростит решение.
какой тип данных - это столбец user_details.user_id, если это одно значение, вы не можете сравнить его с массивом. Вы, вероятно, захотите where user_id = any($1). И если этот столбец является целым числом, вы не должны сравнивать его со значением text.
Так у тебя есть ответ?





Отображаемая функция является функцией PL / pgSQL.
Вы вызываете другая функция, функцию SQL, очевидно (для которой сообщение об ошибке имеет смысл):
SQL function "retrieve_add_friends"
То же имя функции, но разные аргументы (и, возможно, в другой схеме базы данных). Вы знаете о перегрузка функции и его последствиях?
Связанный:
Для быстрой диагностики:
SELECT oid::regprocedure AS function_signature, *
FROM pg_proc
WHERE proname = 'retrieve_add_friends';
Помимо всего прочего, отображаемая функция содержит несколько ошибок и может быть заменена простым SELECT.
вы слишком усложняете. Для этого не нужен цикл или даже PL / pgSQL.