2013-01-31 9 views
5

Ho una funzione Postgres che sta tornando una tabella:funzione Postgres tabella restituzione non restituendo dati nelle colonne

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS 
$BODY$ 
DECLARE a int DEFAULT 0; 
DECLARE b int DEFAULT 0; 
BEGIN 
CREATE TABLE tempTable AS SELECT a, b; 
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

Questa funzione non restituisce dati in forma riga e colonna. Invece restituisce i dati come:

(0,0) 

Ciò sta causando un problema nel blocco cfquery di Coldfusion nell'estrazione dei dati. Come ottengo i dati in righe e colonne quando viene restituita una tabella da questa funzione? In altre parole: perché la funzione PL/pgSQL non restituisce i dati come colonne?

+0

Perché stai utilizzando la tabella temporanea? Ciò è del tutto inutile e rende le cose più lente senza avere alcun vantaggio (e si potrebbe usare una semplice funzione 'SQL' che renderebbe le cose un po 'più veloci) –

risposta

10

Per ottenere singole colonne al posto del tipo di riga, chiamare la funzione con:

SELECT * FROM testfunction(); 

Proprio come è necessario selezionare tutte le colonne da una tabella.
Considera anche questa forma reviewed della vostra funzione di test:

CREATE OR REPLACE FUNCTION testfunction() 
    RETURNS TABLE(a int, b int) AS 
$func$ 
DECLARE 
    _a int := 0; 
    _b int := 0; 
BEGIN 
    CREATE TEMP TABLE tbl AS SELECT _a, _b; 
    RETURN QUERY SELECT * FROM tbl; 
    DROP TABLE tempTable; 
END 
$func$ LANGUAGE plpgsql; 

In particolare:

  • DECLARE parola chiave è necessaria solo una volta.
  • Evitare di dichiarare parametri che sono già (implicitamente) dichiarati come parametri OUT nella clausola RETURNS TABLE (...).
  • Non utilizzare identificatori di casi CaMeL non quotati in Postgres. Funziona, identificatori non quotati un cast in lettere minuscole, ma porta a errori confusi. Vedere

La tabella temporanea è completamente inutile nell'esempio (probabilmente troppo semplificata). Potresti ridurre a:

CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS 
$func$ 
BEGIN 
    a := 0; 
    b := 0; 
END 
$func$ LANGUAGE plpgsql; 
+0

È corretto e grazie per la risposta. –

Problemi correlati