2012-08-16 6 views
22

Ich möchte SELECT INTO verwenden, um eine temporäre Tabelle in einer meiner Funktionen zu erstellen. SELECT INTO funktioniert in SQL, aber nicht PL/pgSQL.SELECT .. INTO zum Erstellen einer Tabelle in PL/pgSQL

Diese Anweisung erstellt eine Tabelle mytable genannt (Wenn orig_table als eine Beziehung existiert):

SELECT * 
INTO TEMP TABLE mytable 
FROM orig_table; 

Aber setzen Sie diese Funktion in PostgreSQL, und Sie erhalten den Fehler: 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; 

ich kann SELECT INTO eine Variable vom Typ record in PL/pgSQL, aber dann muss ich die Struktur definieren, wenn Daten aus diesem Datensatz abgerufen werden. SELECT INTO ist wirklich einfach - automatisch eine Tabelle mit der gleichen Struktur der SELECT Abfrage erstellen. Hat jemand eine Erklärung dafür, warum dies in einer Funktion nicht funktioniert?

Es scheint wie SELECT INTO funktioniert anders in PL/pgSQL, weil Sie in die Variablen auswählen können, die Sie deklariert haben. Ich möchte jedoch nicht meine temporäre Tabellenstruktur deklarieren. Ich wünschte, es würde nur die Struktur automatisch erstellen, wie es in SQL tut.

Antwort

36

Versuchen

CREATE TEMP TABLE mytable AS 
SELECT * 
FROM orig_table; 

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

CREATE TABLE AS is functionally similar to SELECT INTO. CREATE TABLE AS is the recommended syntax, since this form of SELECT INTO is not available in ECPG or PL/pgSQL, because they interpret the INTO clause differently. Furthermore, CREATE TABLE AS offers a superset of the functionality provided by SELECT INTO.

+0

Dank! Ich wusste, dass ich dieses Problem vorher gelöst hatte, und ich erinnere mich an diesen Satz von den Postgresql-Dokumenten. Ich habe CREATE TABLE AS einfach total vergessen. – nnyby

+0

Das hat mich für eine Weile total ratlos gemacht - danke. – mvexel

Verwandte Themen