2013-01-06 14 views
6

Come si converte una query di selezione semplice come select * from customers in una stored procedure/funzione in pg?Semplice funzione PostgreSQL per restituire righe

Sono nuovo di Postgres e create function customers() as returns table/setof semplicemente non mi sento giusto e quindi la domanda qui.

Capisco che i proc sono chiamati "funzioni" in pg land. Quindi create procedure non esiste e le mie uniche opzioni sono creare una vista o una funzione. Il problema è create function x() returns setof y restituisce una riga di valori separati da virgole che non possono essere utilizzati senza ulteriori elaborazioni (almeno questo è ciò che vedo in pgAdmin e Ruby/Sequel).

create function x() returns table(...) Richiede di incorporare la definizione di riga che non desidero.

Sono sicuro che c'è una ragione dietro tutto questo ma sono sorpreso che il caso d'uso più comune sia così complicato.

+3

[Cosa hai provato?] (Http://whathaveyoutried.com) –

+2

@rebnoob Piuttosto che "non ha funzionato" - specificare ** il testo completo della funzione che hai provato e il messaggio di errore risultante ** come così come la tua versione di PostgreSQL. –

+0

Ottimo! Grazie Erwin e Craig. – rebnoob

risposta

11

testato ma dovrebbe essere circa destra:

CREATE OR REPLACE FUNCTION getcustomers() RETURNS SETOF customers AS $$ 
SELECT * FROM customers; 
$$ LANGUAGE sql; 
+2

funziona, grazie. Ma pg sembra restituire solo una colonna con valori separati da virgola invece di colonne effettive, cosa dà? – rebnoob

+1

@rebnoob Lo si chiama con qualcosa come 'SELECT x FROM getcustomers() x'. Si desidera utilizzare 'SELECT getcustomers();' oppure 'SELECT * FROM getcustomers();'. –

11

Il problema è "creare funzione x() restituisce setof y" restituisce un paren'd valori di riga separati da virgola che non possono essere utilizzati senza inoltre elaborazione

Dal momento che la funzione restituisce un tipo di record/riga, si deve chiamare con

SELECT * FROM getcustomers(); 

per scomporre la riga restituita in singole colonne.

Il manual on CREATE FUNCTION dovrebbe essere un buon punto di partenza. La sezione di esempio tratta questo argomento.

+0

Voi signore ... siete un jedi e forza con cui fare i conti! – faizanjehangir

Problemi correlati