退出函数时删除临时表
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”!非常感谢!以上是关于退出函数时删除临时表的主要内容,如果未能解决你的问题,请参考以下文章