When I try to return a table, my results are showing up like this
x
generateClassRecord
--------------------
(james, 5)
(bob, 10)
rather than like this
+-------+----------+
| name | new_rank |
+-------+----------+
| james | 5 |
| bob | 10 |
| cole | 54 |
+-------+----------+
I am assuming I am not correctly returning the rows properly. Could someone advice me how I can return my data. I tried using return query but when I evoke my function it tells me the types do not match.
CREATE TABLE employees (
id integer primary key
name text,
rank integer
);
create type empRecord as (
name text,
new_rank integer
);
INSERT INTO employees (id, name, rank) VALUES (1, 'james', 5), (2, 'bob', 10), (3, 'Cole', '54');
CREATE OR REPLACE FUNCTION
generateEmpRecord()
RETURNS empRecord
as $$
DECLARE
r empRecord;
BEGIN
FOR r IN
SELECT name, rank
FROM employees;
LOOP
return next r;
END LOOP;
END;
$$ language plpgsql
Advertisement
Answer
Your function should be declared as returns setof emprecord
as you are returning multiple rows.
But the whole example can be simplified by using returns table
– then you don’t need the extra “return type”. You also don’t need PL/pgSQL for this. A (usually more efficient) language sql
function is enough:
CREATE OR REPLACE FUNCTION generateemprecord()
RETURNS table(name text, new_rank int)
as $$
SELECT name, rank
FROM employees;
$$
language sql;