Assalamu'alaikum, pada post kali ini, saya akan membahas tentang Fungsi, PL/SQL dan Trigger pada DBMS PostgreSQL dan MySQL.     
 A.    Dasar Teori
1.      Fungsi
 Fungsi SQL adalah sebuah kumpulan query, biasanya query yang detail dan panjang yang dibungkus menjadi satu dan disimpan dalam database dan kemudian apabila diperlukan hanya tinggal mengaksesnya tanpa mengetikan query detail. Sedangkan untuk memunculkan fungsi dapat menggunakan query \df.
Ada beberapa konsep yang menarik dari fungsi antara lain:
·         Bahasa yang dipakai dapat didefenisikan sendiri dengan tersedianya parameter LANGUAGE, tanpa harus mengkompilasi ulang PostgreSQL.
·         Kita dapat membuat dua buah fungsi dengan nama yang sama namun parametermasukkannya yang berbeda, baik tipe data maupun jumlahnya.
Ada beberapa faktor yang perlu diperhatikan dalam membuat fungsi antara lain:
·         Nama Fungsi
·         Nomor dari fungsi argument
·         Tipe data dari setiap argument
·         Tipe dari hasil fungsi
·         Fungsi action
·         Bahasa yang digunakan oleh fungsi action.
Sedangkan pada MySQL juga terdapat fungsi, yaitu Function dan Stored Procedure yang merupakan fitur utama yang paling penting di MySQL 5. Function dan Stored Procedure merupakan suatu kumpulan perintah atau statement yang disimpan dan dieksekusi di server database MySQL. Dengan SP (Stored Procedure), kita dapat menyusun program sederhana berbasis sintaks SQL untuk menjalankan fungsi tertentu. Selanjutnya, Stored Procedure dari segi bentuk dan sifatnya terbagi menjadi 2 (dua), yaitu FUNCTION dan PROCEDURE. Perbedaan utama antara function dan procedure adalah terletak pada nilai yang dikembalikannya (di-return). Function memiliki suatu nilai yang dikembalikan (di-return), sedangkan procedure tidak.
Berikut contoh sederhana pembuatan fungsi SQLpada PostgreSQL untuk perkalian dari tiga inputan :
db_personal=> CREATE FUNCTION perkalian (FLOAT, FLOAT, FLOAT)
db_personal-> RETURNS FLOAT
db_personal-> AS 'SELECT ($1 + $2) * $3;' 
db_personal-> LANGUAGE 'sql';
CREATE
Dan berikut ini adalah perintah untuk memanggil dan menggunakan fungsi yang telah kita buat di atas.
db_personal=> SELECT perkalian (10,10,10);
perkalian
-----------
200
(1 row)
Dan berikut ini adalah bentuk untuk fungsi dan store procedure  untuk MySQL.
Procedure:
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
Fungsi:
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body

2.      Fungsi PL/PGSQL
PL/PGSQL merupakan bahasa yang lain untuk membuat sebuah fungsi, biasanya bahasa ini digunakan untuk menangani fungsi yang lebih kompleks. Pl/pgsql sudah terdapat dalam instalasi PostgreSQL.
Keuntungan penggunaan Fungsi PL/PGSQL :
a.       Meningkatkan kinerja karena mengurangi pengiriman kode dari klien ke server.
b.      Meningkatkan keamanan karena pengaksesan data tertentu ditangani dalam server.
c.       Meningkatkan konsistensi data saat sejumlah aplikasi memanggil prosedur yang sama;
Sebaliknya kelemahannya yaitu server akan lebih terbebani karena banyak proses yang harus ditangani. Sedangkan query PL/PGSQL agar lebih mudah di pahami akan dibagi menjadi 2 yaitu pembuatan fungsi dan pembuatan definisi.

