Postgresql函数卡在for循环中,查询永远不会结束

Postgresql函数卡在for循环中,查询永远不会结束,postgresql,plpgsql,Postgresql,Plpgsql,函数卡在for循环中,查询保持查询状态且永不结束: ALTER TABLE movement ADD COLUMN bar_id INTEGER; CREATE OR REPLACE FUNCTION get_all_movement() RETURNS SETOF movement AS $BODY$ DECLARE barid INTEGER; m movement%ROWTYPE; BEGIN FOR m IN SELECT * FROM movement LOOP barid

函数卡在for循环中,查询保持查询状态且永不结束:

ALTER TABLE movement ADD COLUMN bar_id INTEGER;

CREATE OR REPLACE FUNCTION get_all_movement() RETURNS SETOF movement AS
$BODY$
DECLARE
barid INTEGER;
m movement%ROWTYPE;
BEGIN
 FOR m IN
  SELECT * FROM movement
 LOOP
 barid:= (SELECT bar_id FROM employee WHERE employee_id  = m.employee_id);
  UPDATE movement SET bar_id = barid;
  RETURN NEXT m;
 END LOOP;
 RETURN;
END
$BODY$
LANGUAGE 'plpgsql';

SELECT * FROM get_all_movement();

我能做什么?

您不需要函数和循环,update语句将是最简单和最有效的:

update movement m
set bar_id = e.bar_id
from employee e
where m.employee_id = e.employee_id
returning m.*;

您的函数尝试在每个步骤中更新整个表。这可能会持续数小时,具体取决于数据量,更不用说结果会不正确。您忘记了
UPDATE
语句中的
WHERE
子句:

...
  UPDATE movement SET bar_id = barid
  WHERE employee_id = m.employee_id;
...

@klin的回答是完美的。如果您每一个周期都更新一个完整的表,那么它应该非常慢。有时可以使用调试打印-提高通知语句-打印一些消息。你们可以看到,PL函数仍然存在。