SQL PostgreSQL डेटाबेस में फ़ाइल से XML पढ़ने के लिए


12

मैं एक XML फ़ाइल को पोस्टग्रेक्यूएल XMLमान में पढ़ने के लिए एसक्यूएल कैसे लिख सकता हूं ?

PostgreSQL के पास एक मूल XML डेटा प्रकार है जिसमें 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, यह इंगित करने के लिए धन्यवाद कि फ़ाइल-रीडिंग फ़ंक्शन की सीमाएँ हैं।
12

1
खतना करने के लिए +1 अच्छी चाल pg_read_file()। वही एक अस्थायी तालिका के साथ भी प्राप्त किया जा सकता है और COPY- केवल 1 पंक्ति के 1 कॉलम को आबाद करें।
एरविन ब्रान्डसेट्टर

4

pg_read_binary_fileसमारोह ऐसा कर सकते हैं।

इसकी सीमाएँ हैं: PostgreSQL 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, धन्यवाद।
bignose

ऐसा नहीं है कि हेवीवेट है, मेरा उदाहरण सिंटैक्स वेरिएंट को प्रदर्शित करने के लिए निरर्थक तत्वों के साथ बहुत पूरा है।
इरविन ब्रान्डेसटेटर 12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.