Berikut Struktur pembuatan fungsi dalam pl/pgsql
a.       Pembuatan fungsi :
CREATE [OR REPLACE] FUNCTION nama_fungsi ( argtype , ... ])
RETURNS tipe_data
AS ‘definisi
LANGUAGE ‘plpgsql’;
b.      Pembuatan definisi :
DECLARE nama_variable tipe_data /* deklarasi variabel, type */
BEGIN
/* prosedural dan SQL masuk disini seperti select, update dan sebagainya*/
Return nama_variable /* blok ini yang wajib */
END;
Menghapus fungsi :
DROP FUNCTION nama_fungsi(paramater, parameter, parameter ... );
Contoh :
DROP FUNCTION pembagian(text);
Dalam PL/PGSQL kita juga dapat melakukan fungsi seperti percabangan menggunakan if..else maupun perulangan menggunakan loop. Kita juga dapat menggunakan fungsi-fungsi yang lain di PL/PGSQL. Perbedaan dengan funsi yang pertam yaitu fungsi SQL, Pl/PGSQL ini biasanya menangani fungsi yang lebih kompleks, sedangkan fungsi SQL hanya menangani fungsi yang sederahana saja. Fungsi-fungsi tersebut juga dapat dilakukan di DBMS MMySQL dengan query yang sedikit berbeda.
Berikut ini adalah contoh penggunaan PL/PGSQL dalam fungsi yang digunakan untuk mencari nama pegawai berdasarkan id pegawai.
db_personal=> CREATE FUNCTION pl_caripegawai (integer)
db_personal-> RETURNS text
db_personal-> AS 'DECLARE hasil TEXT;
db_personal'> BEGIN
db_personal'> SELECT INTO hasil nama as nama_mahasiswa
db_personal'> FROM pegawai
db_personal'> WHERE id = $1;
db_personal'> RETURN hasil;
db_personal'> END;'
db_personal-> LANGUAGE 'plpgsql';
CREATE
Dan berikut ini adalah perintah untuk memanggil dan menggunakan fungsi yang telah kita buat di atas.
db_personal=> SELECT pl_caripegawai (1);
pl_caripegawai
-----------------
Hendro
(1 row)
3.      Trigger
Trigger digunakan untuk memanggil satu atau beberapa perintah SQL secara otomatis sebelum atau sesudah terjadi proses INSERT, UPDATE atau DELETE dari suatu tabel. Sebagai contoh misalnya kita ingin menyimpan id pelanggan secara otomatis ke tabel ‘log’ sebelum menghapus data di tabel pelanggan.
Trigger sering digunakan, antara lain untuk:
·         Melakukan update data otomatis jika terjadi perubahan. Contohnya adalah dalam sistem penjualan, jika dientri barang baru maka stock akan bertambah secara otomatis.
·         Trigger dapat digunakan untuk mengimplementasikan suatu sistem log. Setiap terjadi perubahan, secara otomatis akan menyimpan ke tabel log.
·         Trigger dapat digunakan untuk melakukan validasi dan verifikasi data sebelum data tersebut disimpan.
Dalam PostgreSQL, Ciri khas dari fungsi yang diperuntukkan untuk trigger adalah menghasilkan output bertipe OPAQUE. Tipe opaque adalah sebuah tipe yang menginformasikan pada database bahwa fungsi tersebut tidak menghasilkan satu dari tipe data yang ditetapkan SQL dan tidak secara langsung dapat digunakan dalam statemen SQL. Language (bahasa) PL/PGSQL dapat digunakan untuk trigger procedure, fungsi untuk trigger ini memiliki beberapa variabel khusus yang terdeklarasi secara otomatis.
Variabel tersbut antara lain:
·         NEW: Variabel yang berisi nilai baru suatu record pada saat INSERT atau UPDATE, bertipe RECORD.
·         OLD: Variabel yang berisi nilai lama suatu record pada saat UPDATE atau DELETE, juga bertipe RECORD
        B.     Hasil Pratikum.
Seperti biasanya, saya akan mengerjakan soal praktikum 8 ini dengan menggunkan 2 DBMS yaitu PostgreSQL dan MySQL. Berikut ini adalah soalnya.
1.      Buatlah fungsi konversi suhu dari Fahrenheit ke derajat celcius dengan rumus konversi sebagai berikut : celcius= (5*(nilai Fahrenheit-32))/9!  Kemudian jalankan hasilnya dengan menSELECT fungsi tersebut !
2.      Buatlah fungsi untuk mencari alamat mahasiswa dari tabel mahasiswa berdasarkan nama mahasiswa. Kemudian jalankan dengan perintah SELECT !
3.      Buatlah fungsi untuk menghitung nilai dengan menggunakan bahasa pl/sql !
Nilai > 100 atau Nilai<0 : Nilai Salah
Nilai ≥ 90 : Nilai A
70 ≤ Nilai < 90 : Nilai B
60 ≤ Nilai < 70 : Nilai C
50 ≤ Nilai < 60 : Nilai D
0 ≤ Nilai < 50 : Nilai E
Kemudian jalankan hasilnya dengan menSELECT fungsi tersebut !
4.      Buatlah fungsi menggunakan pl/pgsql untuk mencari bilangan ganjil atau genap dari bilangan yang diinputkan. Kemudian jalankan dengan perintah SELECT !
5.      Tambahkan kolom modifikasi pada tabel mahasiswa. Dimana setiap ada insert atau update maka tanggal pada kolom modifikasi akan menunjukkan tanggal perubahan tersebut dilakukan.
1.      Menggunakan DBMS PostgreSQL (psql)
1.      Untuk menjawab soal nomor 1, berikut ini adalah struktur query untuk memebuat fungsi konversi suhu dari Fahrenheit ke celcius.

