插入循环的每一步

时间:2015-01-29 21:07:29

标签: database postgresql loops plpgsql sql-insert

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;

我希望在所有百万步骤结束之前看到表中的记录。

1 个答案:

答案 0 :(得分:1)

你不能在这种功能中这样做,因为PostgreSQL中的语句在单个事务中运行。只有当语句结束且没有错误时,任何更改才会对其他客户端可见。

您可以使用postgres_fdw扩展程序来解决此问题。它可以连接到自身并在每个循环步骤上执行插入和提交。但它效率极低 - 比慢1000倍。并且很难以安全的方式进行配置。

你可以在沐浴时进行这种插入,这样可以减少痛苦。如:start transaction,insert 1000 rows,commit,repeat。

相反,我会在外部程序中实现类似的东西:

相关问题