Postgresql 在plpgsql中将查询结果选择为变量
我正在编写一个PL/PGSQL函数。它涉及处理查询结果。IIRC,从文档中可以看出,Postgresql 在plpgsql中将查询结果选择为变量,postgresql,stored-procedures,plpgsql,Postgresql,Stored Procedures,Plpgsql,我正在编写一个PL/PGSQL函数。它涉及处理查询结果。IIRC,从文档中可以看出,selectinto在这个实例中不起作用,但是,可以通过创建临时表来存储查询结果 我运行以下快速测试: create function foo() returns numeric as $body$ begin create temporary table footable as select * from some_table; return 1.23; end; $body$ lan
selectinto
在这个实例中不起作用,但是,可以通过创建临时表来存储查询结果
我运行以下快速测试:
create function foo() returns numeric as $body$
begin
create temporary table footable as
select * from some_table;
return 1.23;
end;
$body$ language plpgsql;
然后,我对其进行了如下运行测试:
select * from foo();
1.23
select * from foo();
ERROR: relation "footable" already exists
CONTEXT: SQL statement "create temporary table footable as select * from
some_table"
PL/pgSQL function "foo" line 1 at SQL statement
那么,如何将查询结果临时缓存在变量中,以便以后在存储过程中使用
我正在使用第8.4页。临时表将在当前会话结束时销毁(不是事务)。通过将
CREATE
语句修改为:
创建临时桌脚。。。关于提交丢弃代码>
当然,您不能在每个事务中多次运行此CREATE
,因为它将为您提供
关系“footable”已存在
错误。临时表在当前会话结束时被销毁(非事务)。通过将CREATE
语句修改为:
创建临时桌脚。。。关于提交丢弃代码>
当然,您不能在每个事务中多次运行此CREATE
,因为它将为您提供
关系“footable”已经存在
错误。有更多的方法-通常最好的方法是每个会话只创建一次临时表有更多的方法-通常最好的方法是每个会话只创建一次临时表在测试设置中,只有在test3()
的每个会话的第一次调用中才会引发异常。如果您更频繁地遇到异常,我希望它会更慢,就像OP可能会遇到的那样。另外,其中oid='omega'::regclass
可能比其中relname='omega'和pg_table_可见(oid)
更快?转换到regclass
会自动检查可见性。我不确定-test3的一个优点是使用内部缓存而不是完整的SQL查询。强制转换到regclass也会引发异常。您可以刷新此测试-9.2上的某些查询速度更快。在测试设置中,只有在每次test3()
会话的第一次调用中才会引发异常。如果您更频繁地遇到异常,我希望它会更慢,就像OP可能会遇到的那样。另外,其中oid='omega'::regclass
可能比其中relname='omega'和pg_table_可见(oid)
更快?转换到regclass
会自动检查可见性。我不确定-test3的一个优点是使用内部缓存而不是完整的SQL查询。强制转换到regclass也会引发异常。您可以刷新此测试-在9.2上某些查询可以更快。