退出函数时删除临时表

Posted

技术标签:

【中文标题】退出函数时删除临时表【英文标题】:Drop temporary table when exiting a function 【发布时间】:2015-10-07 16:56:10 【问题描述】:

我在带有“on commit drop”选项的函数中使用临时表。我的问题是,在某些情况下,一个更全局的函数可以调用第一个函数两次,因此“创建临时表”在提交之前被调用了两次 - 所以我有正常的错误“关系 [my_temp_table] 已经存在”。

我使用函数末尾的临时表在“返回查询”中返回它的行,所以我不能在离开函数之前手动删除表。

CREATE OR REPLACE FUNCTION my_function(_value text)
RETURNS setof my_table AS $$
DECLARE 
    resultCount integer := 0;
BEGIN

    create temp table my_temp_table on commit drop as
    select *
    from my_table 
    where value = _value ;

    select count(*) into resultCount from my_temp_table;
    if (resultCount = 0) then 
        raise exception 'value not found';
        end if;

    return query
    select * from my_temp_table;

END;$$ LANGUAGE plpgsql VOLATILE COST 100;
ALTER FUNCTION my_function(text) OWNER TO postgres

如果您想知道为什么我直接使用临时表而不是 my_table,那是因为我需要一个非常快速的响应并且 my_table 非常大(几千万行)所以这样我只能请求一次而不是3 次(搜索、计数和返回)。

我找到了一个不使用临时表并创建类型的解决方法,但是 my_table 的结构会改变很多次,实际上我有几十个“我的表”和相关的“我的函数”,所以这是一种方法每次我的表结构发生变化时,不要重新编写所有函数。

函数必须返回与其请求的表相同的结构。

离开函数时如何删除表格?还是有更好的解决方法?

【问题讨论】:

【参考方案1】:

...在“返回查询”中返回它的行,所以我不能在离开函数之前手动删除表。

其实你可以。您可以在您的情况下使用多个RETURN QUERY。 手动后:

当一个 PL/pgSQL 函数被声明为返回 SETOF [...] 时,要返回的单个项目由一系列 RETURN NEXT 或 RETURN QUERY 命令指定,然后使用不带参数的最终 RETURN 命令来指示该函数已完成执行

所以你可以这样做:

RETURN QUERY
       SELECT * FROM my_temp_table;
DROP TABLE my_temp_table;
RETURN;

【讨论】:

【参考方案2】:

您可以删除表格以防万一

...
BEGIN
    drop table if exists my_temp_table;
    create temp table my_temp_table on commit drop as
    ....

但是...实际上您不需要临时表。试试这个代码:

...
    return query
    select *
    from my_table 
    where value = _value ;

    if not found then
        raise exception 'value not found';
    end if;
...

【讨论】:

我将使用下面最后的“return”,但我肯定会使用“if not found”!非常感谢!

以上是关于退出函数时删除临时表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL创建临时表?

临时表,临时表什么时候删除

MySQL 临时表:创建删除语法剖析

sql server中的临时表表变量和公用表表达式

SQL Server 表变量和临时表的区别

linux怎么修改mysql数据库临时表空间大小