can we use return query within this loop ...?
You can use RETURN QUERY
:
CREATE OR REPLACE FUNCTION f_pivot_arrays()
RETURNS TABLE(question text, response_id int, response text) AS
$func$
DECLARE
QuestionList text[] := '{Who?,When?,WHY?}';
UserResponseID_List int[] := '{1,2,3}';
UserResponseList text[] := '{Here.,Now.,Because.}';
BEGIN
FOR i IN 1 .. array_upper(UserResponseList, 1)
LOOP
RETURN QUERY SELECT QuestionList[i], UserResponseID_List[i], UserResponseList[i];
END LOOP;
END
$func$ LANGUAGE plpgsql STABLE;
Or RETURN NEXT
:
...
FOR i IN 1 .. array_upper(UserResponseList, 1)
LOOP
SELECT QuestionList[i], UserResponseID_List[i], UserResponseList[i]
INTO question, response_id, response;
RETURN NEXT;
END LOOP;
...
But since Postgres 9.4, the simpler tool to unnest arrays in parallel is unnest()
:
RETURN QUERY
SELECT *
FROM unnest(QuestionList, UserResponseID_List, UserResponseList);
dbfiddle here
Related: