SQL XML'i dosyadan PostgreSQL veritabanına okumak için


12

Bir XML dosyasını PostgreSQL XMLdeğerine okumak için SQL'i nasıl yazabilirim ?

PostgreSQL, bir metin dizesini bu türle ayrıştırma işlevine sahip yerel bir XML veri türüne sahiptir XMLPARSE. Ayrıca dosya sisteminden veri okuma yolları vardır; COPYdiğerleri arasında ifadesi.

Ancak bir dosya sistemi girişinden içeriği okumak ve bir XMLdeğeri doldurmak için kullanmak için yerel PostgreSQL SQL ifadeleri yazmak için bir yol görmüyorum . Bunu nasıl yapabilirim?

Yanıtlar:


10

Önceki bir soruya verilen bu cevaba benzer ve kısıtlamalarınıpg_read_file() istemiyorsanız (kısaca: pg_read_fileveritabanı dizininin dışındaki dosyaları okuyamaz ve geçerli oturumun karakter kodlamasındaki metni okur).

Bu işlev herhangi bir yol için çalışır, ancak süper kullanıcı olarak oluşturulması gerekir:

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 sürümünde tanıtıldı, böylece eski sürümler için ihtiyacınız olacak:

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;$$;

sonra:

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

1
+1, dosya okuma işlevlerinde sınırlamalar olduğunu belirttiğiniz için teşekkürler.
12'de bignose

1
Atlamak için +1 güzel numara pg_read_file(). Aynı şey geçici bir tablo ile de elde edilebilir ve COPY- 1 satırdan sadece 1 sütun doldurun.
Erwin Brandstetter

4

pg_read_binary_fileFonksiyonu yapabilirsiniz.

Sınırlamaları vardır: PostgreSQL 9.1 veya üstü sürümlerde yeni; veritabanı süper kullanıcısına ait bir oturum olmalıdır; veritabanı dizinindeki veya altındaki bir dosyayı okumalıdır. Bunlar benim kullanım durumumda kabul edilebilir.

Dolayısıyla, XMLbir dosyadan yerel bir değer oluşturmak için aşağıdakiler işe yarayacaktır :

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

PostgreSQL 8.3 - 9.0'da pg_read_filefonksiyon, dosyaya özel bir kodlama belirleyemediğiniz ek sınırlama ile birlikte kullanılabilir (dosyayı geçerli oturumun kodlamasında metin olarak okur).

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

3

SO ile ilgili son bir cevapta ne istediğinizi tam olarak uyguladım .

Anahtar özellikler xpath()fonksiyon pg_read_file(), dizi işleme, plpgsql fonksiyonları, ..


Bu durumda ihtiyacım olandan farklı (ve daha ağır). Ama iyi yön için +1, teşekkür ederim.
12'de bignose

O kadar ağır değil , benim örneğim sözdizimi değişkenlerini göstermek için artık öğelerle çok eksiksiz.
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.