2016-03-18 15 views
5

Ich kann keine klare Erklärung der Syntax zu erstellen (und verwenden) Tabellen nur für die Innenberechnungen einer Funktion. Könnte mir bitte jemand ein Syntaxbeispiel geben?Temporäre Tabelle Postgresql-Funktion

Von dem, was ich gefunden habe, habe ich schon versucht, diese (mit und ohne @ vor 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; 

ich:

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

-

Ich habe auch versucht die CREATE TABLE Ansatz vorgeschlagen here, auf diese Weise:

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; 

Und ich bekomme diese:

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

(Natürlich, ich bin mir bewusst, die temp_table nicht notwendig ist für das, was ich in dem obigen Code machte, aber das ist nicht der Punkt :) => Ich mag die Syntax zu verstehen, um es)

+0

Postgres verwendet temporäre Tabellen für diesen Zweck. Tabellenvariablen sind eine Funktion von SQL Server. –

+0

Wo im Handbuch haben Sie die Syntax 'DECLARE @temp_table TABLE ...' gefunden? –

Antwort

8

die entsprechende Syntax, um eine temporäre Tabelle zu arbeiten für die Erstellung ist

create temp table... 

aber Sie müssen sicher sein, die temporäre Tabelle zu löschen, bevor sie aus der Funktion vorhanden ist. Außerdem würde ich diese Syntax vorschlagen statt:

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

So Ihre Funktion wird wie folgt sein:

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; 

Aber wenn ich so gut sein kann, würde Ich mag diese Funktion neu zu schreiben, so dass es ist richtiger:

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; 

Ungetestet; lass es mich wissen, wenn das nicht klappt.

+0

Ich werde es bei der Arbeit morgen testen und werde Sie wissen lassen (und es akzeptieren, wenn es funktioniert), in der Zwischenzeit wollte ich nur Ihnen danken, dass Sie sich die Zeit genommen haben :) –

+0

Ich bekomme einen Syntaxfehler wegen der 'CREATE 'Aussage. Genauer gesagt, bekomme ich folgendes: 'FEHLER: Syntaxfehler bei oder in der Nähe von" create "' // 'ZEILE 4: TEMP-TABELLE erstellen temp_mag_ref_compl AS' // ' ********** Erreur * ********* '// ' ERROR: Syntaxfehler bei oder in der Nähe von "create" '// ' État SQL: 42601' // 'Caractère: 114' –

+0

yeah, Sie haben Recht. Ich habe es geändert, um "beginne" hinzuzufügen. und Ende;" Das sollte den Syntaxfehler verhindern. – dizzystar

Verwandte Themen