繁体   English   中英

为什么函数的结果保存较晚?

[英]why results of function save late?

今天我面临一个奇怪的问题。 我想在视图中调用plpgsql函数(我知道这是调用函数的一种不好的奇怪方式,所以请不要在答案中提及它)。 我这样做,但函数的结果在显示视图结果后适用!!!

我想知道怎么可能? 以及如何在完成查询之前强制pgpgsql函数存储其结果?

有关我的代码的一些信息:

计划:这是有关旅行计划的表格,包括日期,旅行价格,价格等。

travel_check():这是一个从计划表中删除其date_of_travel小于current_date的记录并将其存储到另一个表并返回整数的函数(这并不重要,只记得此函数从计划表中删除一些记录),但我在下面写下了确切的定义:

    create or replace function finish_travel(todelete integer) returns void as
        $body$
        begin
            create table if not exists history_of_travel(
                id integer,
                traveldate date,
                source_id char(3),
                destination_id char(3),
                timeofday time
            );
            insert into history_of_travel
              select id,traveldate,source_id,destination_id,timeofday
              from plan
              where id=todelete;
            delete from plan where id=todelete;
        end;
        $body$
        language plpgsql volatile;


        create or replace function travel_check() returns int as
        $body$
        declare
          trip record;
        begin
            for trip in select *
                          from plan
            loop
                if(trip.traveldate<current_date) then
                    perform finish_travel(trip.id);
                end if;
                if(trip.traveldate=current_date and trip.timeofday=now()::timestamp(0)::time) then
                    perform finish_travel(trip.id);
                end if;
            end loop;
            return 1;
        end;
        $body$
        language plpgsql volatile;

我想创建一个包含两个步骤的视图:

  1. 调用功能和更新计划。
  2. 显示计划的记录。

我尝试下面的代码

           create view clients_select_query as
                       select plan.*
                       from plan,(select travel_check()) as d
                        where exists(select * from plan)

当我跑步时:

    select * from  clients_select_query

不幸的是,它显示了计划表的内容,没有任何更改

但是,如果我再次运行:

    select * from  clients_select_query

要么

    select * from plan

我看到更改已应用。

在不更改方法的情况下首次运行查询后如何查看更改?

如果不清楚,请告诉我准确定义功能,表和视图

结果不会“保存到很晚”,但是Postgres会向您隐藏更改,以便查询行为可预测。

Postgres的并发控制意味着查询开始运行后将看不到任何更改。 即使您自己的查询正在进行更改,也是如此,并且没有办法避免更改。

相反,您可以创建一个返回值的函数,该函数先执行删除操作,然后使用第二个查询返回表的内容。 然后,创建一个从该功能中选择的视图。

create function clients_select_function() returns setof plan as $$
  select travel_check();
  select * from plan;
$$
language sql;

create view clients_select_query as
  select * from clients_select_function();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM