এসকিউএল পোস্টগ্রিএসকিউএল ডাটাবেসে ফাইল থেকে এক্সএমএল পড়তে হবে


12

একটি পোস্টগ্রিএসকিউএল মানতে একটি এক্সএমএল ফাইলটি পড়তে আমি কীভাবে এসকিউএল লিখতে পারি XML?

PostgreSQL এর সাথে একটি পাঠ্য স্ট্রিংকে সেই ধরণের পার্স করতে ফাংশন সহ একটি নেটিভ এক্সএমএল ডেটাXMLPARSE টাইপ থাকে। ফাইল সিস্টেম থেকে ডেটা পড়ার উপায়ও রয়েছে; COPYবিবৃতি প্রমুখ।

তবে আমি কোনও ফাইল সিস্টেম এন্ট্রি থেকে সামগ্রীটি পড়তে এবং পোস্ট করতে একটি স্থানীয় মানের পোস্টগ্রিএসকিউএল এসকিউএল বিবৃতি লেখার কোনও উপায় দেখতে পাচ্ছি না XML। কিভাবে আমি এটি করতে পারব?

উত্তর:


10

পূর্ববর্তী প্রশ্নের এই উত্তরের অনুরূপ , এবং যদি আপনি এই সীমাবদ্ধতাগুলিpg_read_file() না চান (সংক্ষেপে: pg_read_fileডাটাবেস ডিরেক্টরিটির বাইরে ফাইলগুলি পড়তে না পারা এবং বর্তমান সেশনের অক্ষর এনকোডিংয়ের পাঠ্য পড়তে পারে)।

এই ফাংশনটি কোনও পাথের জন্য কাজ করে তবে এটি সুপারসুজার হিসাবে তৈরি করা দরকার:

create or replace function stack.bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
begin
  select lo_import(p_path) into l_oid;
  select lo_get(l_oid) INTO p_result;
  perform lo_unlink(l_oid);
end;$$;

lo_get 9.4 তে প্রবর্তিত হয়েছিল তাই পুরানো সংস্করণগুলির জন্য আপনার প্রয়োজন হবে:

create or replace function stack.bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
  r record;
begin
  p_result := '';
  select lo_import(p_path) into l_oid;
  for r in ( select data 
             from pg_largeobject 
             where loid = l_oid 
             order by pageno ) loop
    p_result = p_result || r.data;
  end loop;
  perform lo_unlink(l_oid);
end;$$;

তারপর:

select convert_from(stack.bytea_import('/tmp/test.xml'), 'utf8')::xml;

1
+1, ফাইল-পঠন কার্যকারিতার সীমাবদ্ধতা দেখানোর জন্য ধন্যবাদ।
বাইনোজ করুন

1
অবরুদ্ধ করার জন্য +1 দুর্দান্ত কৌশল pg_read_file()। অস্থায়ী টেবিলের সাহায্যেও এটি অর্জন করা যায় এবং COPY- 1 সারিটির 1 টি কলামটি বসান।
এরউইন ব্র্যান্ডসটেটার

4

pg_read_binary_fileফাংশন এটা করতে পারেন।

এর সীমাবদ্ধতা রয়েছে: পোস্টগ্রেএসকিউএল 9.1 বা তদূর্ধে নতুন; ডাটাবেস সুপারউজারের মালিকানাধীন একটি সেশন হতে হবে; ডাটাবেস ডিরেক্টরিতে বা নীচে একটি ফাইল অবশ্যই পড়তে হবে। এগুলি আমার ব্যবহারের ক্ষেত্রে গ্রহণযোগ্য।

সুতরাং নিম্নলিখিতটি XMLএকটি ফাইল থেকে একটি স্থানীয় মান তৈরি করতে কাজ করবে :

-- PostgreSQL 9.1 or later.
SELECT
    XMLPARSE(DOCUMENT convert_from(
        pg_read_binary_file('foo.xml'), 'UTF8'));

PostgreSQL 8.3 - 9.0 এ, pg_read_fileঅতিরিক্ত সীমাবদ্ধতার সাথে আপনি কোনও ফাইল-নির্দিষ্ট এনকোডিং নির্দিষ্ট করতে পারবেন না (এটি বর্তমান সেশনের এনকোডিংয়ের ক্ষেত্রে পাঠ্য হিসাবে ফাইলটি পড়ে) এই ফাংশনটি ব্যবহার করা যেতে পারে।

-- PostgreSQL earlier than 9.1.
SELECT
    XMLPARSE(DOCUMENT pg_read_file('foo.xml'));

3

আপনি এসও সম্পর্কে সাম্প্রতিক উত্তরে যা জিজ্ঞাসা করছেন তার একটি সম্পূর্ণ বাস্তবায়ন পোস্ট করেছি ।

মূল বৈশিষ্ট্যগুলি হল xpath()ফাংশন, pg_read_file(), এরে হ্যান্ডলিং, plpgsql ফাংশন, ..


এই ক্ষেত্রে আমার যা প্রয়োজন তার চেয়ে বরং আলাদা (এবং আরও বেশি ভারী ওজন) তবে ভাল দিকের জন্য +1, আপনাকে ধন্যবাদ।
বাইনোজ করুন

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