我在'on commit drop'選項中使用函數中的臨時表。我的問題是,在某些情況下,更多的全局函數可以調用第一個函數兩次,因此在提交之前調用兩次「create temp table」 - 所以我有正常的錯誤「relation [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是非常大的(幾十幾百萬行),所以這樣我可以要求它只有一次而不是三次(搜索,計數和返回)。
我找到了一個不使用臨時表和創建類型的解決方法,但my_table的結構會改變很多次,實際上我有幾十個「我的表」和有關「我的函數」,所以這是一種方法每次我的表格結構都會改變時,不要再寫所有的函數。
函數必須返回與它請求的表相同的結構。
如何在離開功能時放下桌子?還是有更好的解決方法?
非常感謝這是完美的! –
此代碼會引發錯誤。 –