it-swarm.com.de

PL/pgSQL-Funktionen: Zurückgeben einer Tabelle mit einer Ausführungsanweisung

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?

23
Getz

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
33
bma

Aufruffunktion wie folgt: 

select * from  my_function(123);

Nicht nur bei select. Ich habe und es funktioniert

2
selin kamaş

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();
0
Skysnake