Hay hay.. Laporan Praktikum Desain Basis Data kali ini bakalan ngebahas tentang fungsi, pl/pgsql dan trigger Sob. Langsung.. cekidot :D
Dasar Teori
Fungsi (function)
Fungsi adalah suatu bagian dari program yang dipergunakan untuk mengerjakan
suatu tugas tertentu yang menghasilkan suatu nilai untuk dikembalikan ke
program pemanggil dan letaknya dipisahkan dari bagian program yang
menggunakannya.
Manfaat fungsi:
- Menghindari pengulangan; tujuannya untuk menghindari penulisan bagian kode program berulang-ulang.
- Penataan program; program yang besar dan komplek dibagi-bagi menjadi aktivitas yang berbeda dan ditempatkan dalam subrutine yang terpisah, sehingga setiap aktivitas bisa ditulis dan diperiksa secara mandiri
- Kemandirian; mempunyai variabel “private” yaitu variabel yang tidak bisa diakses program pemanggil atau subrutin lain.
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.
Fungsi PL/PGSQL
PL/pgSQL
adalah procedural language yang loadable (dapat langsung digunakan tanpa
restart server) pada sistem database PostgreSQL. PL/pgSQL didesain dengan
tujuan supaya kita dapat membuat sebuah procedural language yang:
dapat
dipakai untuk membuat function atau trigger
dapat
menambahkan sruktur kontrol pada bahasa SQL
dapat
melakukan komputasi kompleks
semua type,
function, dan operator yang didefinisikan user (buatan kita sendiri atau orang
lain) dapat diturunkan (inherit)
dapat
dipercaya oleh server
mudah
digunakan
Function
yang telah kita buat menggunakan PL/pgSQL dapat digunakan sebagaimana function
bawaan yang sudah ada di server database PostgreSQL. Misalnya, kita dapat membuat
fungsi komputasi kondisional yang kompleks menggunakan PL/pgSQL, kemudian
menggunakannya untuk membuat operator atau menggunakannya untuk membuat index
di server database PostgrSQL.
Berikut Struktur pembuatan
fungsi dalam pl/pgsql
Pembuatan fungsi :
CREATE [OR REPLACE]
FUNCTION nama_fungsi ( argtype , ... ])
RETURNS tipe_data
AS ‘definisi’
LANGUAGE ‘plpgsql’;
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);
Trigger
Trigger digunakan untuk menyisipkan sebuah fungsi pada saat suatu record di INSERT, UPDATE dan DELETE. Trigger sangat ideal untuk mengecek atau memodifikasi sebuah data pada kolom sebelum dimasukkan ke dalam database, sehingga sebuah fungsi dapat dipanggil setiap saat secara otomatis ketika sebuah row akan dimodifikasi. Ciri khas dari fungsi yang diperuntukkan untuk trigger adalah menghasilkan output bertipe OPAQUE.
Trigger digunakan untuk menyisipkan sebuah fungsi pada saat suatu record di INSERT, UPDATE dan DELETE. Trigger sangat ideal untuk mengecek atau memodifikasi sebuah data pada kolom sebelum dimasukkan ke dalam database, sehingga sebuah fungsi dapat dipanggil setiap saat secara otomatis ketika sebuah row akan dimodifikasi. Ciri khas dari fungsi yang diperuntukkan untuk trigger adalah menghasilkan output bertipe OPAQUE.
Hasil Praktikum
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 !
Buatlah
fungsi untuk mencari alamat mahasiswa dari tabel mahasiswa berdasarkan nama
mahasiswa. Kemudian jalankan dengan perintah SELECT !
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 !
Buatlah
fungsi menggunakan pl/pgsql untuk mencari bilangan ganjil atau genap dari
bilangan yang diinputkan. Kemudian jalankan dengan perintah SELECT !
Tambahkan
kolom modifikasi pada tabel mahasiswa. Dimana setiap ada insert atau update
maka tanggal pada kolom modifikasi akan menunjukkan tanggal perubahan tersebut
dilakukan.
Ini nih, hasil praktikum yang pake PosgreSQL:
Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Password for user postgres:
psql (9.3.5)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
postgres=# \c permata13650083
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
You are now connected to database "permata13650083" as user "postgres".
permata13650083=# create function konversi(float)
permata13650083-# returns float
permata13650083-# as 'select (($1-32)/1.8);'
permata13650083-# language 'sql';
CREATE FUNCTION
permata13650083=# select konversi(120);
konversi
------------------
48.8888888888889
(1 row)
permata13650083=# select* from mahasiswa;
nim_mah | nama_mah | alamat_mah | notelp_mah | id_fak | gender
---------+-------------------+------------+--------------+--------+--------
14 | Luki | Ponorogo | 085655084275 | 2 | L
15 | Affan | Surabaya | 085234589012 | 1 | L
16 | Melly | Yogyakarta | 085734558902 | 1 | P
18 | Sinta | Jakarta | 081233655789 | 1 | P
21 | Ana | Malang | 081233655789 | 2 | P
23 | Fandi | Jombang | 081245765889 | 1 | L
17 | Hari | Solo | 085730008902 | 2 |
30 | Randi | Malang | 085655084275 | 4 | L
31 | Riko | Malang | 085655084275 | 3 | L
37 | Andi Cahyono++++ | Jambi | 085655084275 | 4 | L
(10 rows)
permata13650083=# create function cari_alamat(varchar)
permata13650083-# returns varchar
permata13650083-# as 'select alamat_mah from mahasiswa where nama_mah=($1);'
permata13650083-# language 'sql';
CREATE FUNCTION
permata13650083=# select cari_alamat('Sinta');
cari_alamat
-------------
Jakarta
(1 row)
permata13650083=# create or replace function hitung (x integer)
permata13650083-# returns varchar(30)
permata13650083-# as 'declare nilai varchar(30);
permata13650083'# begin
permata13650083'# if x>100 or x<0 then
permata13650083'# select into nilai ''nilai salah'';
permata13650083'# elsif x>=90 then
permata13650083'# select into nilai ''nilai A'';
permata13650083'# elsif x>=70 and x<90 then
permata13650083'# select into nilai ''nilai B'';
permata13650083'# elsif x>=60 and x<70 then
permata13650083'# select into nilai ''nilai C'';
permata13650083'# elsif x>=50 and x<60 then
permata13650083'# select into nilai ''nilai D'';
permata13650083'# elsif x>=0 and x<50 then
permata13650083'# select into nilai ''nilai E'';
permata13650083'# end if;
permata13650083'# return nilai;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# select hitung(-20);
hitung
-------------
nilai salah
(1 row)
permata13650083=# select hitung(85);
hitung
---------
nilai B
(1 row)
permata13650083=# select hitung(120);
hitung
-------------
nilai salah
(1 row)
permata13650083=# create or replace function cek_bilangan (x integer)
permata13650083-# returns varchar(30)
permata13650083-# as 'declare hasil varchar(30);
permata13650083'# begin
permata13650083'# if x%2=0 then
permata13650083'# select into hasil ''genap'';
permata13650083'# else
permata13650083'# select into hasil ''ganjil'';
permata13650083'# end if;
permata13650083'# return hasil;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# select cek_bilangan(7);
cek_bilangan
--------------
ganjil
(1 row)
permata13650083=# select cek_bilangan(12);
cek_bilangan
--------------
genap
(1 row)
permata13650083=# create or replace function tes_trigger()
permata13650083-# returns opaque
permata13650083-# as 'begin
permata13650083'# new.modifikasi := current_date;
permata13650083'# return new;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# create trigger tes1_trigger
permata13650083-# before insert
permata13650083-# on mahasiswa
permata13650083-# for each row
permata13650083-# execute procedure tes_trigger();
WARNING: changing return type of function tes_trigger from "opaque" to "trigger"
CREATE TRIGGER
permata13650083=# insert into mahasiswa values (32, 'Raka', 'Manado', '0866576585', 1, 'L');
INSERT 0 1
permata13650083=# select*from mahasiswa;
nim_mah | nama_mah | alamat_mah | notelp_mah | id_fak | gender | modifikasi
---------+-------------------+------------+--------------+--------+--------+------------
14 | Luki | Ponorogo | 085655084275 | 2 | L |
15 | Affan | Surabaya | 085234589012 | 1 | L |
16 | Melly | Yogyakarta | 085734558902 | 1 | P |
18 | Sinta | Jakarta | 081233655789 | 1 | P |
21 | Ana | Malang | 081233655789 | 2 | P |
23 | Fandi | Jombang | 081245765889 | 1 | L |
17 | Hari | Solo | 085730008902 | 2 | |
30 | Randi | Malang | 085655084275 | 4 | L |
31 | Riko | Malang | 085655084275 | 3 | L |
37 | Andi Cahyono++++ | Jambi | 085655084275 | 4 | L |
32 | Raka | Manado | 0866576585 | 1 | L | 2014-11-21
(11 rows)
permata13650083=#
Database [postgres]:
Port [5432]:
Username [postgres]:
Password for user postgres:
psql (9.3.5)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
postgres=# \c permata13650083
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
You are now connected to database "permata13650083" as user "postgres".
permata13650083=# create function konversi(float)
permata13650083-# returns float
permata13650083-# as 'select (($1-32)/1.8);'
permata13650083-# language 'sql';
CREATE FUNCTION
permata13650083=# select konversi(120);
konversi
------------------
48.8888888888889
(1 row)
permata13650083=# select* from mahasiswa;
nim_mah | nama_mah | alamat_mah | notelp_mah | id_fak | gender
---------+-------------------+------------+--------------+--------+--------
14 | Luki | Ponorogo | 085655084275 | 2 | L
15 | Affan | Surabaya | 085234589012 | 1 | L
16 | Melly | Yogyakarta | 085734558902 | 1 | P
18 | Sinta | Jakarta | 081233655789 | 1 | P
21 | Ana | Malang | 081233655789 | 2 | P
23 | Fandi | Jombang | 081245765889 | 1 | L
17 | Hari | Solo | 085730008902 | 2 |
30 | Randi | Malang | 085655084275 | 4 | L
31 | Riko | Malang | 085655084275 | 3 | L
37 | Andi Cahyono++++ | Jambi | 085655084275 | 4 | L
(10 rows)
permata13650083=# create function cari_alamat(varchar)
permata13650083-# returns varchar
permata13650083-# as 'select alamat_mah from mahasiswa where nama_mah=($1);'
permata13650083-# language 'sql';
CREATE FUNCTION
permata13650083=# select cari_alamat('Sinta');
cari_alamat
-------------
Jakarta
(1 row)
permata13650083=# create or replace function hitung (x integer)
permata13650083-# returns varchar(30)
permata13650083-# as 'declare nilai varchar(30);
permata13650083'# begin
permata13650083'# if x>100 or x<0 then
permata13650083'# select into nilai ''nilai salah'';
permata13650083'# elsif x>=90 then
permata13650083'# select into nilai ''nilai A'';
permata13650083'# elsif x>=70 and x<90 then
permata13650083'# select into nilai ''nilai B'';
permata13650083'# elsif x>=60 and x<70 then
permata13650083'# select into nilai ''nilai C'';
permata13650083'# elsif x>=50 and x<60 then
permata13650083'# select into nilai ''nilai D'';
permata13650083'# elsif x>=0 and x<50 then
permata13650083'# select into nilai ''nilai E'';
permata13650083'# end if;
permata13650083'# return nilai;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# select hitung(-20);
hitung
-------------
nilai salah
(1 row)
permata13650083=# select hitung(85);
hitung
---------
nilai B
(1 row)
permata13650083=# select hitung(120);
hitung
-------------
nilai salah
(1 row)
permata13650083=# create or replace function cek_bilangan (x integer)
permata13650083-# returns varchar(30)
permata13650083-# as 'declare hasil varchar(30);
permata13650083'# begin
permata13650083'# if x%2=0 then
permata13650083'# select into hasil ''genap'';
permata13650083'# else
permata13650083'# select into hasil ''ganjil'';
permata13650083'# end if;
permata13650083'# return hasil;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# select cek_bilangan(7);
cek_bilangan
--------------
ganjil
(1 row)
permata13650083=# select cek_bilangan(12);
cek_bilangan
--------------
genap
(1 row)
permata13650083=# create or replace function tes_trigger()
permata13650083-# returns opaque
permata13650083-# as 'begin
permata13650083'# new.modifikasi := current_date;
permata13650083'# return new;
permata13650083'# end;'
permata13650083-# language 'plpgsql';
CREATE FUNCTION
permata13650083=# create trigger tes1_trigger
permata13650083-# before insert
permata13650083-# on mahasiswa
permata13650083-# for each row
permata13650083-# execute procedure tes_trigger();
WARNING: changing return type of function tes_trigger from "opaque" to "trigger"
CREATE TRIGGER
permata13650083=# insert into mahasiswa values (32, 'Raka', 'Manado', '0866576585', 1, 'L');
INSERT 0 1
permata13650083=# select*from mahasiswa;
nim_mah | nama_mah | alamat_mah | notelp_mah | id_fak | gender | modifikasi
---------+-------------------+------------+--------------+--------+--------+------------
14 | Luki | Ponorogo | 085655084275 | 2 | L |
15 | Affan | Surabaya | 085234589012 | 1 | L |
16 | Melly | Yogyakarta | 085734558902 | 1 | P |
18 | Sinta | Jakarta | 081233655789 | 1 | P |
21 | Ana | Malang | 081233655789 | 2 | P |
23 | Fandi | Jombang | 081245765889 | 1 | L |
17 | Hari | Solo | 085730008902 | 2 | |
30 | Randi | Malang | 085655084275 | 4 | L |
31 | Riko | Malang | 085655084275 | 3 | L |
37 | Andi Cahyono++++ | Jambi | 085655084275 | 4 | L |
32 | Raka | Manado | 0866576585 | 1 | L | 2014-11-21
(11 rows)
permata13650083=#
Evaluasi Perbedaan DBMS MySQL dan PostgreSQL
Dari hasil praktikum diatas, sebenarnya dari
struktur umum fungsi pl/pgsql antara PostgreSQL dan MySQL sudah berbeda. Pada MySQL,
pembuatan fungsi diawali dengan “delimiter”, kemudian pada PostgreSQL disertai
dengan jenis bahasa yang dipakai (sql/plpgsql) sedangkan pada MySQL tidak. Pada
PostgreSQL, penggunaan “else if” ditulis dengan “elsif”, dan pada MySQL
menggunakan “elseif”.
Kesimpulan
Dari praktikum kali ini dapat disimpulkan bahwa:
Fungsi (function) adalah suatu bagian dari program yang dipergunakan untuk
mengerjakan suatu tugas tertentu yang menghasilkan suatu nilai untuk
dikembalikan ke program pemanggil dan letaknya dipisahkan dari bagian program
yang menggunakannya.
Beberapa faktor yang
perlu diperhatikan dalam membuat fungsi: nama fungsi, nomor dari fungsi argument, tipe data dari setiap
argument, tipe dari hasil
fungsi,fungsi actio, dan bahasa yang
digunakan oleh fungsi action.
PL/pgSQL
adalah procedural language yang loadable (dapat langsung digunakan tanpa
restart server) pada sistem database PostgreSQL.
Pembuatan fungsi :
CREATE [OR REPLACE]
FUNCTION nama_fungsi ( argtype , ... ])
RETURNS tipe_data
AS ‘definisi’
LANGUAGE ‘plpgsql’;
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);
Trigger
digunakan untuk menyisipkan sebuah fungsi pada saat suatu record di INSERT,
UPDATE dan DELETE.
Okey, sekian dulu yaa laporan praktikum kali ini, semoga Sobat semua dapat mengambil manfaat pada postingan ini. Silahkan coment" kasih saran juga Sob.
Referensi
http://gipculart.wordpress.com/2011/12/12/tutorial-fungsi-dan-trigger/
Modul Praktikum Desain Basis Data