web-dev-qa-db-fra.com

SELECT .. INTO pour créer une table en PL / pgSQL

Je veux utiliser SELECT INTO pour créer une table temporaire dans l'une de mes fonctions. SELECT INTO fonctionne en SQL mais pas en PL/pgSQL.

Cette instruction crée une table appelée mytable (If orig_table existe en tant que relation):

SELECT *
INTO TEMP TABLE mytable
FROM orig_table;

Mais mettez cette fonction dans PostgreSQL, et vous obtenez l'erreur: ERROR: "temp" is not a known variable

CREATE OR REPLACE FUNCTION whatever()
RETURNS void AS $$
BEGIN
    SELECT *
    INTO TEMP TABLE mytable
    FROM orig_table;
END; $$ LANGUAGE plpgsql;

Je peux SELECT INTO une variable de type record dans PL/pgSQL, mais je dois ensuite définir la structure lors de l'extraction des données de cet enregistrement. SELECT INTO est vraiment simple - créant automatiquement une table de la même structure que la requête SELECT. Quelqu'un at-il une explication pour expliquer pourquoi cela ne fonctionne pas dans une fonction?

Il semble que SELECT INTO fonctionne différemment dans PL/pgSQL, car vous pouvez sélectionner les variables que vous avez déclarées. Cependant, je ne veux pas déclarer ma structure de table temporaire. Je souhaite qu'il crée simplement la structure automatiquement comme il le fait dans SQL.

28
nnyby

Essayer

CREATE TEMP TABLE mytable AS
SELECT *
FROM orig_table;

Par http://www.postgresql.org/docs/current/static/sql-selectinto.html

CREATE TABLE AS est fonctionnellement similaire à SELECT INTO. CREATE TABLE AS est la syntaxe recommandée, car cette forme de SELECT INTO n'est pas disponible dans ECPG ou PL/pgSQL, car ils interprètent la clause INTO différemment. De plus, CREATE TABLE AS offre un sur-ensemble des fonctionnalités fournies par SELECT INTO.

46
Kuberchaun