我正在将大量大文件导入到多个表中,这些表要使用匿名 plpgsql 代码块中的循环进行分区$do$
。
$do$
BEGIN
FOR yyyy in 2012..2016 THEN
EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
END LOOP;
END;
$do$ LANGUAGE plpgsql
整个过程大约需要 15 个小时,我希望如果在某些时候出现导入错误,所有导入都不会回滚。
IIRCCOMMIT
在存储函数中不起作用,因为整个函数被视为单个事务。
代码块被视为没有参数的函数体,返回 void。它被解析并执行一次。
我假设这意味着整个$do$
事务是一个事务,因此块内的提交将不起作用。我对么?
不,
您无法控制
plpgsql
函数(或匿名块)内的事务。您可以在块外创建交易的唯一选择,例如:
顺便说一句,
DO BLOCKS
与返回的函数具有相同的效果void
。请在文档中查看更多信息:
在“DO”块(或函数)(对于低于 11 的 Postgresql 版本)内提交的唯一解决方案是使用 dblink 连接到同一服务器并在那里执行您的查询。请记住变量和临时对象的可见性。
有关 dblink 的更多信息 从“DO”块内部的 Postgresql-11 事务控制开始可用,而“DO 块”不在其他事务中运行。