【问题标题】:postgres doesn't recognize temp table in functionpostgres 无法识别函数中的临时表
【发布时间】:2013-10-21 14:49:02
【问题描述】:

这可能是因为我累了,或者我是 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;

我收到的投诉是关于插入语句的。实际的投诉是:

ERROR:  relation "work_list" does not exist

postgres 不支持函数中的临时表吗?或者是否有一些我遗漏的语法内容令人窒息并且给了我一个虚假的错误?

【问题讨论】:

    标签: sql postgresql user-defined-functions temp-tables


    【解决方案1】:

    Postgres 对您尝试创建的函数运行一些简单的检查,并且它(正确地)发现表 work_list 不(尚)存在。我看到两个选项:

    1。 “假装成功”

    在创建函数之前实际创建(临时)表。临时表将在会话结束时消失,但一旦创建函数,您就已经通过了这个测试。
    显然,在同一会话中运行该函数之前,您必须删除该表以避免冲突。不过更好的是:在你的函数中使用CREATE TEMP TABLE IF NOT EXISTS(Postgres 9.1+)。如果表已经存在,您可能需要截断它...

    但是(参见下面的 cmets),引用手册

    一个 SQL 函数的整个主体在它被解析之前被解析 执行。虽然 SQL 函数可以包含改变 系统目录(例如,CREATE TABLE),此类命令的效果 在对后面的命令进行解析分析期间将不可见 功能。因此,例如,如果将CREATE TABLE foo (...); INSERT INTO foo VALUES(...); 打包到单个 SQL 中,将无法正常工作 函数,因为当解析 INSERT 命令时 foo 还不存在。 建议使用 PL/pgSQL 代替 SQL 函数 情况类型。

    我的大胆强调。

    2。改用 PL/pgSQL

    在 plpgsql 中检查不那么彻底。如果 Postgres 仍然抱怨(在这种情况下没有),您也可以execute SQL dynamically with EXECUTE

    顺便说一句:在许多情况下,没有临时表的性能更高的解决方案即将到来......

    【讨论】:

    • “假装”方法真的有效吗? This is why I ask.
    • @JackDouglas:在重新测试时,我发现 SQL 函数似乎忽略了函数内部创建的临时表。最好为此使用 plpgsql。更多在your new question on dba.SE.
    • 如果您将函数定义放在迁移脚本中,您可以SET check_function_bodies = false; 以防止在函数加载过程中出现关系不存在错误。
    • @Guy:虽然这可以避免在函数创建时出现错误消息,但在执行时您仍然会收到错误消息。我在上面添加了详细信息。
    【解决方案2】:

    结合这两个语句。通过执行“select into”类型语法来创建临时表。这样你就可以做到。 CREATE TEMP TABLE SomeTable AS SELECT * FROM OtherTable ;

    【讨论】:

    • 函数后面如果需要从SomeTable中选择,还是会得到ERROR: relation "SomeTable" does not exist
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2011-07-10
    • 2017-06-04
    相关资源
    最近更新 更多