কোনও কমিট পোস্টগ্রিজ এসকিউএল 9.5 এ কোনও বেনামে plgpsql ফাংশনের মধ্যে কাজ করে?


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 ঘন্টা সময় নিতে হবে এবং আমি আশা করছি যে কোনও পর্যায়ে আমদানি ত্রুটি থাকলে সমস্ত আমদানি ফিরিয়ে নেওয়া হবে না।

আইআইআরসি 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

বিটিডাব্লু, DO BLOCKSএকই কার্যকারিতা রয়েছে যা ফাংশন দেয় void

দয়া করে ডকটিতে আরও দেখুন:


আমরা কি জানি যে এখনও এই ঘটনাটি আছে কিনা? আমার একটি ফাংশন রয়েছে যা কয়েকশবার লুপ করা দরকার। প্রথম লুপটি 2 সেকেন্ডের পরে 7 তম এক ঘন্টার কাছাকাছি সময় নেয় এবং আমি 10 তম লুপের পরে কিছুই দেখিনি।
ডেনিস বাউজুস

1

"ডিও" ব্লক (বা ফাংশন) এর মধ্যে কমিট করার একমাত্র সমাধান (পোস্টগ্র্রেসকিএল সংস্করণের জন্য 11 কম) তখন একই সার্ভারে ডাব্লিংক সংযোগ ব্যবহার করা সেখানে আপনার প্রশ্নগুলি কার্যকর করে। কেবল ভেরিয়েবল এবং অস্থায়ী বস্তুর দৃশ্যমানতার কথা মাথায় রাখুন।

ডিবিলিঙ্ক সম্পর্কিত আরও তথ্য "ডিও" ব্লকের অভ্যন্তর পোস্টগ্র্রেসকিএল -11 লেনদেন নিয়ন্ত্রণের সাথে শুরু করা পাওয়া যায় যখন "ডিও-ব্লক" অন্যান্য লেনদেনের মধ্যে চলছে না।


postgresql.org/docs/11/sql-do.html বলেছে 'ডিও এর নিজের লেনদেনে মৃত্যুদণ্ড কার্যকর করা হলেই লেনদেন নিয়ন্ত্রণের বিবৃতি অনুমোদিত হয় are' এটি অবশ্যই 9.5 এর সাথে সত্য ছিল না। dblinkআপনার সাথে ওটিওএইচ আরেকটি লেনদেন খুলবে, তাই COMMITযদি আমার ভুল না হয় তবে আপনার কল কলিং লেনদেনকে প্রভাবিত করবে না।
dezso

আমার খারাপ। "ডিও" এর মধ্যে লেনদেন নিয়ন্ত্রণ পোস্টগ্রেস্কেল -11-এ চালু হয়েছিল। আমি কেবল 10.4 এ পরীক্ষা করে দেখছি এখনও কাজ করছে না।
ডিঝিউরেদজ

@ ডিজেসো আমাকে এটি দেখানোর জন্য আপনাকে ধন্যবাদ, আমি এমনকি পিজি 11 সার্ভারগুলিতে ডিবিলিংক পদ্ধতিটি ব্যবহার করছিলাম।
ডিঝিউরেদজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.