2012-02-06 14 views
5

Sto utilizzando il database PostgreSQL.SELEZIONA DA una funzione che restituisce un record con il numero di perimetro delle colonne

Ho un mio plpgsql FUNCTION che restituisce un singolo record con un numero arbitrario di colonne.
A causa di questo arbitrio avrei bisogno di usare qualcosa come:

SELECT * FROM my_function(97) 

Ma questo non funziona come Postgres mi dà il seguente errore:

a column definition list is required for functions returning "record"

Ma se faccio:

SELECT my_function(97) 

Posso vedere il risultato previsto ma incapsulato in una singola colonna.

C'è un modo per recuperare il risultato previsto come un insieme di colonne come previsto dalla funzione e non una singola colonna che le incapsula tutte?

risposta

0

Al fine di restituire un "set di colonne" si avrà definire un tipo di ritorno come TABLE o SETOF nel qual caso è in realtà restituire un insieme di record che si dovrebbe essere in grado di SELECT da.

Per ulteriori informazioni sulle funzioni che ritornano SETOF dare un'occhiata a this link to documentation

+1

Il problema è che tabella prevede un insieme fisso di colonne comunque, in modo che non risolverebbe il problema comunque, il problema è come recuperare da una funzione che non può restituire un record con un numero arbitrario di colonne, diciamo una volta restituisce un record con 3 colonne, un altro record temporale con 2 colonne. –

+2

@ flash.tato In tal caso, come si propone di selezionare qualcosa se non si sa come potrebbe apparire l'output? – Karlson

+0

Penso che il motore dovrebbe ispezionare il RECORD e ottenere i metadati dei campi –

2

Avete alcune opzioni qui:

  1. Return un refcursor a prendere da quella del cursore nell'applicazione. Nota che puoi effettivamente restituire più REFCURSOR se devi restituire più set di risultati.

  2. Restituisce un documento XML e lo analizza nell'applicazione.

  3. Utilizzare un gruppo di variabili OUT, RECORD tornare, e determinare quale di questi per selezionare

Il problema di fondo è che i risultati di ritorno effettivi devono essere noti al pianificazione tempo in modo da non può semplicemente restituire un numero arbitrario di colonne. Il pianificatore deve sapere cosa verrà restituito.

5

Quando una funzione solo RETURNS record o SETOF record (e nessun OUT parametri per andare con esso), PostgreSQL non conosce i nomi ei tipi dei suoi elementi e si sono tenuti a fornire un elenco di definizioni colonna con ogni chiamata.

Evitare che se possibile e restituire un noto tipo invece. Oltre allo workarounds @Chris provided ci sono molti altri modi per dichiarare il tipo di reso.Ho scritto relative risposte complete recente:

ci sono un bel paio di domande correlate su SO già. Ricordo di aver risposto a un gruppo di loro.
Try a search!

1

Quando si utilizza un set di ritorno di funzione (setof) nell'elenco di selezione, sul lato sinistro della DA, la funzione restituisce un composite type. L'utilizzo di una funzione nell'elenco di selezione può essere difficile da evitare quando si utilizza una tabella come input per una funzione.

Un modo per selezionare gli elementi da una singola colonna di tipo composito segue:

SELECT 
    (my_function).field1, 
    (my_function).field2, 
    (my_function).field3 
FROM 
(SELECT my_function(*) 
FROM sometable) t 
-1

Io non sono certo che seguo quello che stai dopo, ma fa questo lavoro?

SELECT (my_function(97)).my_column