COMMIT 在 PostgreSQL 9.5 中的匿名 plgpsql 函数中工作吗?

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在存储函数中不起作用,因为整个函数被视为单个事务。

文档中$do$

代码块被视为没有参数的函数体,返回 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

请在文档中查看更多信息: