Temp table 在 Postgres 中的过程中
Temp table inside a Procedure in Postgres
我正在尝试在过程中创建和填充一个临时 table 以保存我正在使用的数据的某些中间状态。
我创建了一个示例代码来解释我要做什么:
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
$$
尝试在数据库中创建此存储过程时 returns 此错误消息:
错误:关系“my_temp”不存在
第 10 行:插入 my_temp (
^
SQL 状态:42P01
字符:171
PD:我的 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 的回答建议的那样。
我正在尝试在过程中创建和填充一个临时 table 以保存我正在使用的数据的某些中间状态。
我创建了一个示例代码来解释我要做什么:
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
$$
尝试在数据库中创建此存储过程时 returns 此错误消息: 错误:关系“my_temp”不存在 第 10 行:插入 my_temp ( ^ SQL 状态:42P01 字符:171
PD:我的 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 的回答建议的那样。