rap*_*ael 8 postgresql transaction plpgsql postgresql-9.5
我正在将大量大文件导入到要使用匿名 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
Run Code Online (Sandbox Code Playgroud)
整个过程大约需要 15 个小时,我希望如果在某个时候出现导入错误,所有导入都不会回滚。
IIRCCOMMIT在存储函数中不起作用,因为整个函数被视为单个事务。
代码块被视为没有参数的函数体,返回 void。它被解析和执行一次。
我假设这意味着整个$do$事务是一个事务,因此块内的提交将不起作用。我对么?
小智 9
不,
您无法控制plpgsql函数(或匿名块)内的事务。
您可以在块外创建交易的唯一选择,例如:
BEGIN;
DO $$
-- function stuff
-- but if you use a exception, you will force a rollback
RAISE EXCEPTION 'message';
$$ LANGUAGE 'plpgsql';
COMMIT; -- OR ROLLBACK
Run Code Online (Sandbox Code Playgroud)
顺便说一句,DO BLOCKS与返回的函数具有相同的效果void。
请在文档中查看更多信息:
| 归档时间: |
|
| 查看次数: |
23048 次 |
| 最近记录: |