Setelah itu kita coba fungsi tersebut dengan memasukkan angka 32 Fahrenheit.

Sehingga diperoleh suhu dalam Celcius 0 derajat.
2.      Untuk menjawab soal nomor 2, yaitu mencari alamat mahasiswa pada tabel mahasiswa berdasarkan nama mahasiswa, kita menggunkan fungsi PL/PGSQL. Berikut ini adalah struktur query nya,

Setelah itu, kita coba masukkan satu nama untuk mencari alamat dari mahasiswa tersebut. Misalnya rizki, seperti di bawah ini.

Sehingga akan muncul alamat dari mahasiswa tersebut yaitu Kediri.
3.      Untuk menjawab soal nomor3, yaitu menentukan nilai, kita akan menggunakan fungsi pl/sql percabangan menggunakan if…else. Berikut ini adalah struktur query nya.

Kemudian kita coba masukkan nilai 99.

Sehingga, hasilnya akan sesuai dengan tabel, yaitu mendapat nilai A untuk nilai lebih dari 90 sampai 100.
4.      Untuk soal nomor 4, dalam menentukan bilangan ganjil atau genap, kita juga akan menggunakan fungsi pl/sql percabangan. Jika bilangan tersebut di modulus 2 hasilnya 0, maka bilangan itu genap. Jika tidak, maka bilangan itu ganji. Berikut ini adalah struktur query nya.

Setelah itu, kita coba masukkan angka 10

Sehingga hasilnya, angka 10 adalah bilangan genap.
5.      Untuk soal nomor 5, yaitu menambahkan tanggal secara otomatis pada kolom modifikasi jika ada insert atau update pada tabel mahasiswa.
Pertama, kita buat dulu kolom mahasiswa di tabel mahasiswa. Berikut ini struktur query nya.

Lalu, kita buat dulu fungsinya dengan nama fungsi modifikasi. Kemudian, kita buat trigger yang akan mengeksekusi fungsi modifikasi tersebut pada saat insert atau update dilakukan pada tabel mahasiswa. Berikut ini struktur query nya.

Lalu kita coba insert data mahasiswa baru pada tabel mahasiswa.

Sehingga pada kolom modifikasi akan otomatis terisi tanggal saat inert dilakukan.
2.      Menggunakan DBMS MySQL (Xampp Shell)
Untuk fungsi di MySQL, kita harus tentukan delimeternya dulu. Delimiter adalah karakter atau string yang digunakan untuk menyatakan akhir SQL statement, default delimiter pada MySQL adalah semicolon (;). Pada praktikum kali ini saya akan menggunakan delimiter //. Perubahan delimiter ini menggunakan query sebagai berikut.
Untuk mengembalikan delimiter ke default lagi, kiata tinggal mengetikkan query seperti di bawah ini.

1.      Untuk menjawab soal nomor 1, berikut ini adalah struktur query untuk memebuat fungsi konversi suhu dari Fahrenheit ke celcius.


Setelah itu kita coba fungsi tersebut dengan memasukkan angka 32 Fahrenheit.

Sehingga diperoleh suhu dalam Celcius 0 derajat.
2.      Untuk menjawab soal nomor 2, yaitu mencari alamat mahasiswa pada tabel mahasisw aberdasarkan nama mahasiswa. Berikut ini adalah struktur query nya,

Setelah itu, kita coba masukkan satu nama untuk mencari alamat dari mahasiswa tersebut. Misalnya rizki, seperti di bawah ini.

Sehingga akan muncul alamat dari mahasiswa tersebut yaitu Kediri.
3.      Untuk menjawab soal nomor3, yaitu menentukan nilai, kita akan menggunakan fungsi percabangan menggunakan if…else. Berikut ini adalah struktur query nya.

Kemudian kita coba masukkan nilai 99.

Sehingga, hasilnya akan sesuai dengan tabel, yaitu mendapat nilai A untuk nilai lebih dari 90 sampai 100.
4.      Untuk soal nomor 4, dalam menentukan bilangan ganjil atau genap, kita juga akan menggunakan fungsi pl/sql percabangan. Jika bilangan tersebut di modulus 2 hasilnya 0, maka bilangan itu genap. Jika tidak, maka bilangan itu ganji. Berikut ini adalah struktur query nya.

