使用数组和临时表的预准备语句

Prepared statment using arrays and temp table

提问人:Max888 提问时间:10/17/2023 更新时间:10/17/2023 访问量:41

问:

我有这个临时表语句:

CREATE TEMP TABLE mytable AS
SELECT UNNEST(ARRAY[1, 2, 3]) AS name, UNNEST(ARRAY['a', 'b', 'c']) AS col2;

我正在尝试从中创建一个准备好的声明。据我所知,Postgres 文档应该可以正常工作,但我收到以下错误。

PREPARE createTempTable(int[], text[]) AS
CREATE TEMP TABLE mytable AS
    SELECT UNNEST($1) AS col1, UNNEST($2) AS col2;
EXECUTE createTempTable(ARRAY[1, 2, 3], ARRAY['a', 'b', 'c']);
ERROR:  syntax error at or near "CREATE"
LINE 1: PREPARE createTempTable(int[], text[]) AS CREATE TEMP TABLE ...
PostgreSQL 预备语句 临时表

评论

2赞 Adrian Klaver 10/17/2023
准备语句 任何 SELECT、INSERT、UPDATE、DELETE、MERGE 或 VALUES 语句。我为那些为人们不会阅读的东西付出一切努力的文档编写者感到难过。
1赞 Frank Heikens 10/17/2023
这是不允许的,你不能在 DDL 上使用 PREPARE,比如创建(临时)表。多次执行此语句无论如何都会导致错误。
0赞 Max888 10/17/2023
@FrankHeikens谢谢,非常感谢。是否允许在 CTE 上使用 PREPARE?我正在构建一个 Web 应用程序,我们所有的查询都是准备好的语句,因为它们需要使用参数。我已经将许多临时表和 CTE 添加到一个大型 SQL 文件中以减少代码重复,但似乎我将不得不将其全部剥离并接受重复。
1赞 Frank Heikens 10/17/2023
是的,您可以准备 CTE,试一试。您还可以将复杂的 SQL 放入 VIEW 和 FUNCTION 中,并准备它们。就我个人而言,我几乎从不使用临时桌子,在我的工作中总有更好的解决方案。

答: 暂无答案