首页 > 解决方案 > 在 pl/pgsql-while 循环中更新单行表

问题描述

create table data(a1 float, a2 float);
insert into data values(1::float, 1::float);

do $$
declare 
   counter integer := 0;
begin
   while counter < 50 loop
      --SAVE THIS INTO DATA      
      SELECT a1-0.1*random(),
              a2-0.1*random()
      from data group by a1, a;
      --SAVE THIS INTO DATA (END)
      counter := counter + 1;
   end loop;
end$$;

我想将 和 的值保存a1a2第一个数据元组中。(基本上是一个运行记录)

如何将 a 的结果保存SELECT到现有表中?

标签: sqlpostgresqlplpgsql

解决方案


这会更容易PRIMARY KEY在桌子上:

create table data(id int primary key, a1 float, a2 float);
insert into data values(1, 1, 1);
select * from data;
 id | a1 | a2 
----+----+----
  1 |  1 |  1

update data set a1 = a1 - 0.1*random(), a2 = a2 - 0.1*random() where id =1;
select * from data;
 id |         a1         |        a2        
----+--------------------+------------------
  1 | 0.9039355377682678 | 0.98859843416964

然后将 合并UPDATE到计数器循环中:

do $$              
declare 
   counter integer := 0;
begin
   while counter < 50 loop
      --SAVE THIS INTO DATA      
     update data set a1 = a1 - 0.1*random(), a2 = a2 - 0.1*random() where id =1;  
    --SAVE THIS INTO DATA (END)
      counter := counter + 1;
   end loop;
end$$;

select * from data;
 id |         a1          |         a2         
----+---------------------+--------------------
  1 | -1.3146675853588001 | -1.216530003992667


推荐阅读