क्या एक पोस्टग्रेक्सेल 9.5 में अनाम प्लेगसक्कल फ़ंक्शन के भीतर एक कमिट काम करता है?


8

मैं एक अनाम 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संग्रहीत कार्यों के भीतर काम नहीं करता है, संपूर्ण फ़ंक्शन को एक ही लेनदेन के रूप में माना जाता है।

के लिए प्रलेखन से$do$

कोड ब्लॉक के रूप में माना जाता है, क्योंकि यह बिना किसी पैरामीटर के एक फ़ंक्शन का शरीर था, जो शून्य है। इसे एक ही बार में पार्स और निष्पादित किया जाता है।

मैं मान रहा हूं कि इसका मतलब है कि पूरा $do$एक लेन-देन है, और इसलिए ब्लॉक के भीतर काम नहीं करेगा। क्या मैं सही हूँ?


1
प्रयास करें BEGINया COMMITफ़ंक्शन बॉडी में। आपको एक अपवाद मिलेगा, क्योंकि इसकी अनुमति नहीं है (संभव नहीं है)।
एरविन ब्रान्डसेट्टर

जवाबों:


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 BLOCKSका वही प्रभाव पड़ता है जो वापस लौटता है void

कृपया, डॉक पर अधिक देखें:


क्या हम जानते हैं कि क्या अभी भी ऐसा ही है? मेरे पास एक फ़ंक्शन है जिसे कई सौ बार लूप करने की आवश्यकता है। पहला लूप 7 घंटे के करीब होने के बाद 2 सेकंड लेता है और मैंने 10 वें लूप के बाद कुछ भी नहीं देखा है।
डेनिस बाऊज़स

1

"डीओ" ब्लॉक (या फ़ंक्शंस) (पोस्टग्रैस्कल संस्करण कम तब 11 के लिए) के भीतर करने के लिए एकमात्र समाधान उसी सर्वर से dblink कनेक्शन का उपयोग करना है जो आपके प्रश्नों को निष्पादित करता है। बस चर और अस्थायी वस्तुओं की दृश्यता को ध्यान में रखें।

Dblink के बारे में अधिक जानकारी Postgresql-11 लेनदेन नियंत्रण के साथ "DO" ब्लॉक के अंदर से शुरू होती है, जबकि "DO-block" अन्य लेनदेन के भीतर नहीं चल रही है।


postgresql.org/docs/11/sql-do.html में कहा गया है कि 'लेन-देन नियंत्रण कथनों को केवल तभी अनुमति दी जाती है यदि DO को अपने लेन-देन में निष्पादित किया जाता है।' यह निश्चित रूप से 9.5 के साथ सच नहीं था। dblinkआपके साथ OTOH एक और लेन-देन खोलेगा, इसलिए COMMITअगर मैं गलत नहीं हूँ तो आपका कॉल कॉलिंग लेनदेन को प्रभावित नहीं करेगा।
डेज़ो

मेरी गलती। "डीओ" के भीतर ट्रांज़ैक्शन कंट्रोल को पोस्टग्रैस्कल -11 में पेश किया गया था। मैं सिर्फ 10.4 पर जांच करता हूं फिर भी काम नहीं कर रहा हूं।
दजुरेद्ज़ज़ज़

@dezso मुझे इस ओर इशारा करने के लिए धन्यवाद, मैं PG11 सर्वर पर भी dblink विधि का उपयोग कर रहा था।
Dzhureedzh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.