postgresql - 在 postgresql 的 STABLE 存储过程中创建临时表

标签 postgresql plpgsql

我想在存储过程中创建一个临时表,其中设置了一个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/

相关文章:

function - PostgreSQL:错误:$name$ 不是标量变量

sql - 当第一个 SELECT 不返回行时从函数返回默认行

sql - Postgres中相关的时间戳

postgresql - 如何在没有 FK 的情况下映射表

xml - 如何在postgresql中返回xml数据

postgresql - 更改日期触发

regexp_matches 在 plpgsql 函数中返回 NULL

postgresql - 如何从 Postgres 事件触发器中获取 SQL 文本

postgresql - 如何将表导出为带有 Postgresql 标题的 CSV?

ruby-on-rails - Rails 中的 PostgreSQL : How do I make the server run locally AND accept connections on the Unix domain socket?