我想在存储过程中创建一个临时表,该存储过程具有 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;
我收到以下错误消息:
错误:非易失性函数中不允许使用CREATE TABLE AS
也许这不是存储过程的预期用法,但是有没有办法将查询结果存储在存储过程中以供以后在同一存储过程中使用,可能就像句柄或某些事情一样? / p>
答案 0 :(得分:2)
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)