Ich habe diese PL/pgSQL - Funktion, die einige Benutzerinformationen zurückgeben muss.
CREATE OR REPLACE FUNCTION my_function(user_id integer)
RETURNS TABLE(id integer, firstname character varying
, lastname character varying) AS
$$
DECLARE
ids character varying;
BEGIN
ids := '';
--Some code which build the ids string, not interesting for this issue
RETURN QUERY EXECUTE 'SELECT users.id, users.firstname, users.lastname
FROM public.users WHERE ids IN (' || ids || ')';
END;
$$ LANGUAGE plpgsql;
Das Problem, mit dem ich konfrontiert bin, ist, dass das Ergebnis der Funktion eine einzelne Spaltentabelle wie folgt ist:
╔═══╦═════════════════════╗
║ ║my_function ║
╠═══╬═════════════════════╣
║ 1 ║ (106,Ned,STARK) ║
║ 2 ║ (130,Rob,STARK) ║
╚═══╩═════════════════════╝
Während ich erwartet hatte:
╔═══╦════════════╦════════════╦═════════════╗
║ ║ id ║ firstname ║ lastname ║
╠═══╬════════════╬════════════╬═════════════╣
║ 1 ║ 106 ║ Ned ║ STARK ║
║ 2 ║ 103 ║ Rob ║ STARK ║
╚═══╩════════════╩════════════╩═════════════╝
Ich denke (aber nicht sicher), dass das Problem von der EXECUTE
-Anweisung herrührt, aber ich kann nicht anders sehen.
Irgendwelche Ideen?
Wie führen Sie diese Funktion aus? Es funktioniert als Select-Anweisung.
Erstellen Sie eine Tabelle: public.users
create table public.users (id int, firstname varchar, lastname varchar);
Fügen Sie einige Datensätze ein:
insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd');
funktion: meine_Funktion
CREATE OR REPLACE FUNCTION my_function(user_id integer) RETURNS TABLE(id integer, firstname character varying, lastname character varying) AS $$
DECLARE
ids INTEGER[];
BEGIN
ids := ARRAY[1,2];
RETURN QUERY
SELECT users.id, users.firstname, users.lastname
FROM public.users
WHERE users.id = ANY(ids);
END;
$$ LANGUAGE plpgsql;
Jetzt können Sie mit * verwenden
select * from my_function(1);
Ergebnis der Abfrage
id | firstname | lastname
----+-----------+----------
1 | aaa | bbb
2 | ccc | ddd
Oder auch mit Spaltennamen
select id,firstname,lastname from my_function(1);
Ergebnis
id | firstname | lastname
----+-----------+----------
1 | aaa | bbb
2 | ccc | ddd
Aufruffunktion wie folgt:
select * from my_function(123);
Nicht nur bei select. Ich habe und es funktioniert
http://www.postgresqltutorial.com/plpgsql-function-returns-a-table/
es gibt einen Unterschied in der Ausgabe, die von der Funktion empfangen wird, abhängig von der Syntax der Auswahl:
select * from myfunction();
und
select myfunction();