我创建了一个函数,它在表my_table
中插入一些行并返回它们的标识符:
create function step_1() returns setof uuid as
$$
insert into my_table(...) values(...) returning identifier;
$$
language sql volatile;
现在我想在另一个选择查询中使用此函数:
create function step_2() returns setof my_table as
$$
select *
from my_table
where identifier in(select * from step_1());
$$
language sql volatile;
这里的问题是step_1()
永远不会被执行,因为最初my_table
不包含任何行,所以PostgreSQL正在优化以不执行select * from step_1()
。
我想我需要两件事:
step_1()
的内容如何,都应始终执行my_table
。step_1()
应作为单独的查询/上下文执行,因此当step_2()
执行select
时,它实际上会看到插入的行。插入的行应存在于step_2()
正在执行的快照中。我该怎么做?
答案 0 :(得分:1)
create table my_table (identifier uuid)
;
create function step_1() returns setof uuid as $$
insert into my_table (identifier) values (gen_random_uuid())
returning identifier;
$$ language sql volatile
;
create or replace function step_2() returns setof my_table as $$
declare a_identifier uuid[];
begin
a_identifier := (
select array_agg(identifier)
from step_1() s (identifier)
)
;
return query
select *
from my_table
where identifier = any (a_identifier)
;
end;
$$ language plpgsql volatile
;