PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

bagaimana saya bisa membuat file XML baru dari database yang ada di database PostgreSQL menggunakan java

Saya memiliki implementasi yang berfungsi di mana saya melakukan semuanya di dalam PostgreSQL tanpa pustaka tambahan.

Fungsi penguraian tambahan

CREATE OR REPLACE FUNCTION f_xml_extract_val(text, xml)
  RETURNS text AS
$func$
SELECT CASE
        WHEN $1 ~ '@[[:alnum:]_]+$' THEN
           (xpath($1, $2))[1]
        WHEN $1 ~* '/text()$' THEN
           (xpath($1, $2))[1]
        WHEN $1 LIKE '%/' THEN
           (xpath($1 || 'text()', $2))[1]
        ELSE
           (xpath($1 || '/text()', $2))[1]
       END;
$func$  LANGUAGE sql IMMUTABLE;

Menangani banyak nilai

Implementasi di atas tidak menangani banyak atribut di satu xpath. Berikut adalah versi kelebihan dari f_xml_extract_val() untuk itu. Dengan parameter ke-3 Anda dapat memilih one (yang pertama), all atau dist (berbeda) nilai. Beberapa nilai digabungkan ke string yang dipisahkan koma.

CREATE OR REPLACE FUNCTION f_xml_extract_val(_path text, _node xml, _mode text)
  RETURNS text AS
$func$
DECLARE
   _xpath text := CASE
                   WHEN $1 ~~ '%/'              THEN $1 || 'text()'
                   WHEN lower($1) ~~ '%/text()' THEN $1
                   WHEN $1 ~ '@\w+$'            THEN $1
                   ELSE                              $1 || '/text()'
                  END;
BEGIN
   -- fetch one, all or distinct values
   CASE $3
       WHEN 'one'  THEN RETURN (xpath(_xpath, $2))[1]::text;
       WHEN 'all'  THEN RETURN array_to_string(xpath(_xpath, $2), ', ');
       WHEN 'dist' THEN RETURN array_to_string(ARRAY(
            SELECT DISTINCT unnest(xpath(_xpath, $2))::text ORDER BY 1), ', ');
       ELSE RAISE EXCEPTION
          'Invalid $3: >>%<<', $3;
   END CASE;
END
$func$  LANGUAGE plpgsql;

COMMENT ON FUNCTION f_xml_extract_val(text, xml, text) IS '
Extract element of an xpath from XML document
Overloaded function to f_xml_extract_val(..)
$3 .. mode is one of: one | all | dist'

Telepon:

SELECT f_xml_extract_val('//city', x, 'dist');

Bagian utama

Nama tabel target:tbl; formal. kunci:id :

CREATE OR REPLACE FUNCTION f_sync_from_xml()
  RETURNS boolean AS
$func$
DECLARE
   datafile text := 'path/to/my_file.xml';  -- only relative path in db dir
   myxml    xml  := pg_read_file(datafile, 0, 100000000); -- arbitrary 100 MB
BEGIN
   -- demonstrating 4 variants of how to fetch values for educational purposes
   CREATE TEMP TABLE tmp ON COMMIT DROP AS
   SELECT (xpath('//some_id/text()', x))[1]::text AS id   -- id is unique  
        , f_xml_extract_val('//col1', x)          AS col1 -- one value
        , f_xml_extract_val('//col2/', x, 'all')  AS col2 -- all values incl. dupes
        , f_xml_extract_val('//col3/', x, 'dist') AS col3 -- distinct values
   FROM   unnest(xpath('/xml/path/to/datum', myxml)) x;

   -- 1.) DELETE?

   -- 2.) UPDATE
   UPDATE tbl t
   SET   (  col_1,   col2,   col3) =
         (i.col_1, i.col2, i.col3)
   FROM   tmp i
   WHERE  t.id = i.id
   AND   (t.col_1, t.col2, t.col3) IS DISTINCT FROM
         (i.col_1, i.col2, i.col3);

   -- 3.) INSERT NEW
   INSERT INTO tbl
   SELECT i.*
   FROM   tmp i
   WHERE  NOT EXISTS (SELECT 1 FROM tbl WHERE id = i.id);
END
$func$  LANGUAGE plpgsql;

Catatan penting

  • Implementasi ini memeriksa kunci utama jika baris yang disisipkan sudah ada dan memperbarui pada kasus ini. Hanya baris baru yang dimasukkan.

  • Saya menggunakan tabel staging sementara untuk mempercepat prosedur.

  • Diuji dengan Postgres 8.4 , 9.0 dan 9.1 .

  • XML harus dibentuk dengan baik.

  • pg_read_file() memiliki batasan untuk itu. Panduan:

    Penggunaan fungsi ini dibatasi untuk pengguna super.

    Dan:

    Hanya file dalam direktori cluster database dan log_directory dapat diakses.

Jadi Anda harus meletakkan file sumber Anda di sana - atau buat tautan simbolis ke file/direktori Anda yang sebenarnya.

Atau Anda dapat memberikan file melalui Java dalam kasus Anda (saya melakukan semuanya di dalam Postgres).

Atau Anda dapat mengimpor data ke dalam 1 kolom dari 1 baris tabel sementara dan mengambilnya dari sana.

Atau anda dapat menggunakan lo_import seperti yang ditunjukkan dalam jawaban terkait ini di dba.SE.

  • SQL untuk membaca XML dari file ke database PostgreSQL

Posting blog ini oleh Scott Bailey membantu saya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mencari di indeks ekspresi

  2. Pengujian Otomatis Cadangan PostgreSQL

  3. KESALAHAN:tidak ada batasan unik yang cocok dengan kunci yang diberikan untuk bilah tabel yang direferensikan

  4. Fungsi dengan jumlah variabel parameter input

  5. Cara Membuat Daftar Database dan Tabel di PostgreSQL Menggunakan psql