web-dev-qa-db-fra.com

Fonction postgresql de table temporaire

Je ne trouve pas d'explication claire de la syntaxe pour créer (et utiliser) des tables uniquement pour les calculs internes d'une fonction. Quelqu'un pourrait-il me donner un exemple de syntaxe s'il vous plaît?

D'après ce que j'ai trouvé, j'ai essayé cela (avec et sans @ avant 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;

Je reçois :

ERREUR: erreur de syntaxe à ou près de "DECLARE" LIGNE 5: DECLARE @temp_table TABLE

-

J'ai également essayé l'approche CREATE TABLE suggérée ici , de cette façon:

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;

Et je reçois ceci:

ERREUR: la relation "temp_table" n'existe pas LIGNE 11: FROM temp_table

(Évidemment, je suis conscient que la table temp_table n'est pas nécessaire pour ce que je fais dans le code ci-dessus, mais ce n'est pas le point :) => Je veux comprendre la syntaxe pour le faire fonctionner)

10
François M.

La syntaxe appropriée pour créer une table temporaire est

create temp table...

mais vous devez être sûr de supprimer la table temporaire avant d'exister hors de la fonction. Aussi, je suggère plutôt cette syntaxe:

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

Ainsi, votre fonction sera comme ceci:

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;

Mais si je peux être si gentil, j'aimerais réécrire cette fonction pour qu'elle soit plus correcte:

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 testé; faites-moi savoir si cela échoue.

15
dizzystar