Postgres中的循环显然只在循环完成时才进行批量插入。我想在每个循环步骤中执行此操作。例如:
CREATE OR REPLACE FUNCTION harmonize () RETURNS integer AS $$
DECLARE
BEGIN
FOR i in 1..1000000 LOOP
INSERT INTO test VALUES (1000, 'some name', 1978002939, 1978002930, 0.0);
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql VOLATILE;
我希望在所有百万步骤结束之前看到表中的记录。
答案 0 :(得分:1)
你不能在这种功能中这样做,因为PostgreSQL中的语句在单个事务中运行。只有当语句结束且没有错误时,任何更改才会对其他客户端可见。
您可以使用postgres_fdw
扩展程序来解决此问题。它可以连接到自身并在每个循环步骤上执行插入和提交。但它效率极低 - 比慢1000倍。并且很难以安全的方式进行配置。
你可以在沐浴时进行这种插入,这样可以减少痛苦。如:start transaction,insert 1000 rows,commit,repeat。
相反,我会在外部程序中实现类似的东西:
set synchronous_commit=off;
COPY
代替INSERT
; copy
,例如1000行,并在每批后提交。