34

我想SELECT INTO在我的一个函数中创建一个临时表。SELECT INTO适用于 SQL 但不适用于 PL/pgSQL。

此语句创建一个名为 mytable 的表(如果orig_table作为关系存在):

SELECT *
INTO TEMP TABLE mytable
FROM orig_table;

但是把这个函数放到 PostgreSQL 中,你会得到错误: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;

我可以在 PL/pgSQLSELECT INTO中使用类型变量record,但是当从该记录中获取数据时,我必须定义结构。SELECT INTO真的很简单——自动创建一个与SELECT查询结构相同的表。有没有人解释为什么这在函数中不起作用?

在 PL/pgSQL 中似乎SELECT INTO工作方式不同,因为您可以选择已声明的变量。不过,我不想声明我的临时表结构。我希望它会像在 SQL 中那样自动创建结构。

4

1 回答 1

55

尝试

CREATE TEMP TABLE mytable AS
SELECT *
FROM orig_table;

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

CREATE TABLE AS 在功能上类似于 SELECT INTO。CREATE TABLE AS 是推荐的语法,因为这种形式的 SELECT INTO 在 ECPG 或 PL/pgSQL 中不可用,因为它们对 INTO 子句的解释不同。此外,CREATE TABLE AS 提供了 SELECT INTO 提供的功能的超集。

于 2012-08-16T00:38:59.187 回答