Ope*_*umb 6 sql postgresql temp-tables user-defined-functions
这可能是因为我累了,或者我是 postgres 新手。然而,我试图在函数中使用临时表,postgres 抱怨“关系不存在”。然而,如果我获取函数的主体并执行它,它就可以正常工作。下面是我尝试创建的函数类型的示例。请记住,我已经删除了所有有趣的内容,以便以接近最低限度的方式显示我的问题。
CREATE OR REPLACE FUNCTION dbo.somefunc() RETURNS void AS
$BODY$
CREATE TEMPORARY TABLE work_list
(
name text,
level smallint
);
insert into work_list
(name, level)
values
('someone', 25);
$BODY$
LANGUAGE sql VOLATILE;
Run Code Online (Sandbox Code Playgroud)
我收到的投诉是在插入声明中。实际的投诉是:
ERROR: relation "work_list" does not exist
Run Code Online (Sandbox Code Playgroud)
postgres 不支持函数中的临时表吗?或者是否有一些我错过的语法问题导致该问题令人窒息并且给了我一个虚假错误?
Postgres 对您尝试创建的函数运行一些简单的检查,它(正确地)发现该表work_list(尚)不存在。我看到两个选择:
CREATE TEMP TABLE IF NOT EXISTS在你的函数中使用(Postgres 9.1+)。如果表已经存在,您可能想要截断该表......但是(请参阅下面的评论),引用手册
SQL 函数的整个主体在执行任何一个之前都会被解析。虽然 SQL 函数可以包含更改系统目录的命令(例如,
CREATE TABLE),但在函数中后续命令的解析分析过程中,此类命令的效果将不可见。因此,例如,如果打包到单个 SQL 函数中,将无法按预期工作,因为解析命令CREATE TABLE foo (...); INSERT INTO foo VALUES(...);时 foo 还不存在。在这种情况下,建议使用 PL/pgSQL 而不是 SQL 函数。INSERT
大胆强调我的。
plpgsql 中的检查不太彻底。如果 Postgres 仍然抱怨(在本例中没有),您还可以使用EXECUTE.
旁白:在许多情况下,有一个性能更高的解决方案,无需临时表......
| 归档时间: |
|
| 查看次数: |
11894 次 |
| 最近记录: |