2013-08-06 6 views
19

Ho questa funzione PL/pgSQL che deve restituire alcune informazioni agli utenti.Funzioni PL/pgSQL: Come restituire la tabella con una istruzione execute

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; 

Il problema che sto affrontando è che il risultato della funzione è una singola tabella colonne in questo modo:

╔═══╦═════════════════════╗ 
║ ║my_function   ║ 
╠═══╬═════════════════════╣ 
║ 1 ║ (106,Ned,STARK)  ║ 
║ 2 ║ (130,Rob,STARK)  ║ 
╚═══╩═════════════════════╝ 

Mentre mi aspettavo:

╔═══╦════════════╦════════════╦═════════════╗ 
║ ║ id   ║ firstname ║ lastname ║ 
╠═══╬════════════╬════════════╬═════════════╣ 
║ 1 ║ 106  ║ Ned  ║ STARK  ║ 
║ 2 ║ 103  ║ Rob  ║ STARK  ║ 
╚═══╩════════════╩════════════╩═════════════╝ 

credo (ma non sono sicuro) il problema deriva dall'istruzione EXECUTE, ma non riesco a vedere come fare diversamente.

Qualche idea?

+4

Stai funzione con 'SELEZIONA my_function (123) chiamata; o' 'SELEZIONA DA my_function (123);'? –

+0

Hai perfettamente ragione, ho eseguito la funzione con SELECT my_function (123); funziona perfettamente con il FROM ... Grazie! – Getz

risposta

24

Come state eseguendo quella funzione? Funziona come una dichiarazione selezionata.

Creare una tabella: public.users

create table public.users (id int, firstname varchar, lastname varchar); 

inserire alcuni record:

insert into public.users values (1, 'aaa','bbb'),(2,'ccc','ddd'); 

funzione: my_function

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; 

Ora è possibile utilizzare con *

select * from my_function(1); 

Risultato ricerca

id | firstname | lastname 
----+-----------+---------- 
    1 | aaa  | bbb 
    2 | ccc  | ddd 

O con i nomi delle colonne così

select id,firstname,lastname from my_function(1); 

risultati

id | firstname | lastname 
----+-----------+---------- 
    1 | aaa  | bbb 
    2 | ccc  | ddd 
+1

Infatti, ho chiamato la mia funzione con SELECT my_function (123). Grazie. – Getz

+0

C'è un modo per risolvere questo -> query restituisce * invece del nome/tipo di colonna specifici – Thirumal

2

funzione di chiamata del genere:

select * from my_function(123); 

Non solo con select. L'ho fatto e funziona