如何分别执行两个查询?

时间:2018-01-12 12:28:20

标签: postgresql

我创建了一个函数,它在表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()正在执行的快照中。

我该怎么做?

1 个答案:

答案 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
;