COMMIT ทำงานภายในฟังก์ชัน plgpsql แบบไม่ระบุชื่อใน PostgreSQL 9.5 หรือไม่


8

$do$ฉันกำลังนำเข้าเป็นจำนวนมากของไฟล์ขนาดใหญ่เป็นจำนวนของตารางการแบ่งพาร์ติชันโดยใช้ลูปภายในการป้องกันรหัส plpgsql ที่ไม่ระบุชื่อ

$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ไม่ทำงานภายในฟังก์ชั่นที่จัดเก็บ bc ฟังก์ชั่นทั้งหมดจะถือว่าเป็นธุรกรรมเดียว

จากเอกสารสำหรับ$do$

บล็อกโค้ดจะได้รับการปฏิบัติเสมือนเป็นส่วนหนึ่งของฟังก์ชันที่ไม่มีพารามิเตอร์ส่งคืนโมฆะ มันถูกแยกวิเคราะห์และดำเนินการในครั้งเดียว

ฉันสมมติว่านี่หมายความว่าทั้งหมด$do$เป็นธุรกรรมเดียวดังนั้นการกระทำภายในบล็อกจะไม่ทำงาน ฉันถูกไหม?


1
ลองBEGINหรือCOMMITในร่างกายของฟังก์ชั่น คุณจะได้รับข้อยกเว้นเนื่องจากไม่อนุญาต (ไม่สามารถทำได้)
Erwin Brandstetter

คำตอบ:


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

BTW, มีผลเช่นเดียวกันว่าฟังก์ชั่นที่ให้ผลตอบแทนDO BLOCKSvoid

โปรดดูเพิ่มเติมที่เอกสาร:


เรารู้หรือไม่ว่านี่ยังเป็นกรณีนี้อยู่ ฉันมีฟังก์ชั่นที่ต้องวนซ้ำหลายร้อยครั้ง ลูปแรกใช้เวลา 2 วินาทีหลังจากวันที่ 7 ใกล้ถึงหนึ่งชั่วโมงและฉันไม่เห็นอะไรเลยหลังจากลูปที่ 10
Dennis Bauszus

1

ทางออกเดียวที่จะคอมมิทภายในบล็อค "DO" (หรือฟังก์ชั่น) (สำหรับรุ่น Postgresql ที่น้อยกว่า 11) คือการใช้การเชื่อมต่อ dblink กับเซิร์ฟเวอร์เครื่องเดียว เพียงจำไว้ในใจตัวแปรและการมองเห็นวัตถุชั่วคราว

ข้อมูลเพิ่มเติมเกี่ยวกับ dblink เริ่มต้นด้วยการควบคุมการทำธุรกรรม Postgresql-11 จากภายในบล็อก "DO" พร้อมใช้งานในขณะที่ "DO-block" ไม่ทำงานภายในธุรกรรมอื่น


postgresql.org/docs/11/sql-do.htmlสถานะ 'อนุญาตให้ใช้งบการควบคุมการทำธุรกรรมเฉพาะเมื่อมีการใช้งาน DO ในการทำธุรกรรมของตัวเอง' แน่นอนว่าไม่เป็นความจริงกับ 9.5 OTOH กับdblinkคุณจะเปิดธุรกรรมใหม่ดังนั้นการCOMMITโทรของคุณจะไม่มีผลต่อการทำธุรกรรมการโทรหากฉันไม่เข้าใจผิด
dezso

ความผิดฉันเอง. การควบคุมการทำธุรกรรมภายใน "DO" ถูกนำมาใช้ใน Postgresql-11 ฉันแค่ตรวจสอบ 10.4 ยังคงไม่ทำงาน
Dzhureedzh

@dezso ขอบคุณที่ชี้ให้ฉันเห็นสิ่งนี้ฉันใช้วิธี dblink แม้ในเซิร์ฟเวอร์ PG11
Dzhureedzh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.