Setelah itu, kita coba masukkan angka 10

Sehingga hasilnya, angka 10 adalah bilangan genap.
5.      Untuk soal nomor 5, yaitu menambahkan tanggal secara otomatis pada kolom modifikasi jika ada insert atau update pada tabel mahasiswa.
Pertama, kita buat dulu kolom mahasiswa di tabel mahasiswa. Berikut ini struktur query nya. sebelumnya, saya kembalikan delimiternya ke default.

Kemudian kita buat trigger jika insert dilakukan pada tabel mahasiswa dengan nama trigger modifikasi. Berikut ini adalah struktur query nya.

Lalu kita buat trigger jika update dilakukan pada tabel mahasiswa dengan nama trigger modifikasi2. Berikut ini adalah struktur query nya.

Selanjutnya, kita coba insert data mahasiswa baru pada tabel mahasiswa seperti di bawah ini.

Sehingga ketika kita lihat tabelnya, kolom modifikasi akan secara otomatis terisi tanggal pada saat insert dilakukan.

Kemudian kita coba update salah satu data mahasiswa pada tabel mahasiswa, misalnya kita akan mengubah alamat mahasiswa dengan nim 21 dengan solo seperti di bawah ini.


Sehingga ketika kita lihat tabelnya, kolom modifikasi akan secara otomatis terisi tanggal pada saat update dilakukan.
  
C. Evaluasi Perbandingan MySQL dan PostgreSQL
  1. Pada PostgreSQL kita tidak perlu menggunakan delimiter, tetapi menggunakan language'sql'; atau language 'pl/pgsql'; di akhir fungsi yang kita buat, sedangkan pada MySQL, kita menggunakan delimiter, pada praktikum kali ini saya menggunakan delimiter//.
  2. Pada PostgreSQL declare terletak sebelum begin, sedangkan pada MySQL declare terletak setelah begin.
  3. Pada PostgreSQL, kiata menggunakan tanda ' dua kali untuk mengapit bentuk String seperti pada soal nomor 3 (''Nilai Salah''). Sedangkan pada MySQL, kita menggunakan tanda petik " ("Nilai Salah").
  4. Pada PostgreSQL, kita menggunakan tipe data opaque sebagai tipe data kusus pada Trigger di PostgreSQL, sedangkan MySQL tidak,
  5. Pada PostgreSQL, kita dapat membuat fungsinya dulu, lalu dapat dieksekusi pada Trigger yang akan dibuat, sedangkan MySQL tidak.
  6. Pada PostgreSQL, kita dapat mengabungkan event yang berbeda dalam waktu sama pada satu Trigger, mislanya pada nomor 5 (before insert or update), sedangkan pada MySQL kita harus membuat 2 trigger untuk 2 event yang berbeda. Sehingga ada trigger modifikasi (before insert) dan trigger modifikasi2 (before update).
D. Kesimpulan, Kritik, Saran dan Manfaat
  1. Kesimpulan
   Fungsi SQL adalah sebuah kumpulan query, biasanya query yang detail dan panjang yang dibungkus menjadi satu dan disimpan dalam database dan kemudian apabila diperlukan hanya tinggal mengaksesnya tanpa mengetikan query detail. Fungsi terdapat pada DBMS PostgreSQL maupun MySQL. 
 PL/PGSQL merupakan bahasa yang lain untuk membuat sebuah fungsi, biasanya bahasa ini digunakan untuk menangani fungsi yang lebih kompleks. Pl/pgsql sudah terdapat dalam instalasi PostgreSQL. 
Sedangkan Trigger digunakan untuk memanggil satu atau beberapa perintah SQL secara otomatis sebelum atau sesudah terjadi proses INSERT, UPDATE atau DELETE dari suatu tabel. 
2.    Kritik

Dalam laporan ini, masih banyak terdapat kekurangan karena terbatasnya pengetahuan saya dalam menguasai 2 DBMS yang digunakan dalam praktikum ini
3. Saran

Diperlukan pembelajaran lebih lanjut mengenai Fungsi, PL/PGSQL dan Trigger dalam database menggunakan PostgreSQL maupu MySQL agar praktikan dapat menguasai kedua DBMS tersebut dalam membuat database yang lebih baik. 
4. Manfaat
Manfaat yang akan didapat pembaca dalam laporan ini antara lain dapat mengetahui struktur query dalam pembuatan Fungsi pada kedua DBMS. Pembaca juga dapat mengetahui struktur pembuatan PL/PGSQL dan Trigg. Pembaca juga dapat mengetahui persamaan dan perbedaan dari kedua DBMS tersebut.