2016-03-18 15 views
5

Nie mogę znaleźć jasnego wyjaśnienia składni do tworzenia (i używania) tabel tylko do wewnętrznych obliczeń funkcji. Czy ktoś mógłby mi podać przykład składni?Tymczasowa funkcja postgresql tabeli

Z tego co znalazłem, próbowałem to (i bez @ przed 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; 

uzyskać:

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

-

Próbowałem również CREATE TABLE podejście zasugerowane here, w ten sposób:

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; 

i uzyskać w ten sposób:

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

(Oczywiście jestem świadomy temp_table nie jest konieczne do tego, co robię w powyższym kodzie, ale to nie o to chodzi :) => Chcę zrozumieć składnię aby zmusić go do pracy)

+0

Firma Postgres używa do tego celu tabel tymczasowych. Zmienne tabelowe są cechą SQL Server. –

+0

Gdzie w podręczniku znalazłeś składnię 'DECLARE @temp_table TABLE ...'? –

Odpowiedz

8

odpowiedniej składni dla tworzenia tabeli temp jest

create temp table... 

ale trzeba mieć pewność, aby usunąć tabelę temp przed istniejącym poza funkcją. Również sugeruję tej składni zamiast:

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

Zatem czynność będzie tak:

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; 

Ale jeśli mogę być tak dobry, chciałbym przepisać tej funkcji, dlatego jest bardziej poprawny:

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; 

Bez przetestowania; daj mi znać, jeśli to się nie powiedzie.

+0

Przetestuję to w pracy jutro i dam ci znać (i zaakceptuj jeśli działa), w międzyczasie, po prostu chciałem ci podziękować za poświęcenie czasu :) –

+0

Dostaję błąd składniowy z powodu 'CREATE 'instrukcja. Dokładniej, otrzymuję następujące informacje: 'BŁĄD: błąd składniowy przy lub w pobliżu" utwórz "' // 'LINIA 4: utwórz tabelę TEMP temp_mag_ref_compl AS' // ' ********** Erreur * ********* '// ' BŁĄD: błąd składniowy w lub w pobliżu "Utwórz" '// ' État SQL: 42601' // 'Caractère: 114' –

+0

tak, masz rację. Zmieniłem go, dodając "rozpocznij"; i koniec;" To powinno zapobiec błędowi składni. – dizzystar

Powiązane problemy