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
$$

当尝试创建这个存储过程时,数据库返回这个错误消息:ERROR: relation "my_temp"不存在第10行:INSERT INTO my_temp^SQL状态:42P01性格:171

我的Postgres版本是13.3

您必须使用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;

出现该错误的原因是SQL函数在创建时被解析。可通过将"check_function_bodies"参数设置为"off"来避免。

但是这并没有多大帮助:它允许你创建函数,但是当你执行这个过程时,你将以同样的错误结束,因为所有的语句都在函数开始时被解析,而那时my_temp还不存在。

解决方案是使用PL/pgSQL,就像JGH的答案所建议的。

最新更新