查询语言 (SQL) 和 PL/pgSQL 函数对临时表的处理方式不同:
begin;
create table foo(id) as values (1);
select * from foo;
/*
id
----
1
*/
savepoint s;
create function f() returns setof integer language sql as $$
create temporary table foo(id) on commit drop as values (2);
select id from foo;
$$;
select * from f();
/*
f
---
1
*/
rollback to s;
create function f() returns setof integer language plpgsql as $$
begin
create temporary table foo(id) on commit drop as values (2);
return query select id from foo;
end;
$$;
select * from f();
/*
f
---
2
*/
rollback;
文档说:
...当临时表存在时,具有相同名称的现有永久表对当前会话不可见,除非它们被模式限定名称引用...
这没有提到上面演示的异常。这在其他地方有记录吗?
换句话说,这适用于其他对象,而不仅仅是临时表。这也很容易证明:
甚至:
关于 pgsql-bugs的建议是修改文档以明确此行为。
编辑:
显然已经提交了对文档的更改,但尚未在9.4 文档中显示
我进行了一些测试并看到了相同的结果。在 SQL 函数中创建的临时表似乎被忽略了。我同意克雷格的观点,看起来像个虫子......
但是,我去年在 SO 的相关问题下宣传的技巧似乎仍然有效,但不适用于在SQL 函数中创建的临时表。在下面的演示
INSERT
中,一个 SQL 函数被重新规划好了......