首页 > 解决方案 > Postgres过程中的临时表

问题描述

我正在尝试在一个过程中创建和填充一个临时表,以保存我正在使用的数据的一些中间状态。

我创建了一个示例代码来解释我想要做什么:

CREATE OR REPLACE PROCEDURE etl.my_test_procedure()
LANGUAGE sql
AS 
$$
   CREATE TEMP TABLE IF NOT EXISTS my_temp(
       var1 VARCHAR(255),
       var2 VARCHAR(255)
   ) ON COMMIT DROP;
    
   INSERT INTO my_temp (
       var1,
       var2
   )
   SELECT 
       table_schema,
       column_name
   FROM information_schema.columns;

   SELECT 
        *
   FROM my_temp
$$

尝试创建此存储过程时,数据库返回此错误消息: 错误:关系“my_temp”不存在第 10 行:插入到 my_temp(^ SQL 状态:42P01 字符:171

PD:我的 Postgres 版本是 13.3

标签: postgresqlstored-procedurestemp-tablespostgresql-13

解决方案


你将不得不使用plpgsql而不是sql

CREATE OR REPLACE FUNCTION my_test_procedure()
RETURNS TABLE(var1 VARCHAR(255), var2 VARCHAR(255))
AS 
$$
 DECLARE

  BEGIN

   CREATE TEMP TABLE IF NOT EXISTS my_temp(
       var1 VARCHAR(255),
       var2 VARCHAR(255)
   ) ON COMMIT DROP;
    
   INSERT INTO my_temp (
       var1,
       var2
   )
   SELECT 
       table_schema,
       column_name
   FROM information_schema.columns;

   RETURN QUERY SELECT *
   FROM my_temp;

  END;
$$ LANGUAGE plpgsql;

推荐阅读