我想在存储过程中创建一个临时表,其中设置了一个STABLE波动类别来存储选择的结果以供以后在存储过程中使用。在存储过程结束时,此临时表被释放,我确信此临时表不会对数据库产生任何影响,因为据我所知,对于此波动性类别,我确保优化器此存储过程不会影响数据库。
所以我想做这样的事情:
创建一个返回查询的存储过程:
CREATE OR REPLACE FUNCTION storedproc()
RETURNS TABLE
(Egy TEXT,
Ketto TEXT)
AS $$
BEGIN
RETURN QUERY SELECT * FROM temptable;
END;
$$ LANGUAGE plpgsql;
创建一个使用先前查询的存储过程:
CREATE OR REPLACE FUNCTION stablefunction()
RETURNS TABLE
(Egy TEXT,
Ketto TEXT)
AS $$
BEGIN
-- I would like to store the results here for later usage
CREATE TEMP TABLE buba AS select * from storedproc();
-- Do other stuff
-- ...
-- Reuse the results here which was stored before
END;
$$ LANGUAGE plpgsql
STABLE;
但是当我想像这样执行这个存储过程时:
DO
$$
BEGIN
perform stablefunction() ;
END;
$$ LANGUAGE plpgsql;
我收到以下错误消息:
ERROR: CREATE TABLE AS is not allowed in a non-volatile function
也许这不是存储过程的预期用途,但是有没有一种方法可以将查询结果存储在存储过程内部,以便以后在同一存储过程中使用,例如句柄或其他东西?
最佳答案
The documentation明确指出:稳定的函数无法修改数据库。临时表也是数据库的一部分,因此您无法创建它、插入、删除等。您的概念似乎有点奇怪,但是我不想评判它。有一个技巧可以让你做你想做的事。使用不必稳定的其他函数对临时表执行所有操作。示例:
create or replace function create_my_temp_table()
returns void language plpgsql volatile as $$
begin
create temp table temp_table(id int);
insert into temp_table values (123);
end $$;
create or replace function stable_function()
returns text language plpgsql stable as $$
begin
perform create_my_temp_table();
return 'ok';
end $$;
测试:
select stable_function();
stable_function
-------------
ok
(1 row)
select * from temp_table;
id
-----
123
(1 row)
关于postgresql - 在 postgresql 的 STABLE 存储过程中创建临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49742298/