匿名の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時間かかります。ある時点でインポートエラーが発生した場合、すべてのインポートがロールバックされないことを願っています。
IIRC COMMIT
は、関数全体が単一のトランザクションとして扱われるため、ストアド関数内では機能しません。
コードブロックは、パラメーターのない関数の本体であるかのように扱われ、voidを返します。解析と実行は1回です。
これは、全体$do$
が1つのトランザクションであるため、ブロック内のコミットが機能しないことを想定しています。私は正しいですか?
BEGIN
またはCOMMIT
関数本体で試してください。許可されていない(不可能)ため、例外が発生します。