2016-03-18 31 views
5

Non riesco a trovare una spiegazione chiara della sintassi per creare (e utilizzare) le tabelle solo per i calcoli interni di una funzione. Qualcuno potrebbe darmi un esempio di sintassi per favore?Funzione postgresql della tabella temporanea

Da quello che ho trovato, ho provato questo (con e senza @ prima temp_table):

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

DECLARE @temp_table TABLE 
( 
     id int, 
     value text 
) 
BEGIN 
INSERT INTO @temp_table 
     SELECT id, value 
     FROM test.another_table; 

INSERT INTO test.out_table 
     SELECT id, value 
     FROM @temp_table; 
RETURN END 
$$ LANGUAGE SQL; 

ottengo:

ERROR: syntax error at or near "DECLARE" LINE 5: DECLARE @temp_table TABLE

-

Ho anche provato il L'approccio CREATE TABLE ha suggerito here, in questo modo:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TABLE temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

$$ LANGUAGE SQL; 

E ottengo questo:

ERROR: relation "temp_table " does not exist LINE 11: FROM temp_table

(Ovviamente, io sono consapevole del temp_table non è necessario per quello che sto facendo in codice di cui sopra, ma non è questo il punto :) => voglio per capire la sintassi per farlo funzionare)

+0

Postgres utilizza tabelle temporanee per questo scopo. Le variabili di tabella sono una funzionalità di SQL Server. –

+0

Dove nel manuale hai trovato la sintassi 'DECLARE @temp_table TABLE ...'? –

risposta

8

la sintassi appropriata per la creazione di una tabella temporanea è

create temp table... 

ma bisogna essere sicuri di eliminare la tabella temporanea prima di esistere fuori della funzione. Inoltre, io suggerirei questa sintassi invece:

CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

Così la funzione sarà simile a questo:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

DROP TABLE temp_table; 

$$ LANGUAGE SQL; 

Ma se posso essere così gentile, mi piacerebbe riscrivere questa funzione in modo che è più corretto:

CREATE FUNCTION test.myfunction() 
RETURNS TABLE (id int, value varchar) -- change your datatype as needed 
AS $$ 
BEGIN; 
CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

INSERT INTO test.out_table 
    SELECT id, value 
    FROM temp_table; 

DROP TABLE temp_table; 

RETURN QUERY 
SELECT id, value 
from temp_table; 

END; 
$$ LANGUAGE plpgsql; 

Non verificato; fammi sapere se questo fallisce.

+0

Lo testerò domani al lavoro e te lo farò sapere (e lo accetterò se funziona), nel frattempo, volevo solo ringraziarti per aver dedicato del tempo :) –

+0

Ottengo un errore di sintassi a causa del 'CREATE 'dichiarazione. Più precisamente, ottengo il seguente: 'ERRORE: errore di sintassi in corrispondenza o vicino a" create "' // 'LINE 4: creare TEMP TABLE temp_mag_ref_compl AS' // ' ********** Erreur * ********* '// ' ERRORE: errore di sintassi ao vicino a "create" '// ' État SQL: 42601' // 'Caractère: 114' –

+0

sì, hai ragione. L'ho modificato per aggiungere "begin;" e fine;" Questo dovrebbe impedire l'errore di sintassi. – dizzystar