WHAT'S NEW?
Loading...

Belajar PostgreSQL: Mengelola Complex Data PostgreSQL Dengan JSON dan XML - Part 5

Mengelola Complex Data PostgreSQL Dengan JSON dan XML

Di aplikasi nyata, tidak semua data yang disimpan dalam sebuah tabel dan database akan digunakan hasil ouput default-nya yang berupa RETURN TABLE. Terkadang beberapa developer memerlukan jenis data yang mungkin dianggap lebih sederhana dan terlebih jika jenis data tersebut mendukung cross platform. Saat ini sendiri jenis data yang cukup umum digunakan ialah JSON dan XML.

Kedua jenis data tersebut adalah merupakan text-based data format. PostgreSQL sudah mendukung kedua jenis model data tersebut. Untuk XML sudah tersedia beberapa jenis fungsi *_to_xml yang menerima jenis inputan data baik berupa SQL query, tabel ataupun view yang ouput-nya akan direspresentasikan kedalam bentuk XML.

Mari kita coba melihat contoh langsung, kita akan gunakan tabel yang sudah pernah dibuat dari tutorial sebelumnya. Cukup jalankan perintah dibawah ini maka akan tampak hasil seperti pada gambar.
SELECT table_to_xml('tb_penggajian', true, false, '') AS s;
Mengelola Complex Data PostgreSQL Dengan JSON dan XML

Hasil dari contoh diatas kita langsung mendapatkan output berupa XML, sangat menarik bukan?

Hal menarik lainnya dari fungsi *_to_xml adalah kamu bisa membuat sebuah fungsi yang mengembalikan beberapa jenis ouput document XML dalam sekali panggil, dan juga bisa dengan struktur yang berbeda.

Tersedia 5 macam varian dari fungsi *_to_xml yang diantaranya yaitu:
- cursor_to_xml(cursor refcursor, count integer,nulls bool, tableforest bool, targetns text)
- query_to_xml(query text,nulls bool, tableforest bool, targetns text)
- table_to_xml(tbl regclass,nulls boolean, tableforest boolean, targetns text)
- schema_to_xml(schema name,nulls boolean, tableforest boolean, targetns text)
- database_to_xml(nulls boolean, tableforest bool, targetns text)
Informasi lebih lanjut silahkan langsung menuju official site.

Untuk fungsi tersebut diatas akan merepresentasikan hasil berupa data string dari SQL query, tabel ataupun schmea. Penggunaan view dapat disisipkan kedalam fungsi table_to_xml.

Khusus untuk fungsi cursor_to_xml sangat direkomendasikan untuk digunakan jika mempunyai data yang besar, karena fungsi ini akan mengkonversi data kedalam potongan-potongan record yang akan mengurangi beban dalam memory. Sebenarnya akan lebih baik mengenal seperti apa penggunaan dan cara kerja cursor dalam PostgreSQL, saya pribadi tidak begitu mahir dengan cursor karena hampir jarang sekali menggunakannya, mungkin nanti saya akan coba cari resource dan membuat artikelnya.

Setelah tadi kita mengenal sedikit output data XML, sekarang kita lanjutkan dengan jenis JSON. Sama seperti jenis data XML, jenis data JSON juga memiliki fungsi untuk menangani konversi data yaitu array_to_json(anyarray, bool) yang menangani konversi array ke JSON dan row_to_json(record, bool) untuk konversi record ke JSON.

Berikut ini contoh penggunaannya.
SELECT array_to_json(array[1,2,3]);
array_to_json
---------------
[1,2,3]
(1 row)
SELECT row_to_json(t) FROM tb_penggajian t;
        row_to_json
-------------------------------------------------
{"nama_pegawai":"ARNOLD","nominal_gaji":800000}
{"nama_pegawai":"JOHN","nominal_gaji":1900000}
{"nama_pegawai":"JACK","nominal_gaji":1300000}
{"nama_pegawai":"BOB","nominal_gaji":1000000}
(4 rows)
Dengan menggunakan fungsi-fungsi diatas kita dapat menghasilkan output data menjadi lebih kompleks dibandingkan dengan standard RETURN TABLE pada umumnya. Mari kita coba dengan membuat tabel baru untuk sedikit lebih memahaminya.
CREATE TABLE coba(
  id SERIAL PRIMARY KEY,
  data TEXT,
  tgl TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO coba(data) VALUES(random()), (random());
Lalu kita buat tabel lain yang mana salah satu kolomnya memiliki tipe data dari tabel sebelumnya dan memasukkan baris datanya ke tabel baru.
CREATE TABLE coba2(
  id SERIAL PRIMARY KEY,
  data2 coba,    -- isi record data2 berasal dari tabel coba
  tgl TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO coba2(data2) SELECT coba FROM coba;

SELECT * FROM coba2;
id   |      data2                                           |        tgl
-----+------------------------------------------------------+----------------------------
1    | (1,0.414514921139926,"2018-11-10 07:23:48.034324")   | 2018-11-10 07:25:18.677993
2    | (2,0.75422284938395,"2018-11-10 07:23:48.034324")    | 2018-11-10 07:25:18.677993
(2 rows)
Sekarang kita bisa coba mengkonversi data dari tabel diatas menjadi JSON.
SELECT row_to_json(t2, true) FROM coba2 t2;
            row_to_json
-------------------------------------------------------------------------------------
{
    "id":1,
    "data2":{"id":1,"data":"0.414514921139926","tgl":"2018-11-10T07:23:48.034324"},
    "tgl":"2018-11-10T07:25:18.677993"
}
{
    "id":2,
    "data2":{"id":2,"data":"0.75422284938395","tgl":"2018-11-10T07:23:48.034324"},
    "tgl":"2018-11-10T07:25:18.677993"
}
(2 rows)
Kemudian kita akan buat lagi sebuah tabel baru yang datanya berasal dari tabel coba2. Kita akan membuatnya menjadi terlihat sedikit lebih kompleks.
CREATE TABLE coba3(
  id SERIAL PRIMARY KEY,
  data3 coba2[],
  tgl TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO coba3(data3) SELECT array(SELECT coba2 FROM coba2);
SELECT row_to_json(t3, true) FROM coba3 t3;
               row_to_json
-------------------------------------------------------------------------------------
{
  "id":1,
  "data3":[
    {"id":1,"data2":{"id":1,"data":"0.414514921139926","tgl":"2018-11-10T07:23:48.034324"},"tgl":"2018-11-10T07:25:18.677993"},<
br />     {"id":2,"data2":{"id":2,"data":"0.75422284938395","tgl":"2018-11-10T07:23:48.034324"},"tgl":"2018-11-10T07:25:18.677993"} ],
  "tgl":"2018-11-10T07:33:05.713272"
}
(1 row)
Hasil yang didapatkan sesuai yang diinginkan. Dengan menggunakan fungsi-fungsi tersebut diatas kita bisa memperoleh hasil data yang kompleks sesuai dengan yang kita inginkan, kita hanya perlu memilih output data apa yang diinginkan.

Silahkan isi kolom komentar jika ada yang ingin ditanyakan ataupun koreksi yang harus saya lakukan.