Selasa, 25 November 2014

PRALTIKUM DESAIN BAIS DATA 8



Praktikum Desain Basis data 8
Fungsi, Pl/Pgsql dan Trigger
SQL Shell Vs CMD mysql Pada XAMPP

Landasan Teori

SQL

Structured  query  language (SQL) merupakan bahasa untuk berkomunikasi dengan database relasional  yang bersifat deklaratif (bukan prosedural) dengan menyatakn hasil (bukan cara memperoleh hasil ).
Untuk kecepatan akses, SQL melalui database engine akan menentuakn cara  tercepat memproses data, karena itu user tidak perlu menetukan bagaimana cara mengambil data. Jadi SQL  merupakan  bahasa  yang  deklaratif  tau  fungsional  karena  user  hanya  menjelaskan  data  yang diinginkan.  Berbeda  dengan  bahasa  procedural  pascal  atau  C  yang  akan  melinbatkan  proses  seperti melakukan  pengulangan  sampai  akhir  tabel  atau  kondisi  kota  terpenuhi,  melakukan perbandingan  kondisi kota yang dicari maupun pengurutan nama.
Statement SQL dapat dikelompokkan atas ;
  Data Manipulation Language. Statemen yang digunakan untuk memanipulasi data dalam objek
schema melalui perintah select, insert, update, delete, explain plan, dan lock table.
  Data  Definition  Language.  Statement  untuk  membuat  dan  menghapus  objek  schema  mealui
perintah create, alter, drop, rename, truncate, serta grant, revoke, analyze, comment, audit, dan
noaudit.
 Statement  Kontrol  Transaksi  yang  emastiakn  transaksi  berlangsung  secara  normal  untuk
konsistensi data, contohnya perintah commit, rollback, savepoint, dan set transaction.
  Statement  control  Session  yang  mengatur  agar  suatu  session  memiliki  karakteristik  tertentu
dengan perintah alter sesion dan set role.
  Statement control system yang mengelola instance database memalui perintah alter sytem

Struktur PL/SQL
Semua program PL/SQL harus mengikuti struktur pemrograman sebagai berikut : 
-          Bagian Judul (Header)
Bagian ini hanya digunakan jika PL/SQL diberikan nama, misalnya untuk prosedur atau
fungsi. Bagian ini berisi nama blok, daftar parameter, dan pengembalian hasil (Retrun) jika
blok adalah fungsi.
-          Bagian Deklarasi (Declaration)
  Bagian  ini  untuk  membuat  deklarasi  mengenai  semua  variable  dan  konstanta  yang
direferensikan  dalam  pernyataan  PL/SQL.  Bagian  deklarasi  ini  dimulai  dengan  perinyah
DECLARE. Jika tidak ada variable atau konstanta yang ingin dideklarasikan, bagian ini boleh
dihilangkan.
-          Bagian Eksekusi (Execution)
  Bagian ini memuat pernyataan-pernyataan PL/SQL yang akan ditulis. Bagian eksekusi ini
harus dimulai dengan perintah BEGIN.
-          Bagian Perkecualian (Exception)
  Bagian  ini  memuat  cara  menangani  kesalahan-kesalahan  (error)  pada  waktu  eksekusi
program PL/SQL. Jika program tidak memuat cara menangani kesalahan, bagian ini boleh
dihilangkan.
Setiap pernyataan PL/SQL harus diakhiri dengan tanda titik-koma (;) dan semua program PL/SQL
harus diakhiri dengan perintah END.
Oracle menyediakan dua cara untuk mengakses data-data yang dihasilkan oleh PL/SQL,  yaitu :
  Dengan menggunakan paket DBMS_OUTPUT
Paket  DBMS_OUTPUT  ini  disediakan  oleh  oracle  untuk  digunakan  dengan  SQL*PLUS.
Paket  ini  terdiri  atas  sejumlah  prosedur  dan  fungsi  siap  pakai  yang  mengatur
intput/output suatu data untuk digunakan oleh PL/SQL.
  Dengan menggunakan Tabel PL/SQL

Struktur fungsi  SQL

CREATE [OR REPLACE FUNCTION] nama_fungsi
                [(parameter_1 tipedata, parameter_2 tipedata, ....)]
RETURN tipedata_fungsi IS
                variabel-variabel_lokal
BEGIN
                statement;
                . . . .
                RETURN nilai_fungsi;
END;

Membuat fungsi SQL dengan POSTGRESQL

PostgreSQL mendukung variasi SQL99 perintah CREATE FUNCTION. Hal ini tidak secara langsung kompatibel dengan standar, tapi itu tidak memungkinkan untuk berbagai cara untuk memperpanjang PostgreSQL dengan menciptakan fungsi disesuaikan sendiri.

Berikut adalah sintaks untuk CREATE FUNCTION:
CREATE FUNCTION name ( [ argumenttype [, ...] ] )
                  RETURNS returntype
                  AS 'definition'
                  LANGUAGE 'SQL'
End;

penjelasannya sebagai berikut :
-CREATE FUNCTION name ( [ argumenttype [, ...] ] )
Nama adalah nama fungsi baru yang akan dibuat. Ekspresi argumenttype sambil lalu dikelompokkan mendefinisikan tipe data dari argumen bahwa fungsi memerlukan saat dipanggil, dipisahkan dengan koma. Meninggalkan ungkapan ini hasil kosong dalam fungsi yang tidak menerima argumen (meskipun kurung masih diperlukan di kedua definisi dan penggunaan).

-RETURNS returntype
ReturnType adalah tipe data tunggal dari nilai yang dikembalikan oleh fungsi.

-AS 'definition'
Definisi adalah definisi program dari fungsi itu sendiri. Untuk bahasa prosedural, seperti PL / pgsql, ini adalah kode literal digunakan untuk mendefinisikan fungsi. Untuk fungsi C dikompilasi, ini adalah sistem jalan mutlak untuk link file yang berisi kode objek.

-LANGUAGE 'SQL'
languagename adalah nama dari bahasa yang fungsi ini ditulis dalam. bahasa mungkin bahasa prosedural didukung (seperti plpgsql, atau plperl, asumsi itu telah ditambahkan ke database), C, atau SQL.

Paling sederhana jenis fungsi untuk menambah PostgreSQL adalah fungsi SQL murni, karena tidak memerlukan pengetahuan pemrograman eksternal atau pengalaman. Fungsi SQL hanya didefinisikan sebagai pernyataan SQL standar dengan dukungan untuk argumen inline lulus sebagai parameter posisi.

Parameter posisi adalah referensi yang digunakan dalam definisi fungsi SQL untuk salah satu argumen panggilan. Hal ini disebut posisi karena direferensikan oleh urutan argumen dilewatkan ke fungsi. Sintaks parameter posisional adalah tanda dolar diikuti dengan nomor (misalnya, $ 1). Jumlah tersebut merupakan posisi memerintahkan dalam argumen dilewatkan ke fungsi, dimulai dengan 1.

PL / pgsql

PL/PGSQL merupakan bahasa yang lain untuk membuat sebuah fungsi, biasanya bahasa  ini  digunakan  untuk  menangani  fungsi  yang  lebih  kompleks.
PL / pgsql ( Bahasa Prosedural / PostgreSQL) adalah bahasa  prosedural pemrograman yang didukung oleh PostgreSQL ORDBMS . Ini mirip bahasa PL / SQL Oracle. Dengan PostgreSQL v9.x beberapa ISO SQL / PSM fitur, seperti overloading  fungsi dan prosedur SQL-dipanggil yang didukung.
PL / pgsql, sebagai bahasa pemrograman fitur lengkap, memungkinkan lebih banyak kontrol prosedural daripada SQL , termasuk kemampuan untuk menggunakan loop dan struktur kontrol lainnya. Fungsi dibuat dalam bahasa PL / pgsql dapat dipanggil dari pernyataan SQL, atau sebagai tindakan bahwa trigger melakukan. PL / pgsql diciptakan untuk dapat melakukan operasi yang lebih kompleks dan perhitungan dari SQL, sementara mudah digunakan, dan dapat didefinisikan sebagai dipercaya oleh server. PL / pgsql adalah satu-satunya bahasa pemrograman terinstal secara default untuk PostgreSQL, tapi banyak orang lain yang tersedia, termasuk PL / Java , PL / Perl , PL / php , PL / Python , PL / R , PL / Ruby , PL / sh , PL / Tcl , dan PL / Lua . PostgreSQL menggunakan Bison di tiap tahap sehingga mudah untuk port yang banyak open source bahasa, serta penggunaan kembali kode.

TRIGGER

Sejauh ini, semua fungsi yang didefinisikan dalam bab ini telah disebut secara eksplisit, baik dengan menggunakan fungsi SELECT () perintah atau dengan menggunakan fungsi dalam ekspresi. Anda juga dapat menghubungi tertentu fungsi PL / pgsql otomatis. Sebuah trigger adalah fungsi yang disebut setiap kali acara tertentu terjadi pada tabel tertentu. Perintah INSERT, UPDATE perintah, atau perintah DELETE dapat menyebabkan trigger untuk mengeksekusi. Trigger  digunakan  untuk  menyisipkan  sebuah  fungsi  pada  saat  suatu record di-INSERT,  UPDATE  dan  DELETE.

Sintaks penuh untuk perintah CREATE TRIGGER adalah :

CREATE TRIGGER trigger-name
 [BEFORE | AFTER] [ INSERT | DELETE | UPDATE [OR ...]]
    ON table-name FOR EACH ROW
    EXECUTE PROCEDURE function-name [(args)];

PL / pgsql dan trigger

Fungsi trigger dapat dibuat dengan PL / pgsql dan direferensikan dalam definisi PostgreSQL trigger. Istilah "fungsi trigger" adalah sebuah cara untuk mengacu pada fungsi yang dimaksudkan untuk dipanggil oleh trigger. trigger mendefinisikan operasi yang dilakukan ketika peristiwa tertentu terjadi dalam database. sebuah PL / pgsql memicu fungsi dapat direferensikan oleh trigger sebagai operasi yang akan dilakukan ketika acara trigger itu terjadi.

Definisi trigger dan definisi terkait memicu fungsinya adalah dua hal yang berbeda. trigger didefinisikan dengan perintah SQL 'CREATE TRIGGER', sedangkan fungsi trigger didefinisikan menggunakan SQL perintah 'CREATE FUNCTION'.

Fungsi trigger harus didefinisikan sebagai menerima argumen, dan mengembalikan nilai khusus tipe data 'OPAQUE'. sintaks 'CREATE FUNCTION' untuk mendefinisikan fungsi trigger PL / pgsql ditunjukkan berikut ini :

Creating trigger functions

CREATE FUNCTION function_identifier ()
RETURNS opaque AS '
  DECLARE
    declarations;
    [...]
  BEGIN
    statements;
    [...]
  END;
' LANGUAGE 'plpgsql';


Hasil praktikum
Menggunakan SQL Shell (PSQL)                               
Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]: ayu
Password for user ayu:
psql (9.3.5)
WARNING: Console code page (850) 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 ayu13650039
WARNING: Console code page (850) 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 "ayu13650039" as user "ayu".          
               
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 !

ayu13650039=> create function konversi_sh (x float)
ayu13650039-> returns float
ayu13650039-> as 'select ((x-32)/1.8);'
ayu13650039-> language 'sql';
CREATE FUNCTION
ayu13650039=> select konversi_sh (32);
 konversi_sh
-------------
           0
(1 row)


ayu13650039=> select konversi_sh (100);
   konversi_sh
------------------
 37.7777777777778
(1 row)

2.  Buatlah fungsi untuk mencari alamat mahasiswa dari tabel mahasiswa berdasarkan nama
mahasiswa. Kemudian jalankan dengan perintah SELECT !

ayu13650039=> select* from mahasiswa;
 nim_mah | nama_mah  | alamat_mah | id_fak |    no_tlp    | gender
---------+-----------+------------+--------+--------------+--------
      14 | luki      | ponorogo   |      2 | 08257656879  | L
      11 | Sinta     | malang     |      1 | 0856789012   | P
      13 | Wana      | kediri     |      4 | 085345673645 | P
      15 | adi       | malang     |      1 | 089873654353 | L
      16 | Egi       | mojokerto  |      1 | 085765432123 | P
      17 | runi      | bali       |      1 | 0857789012   | P
      12 | edi       | mojokerto  |      3 | 985245678213 | P
      44 |    ayu+++ | malang     |      1 | 085787654321 | P
(8 rows)


ayu13650039=> create or replace function cari_alamat (nama in text)
ayu13650039-> returns text
ayu13650039-> as 'select (alamat_mah) from mahasiswa
ayu13650039'> where nama_mah=nama;'
ayu13650039-> language 'sql';
CREATE FUNCTION
ayu13650039=> select cari_alamat ('Sinta');
 cari_alamat
-------------
 malang
(1 row)


ayu13650039=> select cari_alamat ('runi');
 cari_alamat
-------------
 bali
(1 row)

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 !

ayu13650039=> create or replace function hitung_nilai (integer)
ayu13650039-> returns text
ayu13650039-> as 'declare hasil text;
ayu13650039'> begin
ayu13650039'> case
ayu13650039'> when $1>100 or $1<0 then hasil=''nilai salah'';
ayu13650039'> when $1>=90 then hasil=''nilai A'';
ayu13650039'> when $1>=70 then hasil=''nilai B'';
ayu13650039'> when $1>=60 then hasil=''nilai C'';
ayu13650039'> when $1>=50 then hasil=''nilai D'';
ayu13650039'> else hasil=''nilai E'';
ayu13650039'> end case;
ayu13650039'> return hasil;
ayu13650039'> end;'
ayu13650039-> language 'plpgsql';
CREATE FUNCTION
ayu13650039=> select hitung_nilai (82);
 hitung_nilai
--------------
 nilai B
(1 row)


ayu13650039=> select hitung_nilai (52);
 hitung_nilai
--------------
 nilai D
(1 row)


ayu13650039=> select hitung_nilai (105);
 hitung_nilai
--------------
 nilai salah
(1 row)


ayu13650039=> create or replace function hitung_nilai2 (integer)
ayu13650039-> returns text
ayu13650039-> as 'declare hasil text;
ayu13650039'> begin
ayu13650039'> if $1>100 or $1<0 then select into hasil ''nilai salah'';
ayu13650039'> elseif $1>=90 then select into hasil ''nilai A'';
ayu13650039'> elseif $1>=70 then select into hasil ''nilai B'';
ayu13650039'> elseif $1>=60 then select into hasil ''nilai C'';
ayu13650039'> elseif $1>=50 then select into hasil ''nilai D'';
ayu13650039'> else select into hasil ''nilai E'';
ayu13650039'> end if;
ayu13650039'> return hasil;
ayu13650039'> end;'
ayu13650039-> language 'plpgsql';
CREATE FUNCTION
ayu13650039=> select hitung_nilai2 (82);
 hitung_nilai2
---------------
 nilai B
(1 row)


ayu13650039=> select hitung_nilai2 (52);
 hitung_nilai2
---------------
 nilai D
(1 row)


ayu13650039=> select hitung_nilai2 (1004);
 hitung_nilai2
---------------
 nilai salah
(1 row)

4.  Buatlah fungsi  menggunakan  pl/pgsql untuk  mencari bilangan  ganjil  atau  genap  dari
bilangan yang diinputkan. Kemudian jalankan dengan perintah SELECT !

ayu13650039=> create or replace function genap_ganjil(integer)
ayu13650039-> returns text
ayu13650039-> as 'declare hasil text;
ayu13650039'> begin
ayu13650039'> if $1%2=0 then select into hasil ''Bilangan Genap'';
ayu13650039'> else select into hasil ''Bilangan Ganjil'';
ayu13650039'> end if;
ayu13650039'> return hasil;
ayu13650039'> end;'
ayu13650039-> language 'plpgsql';
CREATE FUNCTION
ayu13650039=> select genap_ganjil(77);
  genap_ganjil
-----------------
 Bilangan Ganjil
(1 row)


ayu13650039=> select genap_ganjil(64);
  genap_ganjil
----------------
 Bilangan Genap
(1 row)

5.  Tambahkan  kolom  modifikasi  pada  tabel  mahasiswa.  Dimana  setiap  ada  insert  atau
update  maka  tanggal  pada  kolom  modifikasi  akan  menunjukkan  tanggal  perubahan
tersebut dilakukan.

ayu13650039=> alter table mahasiswa add column modifikasi varchar (15);
ALTER TABLE
ayu13650039=> select*from mahasiswa;
 nim_mah | nama_mah  | alamat_mah | id_fak |    no_tlp    | gender | modifikasi
---------+-----------+------------+--------+--------------+--------+------------
      14 | luki      | ponorogo   |      2 | 08257656879  | L      |
      11 | Sinta     | malang     |      1 | 0856789012   | P      |
      13 | Wana      | kediri     |      4 | 085345673645 | P      |
      15 | adi       | malang     |      1 | 089873654353 | L      |
      16 | Egi       | mojokerto  |      1 | 085765432123 | P      |
      17 | runi      | bali       |      1 | 0857789012   | P      |
      12 | edi       | mojokerto  |      3 | 985245678213 | P      |
      44 |    ayu+++ | malang     |      1 | 085787654321 | P      |
(8 rows)


ayu13650039=> create or replace function modif_trigger()
ayu13650039-> returns opaque
ayu13650039-> as 'begin
ayu13650039'> new.modifikasi=current_date;
ayu13650039'> return new;
ayu13650039'> end;'
ayu13650039-> language 'plpgsql';
CREATE FUNCTION
ayu13650039=> create trigger modif_data
ayu13650039-> before insert or update
ayu13650039-> on mahasiswa
ayu13650039-> for each row
ayu13650039-> execute procedure modif_trigger();
WARNING:  changing return type of function modif_trigger from "opaque" to "trigg
er"
CREATE TRIGGER
ayu13650039=> insert into mahasiswa values (7, 'rosyy', 'moker', 1, '085765456',
 'P');
INSERT 0 1
ayu13650039=> select*from mahasiswa;
 nim_mah | nama_mah  | alamat_mah | id_fak |    no_tlp    | gender | modifikasi
---------+-----------+------------+--------+--------------+--------+------------
      14 | luki      | ponorogo   |      2 | 08257656879  | L      |
      11 | Sinta     | malang     |      1 | 0856789012   | P      |
      13 | Wana      | kediri     |      4 | 085345673645 | P      |
      15 | adi       | malang     |      1 | 089873654353 | L      |
      16 | Egi       | mojokerto  |      1 | 085765432123 | P      |
      17 | runi      | bali       |      1 | 0857789012   | P      |
      12 | edi       | mojokerto  |      3 | 985245678213 | P      |
      44 |    ayu+++ | malang     |      1 | 085787654321 | P      |
       7 | rosyy     | moker      |      1 | 085765456    | P      | 2014-11-22
(9 rows)


ayu13650039=>


Hasil praktikum
Menggunakan SQL Shell (PSQL)
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Ayu>cd..

C:\Users>cd..

C:\>cd xampp/x/mysql/bin

C:\xampp\x\mysql\bin>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use ayu13650039;
Database changed
               
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 !

mysql> delimiter $$
mysql> create function konversi_suhu(a float)
    -> returns float
    -> begin
    -> return ((a-32)/1.8);
    -> end $$
Query OK, 0 rows affected (0.24 sec)

mysql> delimiter ;
mysql> select konversi_suhu(32);
+-------------------+
| konversi_suhu(32) |
+-------------------+
|                 0 |
+-------------------+
1 row in set (0.08 sec)

mysql> select konversi_suhu(150);
+--------------------+
| konversi_suhu(150) |
+--------------------+
|  65.55555725097656 |
+--------------------+
1 row in set (0.00 sec)

2.  Buatlah fungsi untuk mencari alamat mahasiswa dari tabel mahasiswa berdasarkan nama
mahasiswa. Kemudian jalankan dengan perintah SELECT !

mysql> delimiter $$
mysql> create function mencari_alamat(nama text)
    -> returns text
    -> begin
    -> declare hasil text;
    -> select alamat_mah into hasil
    -> from mahasiswa
    -> where nama_mah=nama;
    -> return hasil;
    -> end;
    -> $$
Query OK, 0 rows affected (0.00 sec)

mysql> select* from mahasiswa;
    -> $$
+---------+-----------+------------+--------+--------------+--------+
| nim_mah | nama_mah  | alamat_mah | id_fak | no_tlp       | gender |
+---------+-----------+------------+--------+--------------+--------+
|      11 | Sinta     | malang     |      1 | 085672837462 | P      |
|      12 | edi       | mojokerto  |      3 | 092837480912 | P      |
|      13 | wana      | kediri     |      4 | 098765432123 | P      |
|      14 | luki      | ponorogo   |      2 | 08257656879  | L      |
|      15 | adi       | malang     |      1 | 053647586978 | L      |
|      16 | Egi       | mojokerto  |      1 | 085726354766 | P      |
|      17 | runi      | bali       |      1 | 087736452623 | L      |
|      50 |    ayu+++ | malang     |      1 | 085676564213 | B      |
|     500 | ayu       | mojokerto  |      1 | 085676564213 | B      |
+---------+-----------+------------+--------+--------------+--------+
9 rows in set (0.00 sec)

mysql> select mencari_alamat ('Sinta');
    -> $$
+--------------------------+
| mencari_alamat ('Sinta') |
+--------------------------+
| malang                   |
+--------------------------+
1 row in set (0.02 sec)

mysql> select mencari_alamat ('adi');
    -> $$
+------------------------+
| mencari_alamat ('adi') |
+------------------------+
| malang                 |
+------------------------+
1 row in set (0.00 sec)

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 !

mysql> create function hasil_nilai (x integer)
    ->  returns text
    ->  begin
    ->  declare hasil text;
    ->  if x>100 or x<0 then
    ->  select "nilai salah" into hasil;
    ->  elseif x>=90 then
    ->  select "nilai A" into hasil;
    ->  elseif x>=70 then
    ->  select "nilai B" into hasil;
    ->  elseif x>=60 then
    ->  select "nilai C" into hasil;
    ->  elseif x>=50 then
    ->  select "nilai D" into hasil;
    ->  else
    ->  select "nilai E" into hasil;
    ->  end if;
    ->  return hasil;
    ->  end;
    ->  $$
Query OK, 0 rows affected (0.00 sec)

mysql> select hasil_nilai (89);
    -> $$
+------------------+
| hasil_nilai (89) |
+------------------+
| nilai B          |
+------------------+
1 row in set (0.00 sec)

mysql> select hasil_nilai (54);
    -> $$
+------------------+
| hasil_nilai (54) |
+------------------+
| nilai D          |
+------------------+
1 row in set (0.00 sec)

mysql> select hasil_nilai (109);
    -> $$
+-------------------+
| hasil_nilai (109) |
+-------------------+
| nilai salah       |
+-------------------+
1 row in set (0.00 sec)

4.  Buatlah fungsi  menggunakan  pl/pgsql untuk  mencari bilangan  ganjil  atau  genap  dari
bilangan yang diinputkan. Kemudian jalankan dengan perintah SELECT !

mysql> create function genap_ganjil(a integer)
    -> returns text
    -> begin
    -> declare hasil text;
    -> if a%2=0 then
    -> select "bilangan genap" into hasil;
    -> else
    -> select "bilangan ganjil" into hasil;
    -> end if;
    -> return hasil;
    -> end;
    -> $$
Query OK, 0 rows affected (0.01 sec)

mysql> select genap_ganjil (45);
    -> $$
+-------------------+
| genap_ganjil (45) |
+-------------------+
| bilangan ganjil   |
+-------------------+
1 row in set (0.07 sec)

mysql> select genap_ganjil (64);
    -> $$
+-------------------+
| genap_ganjil (64) |
+-------------------+
| bilangan genap    |
+-------------------+
1 row in set (0.00 sec)

5.  Tambahkan  kolom  modifikasi  pada  tabel  mahasiswa.  Dimana  setiap  ada  insert  atau
update  maka  tanggal  pada  kolom  modifikasi  akan  menunjukkan  tanggal  perubahan
tersebut dilakukan.

mysql> delimiter $$
mysql> alter table mahasiswa add modifikasi text;
    -> $$
Query OK, 0 rows affected (0.51 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> delimiter $$
mysql> create trigger modifikasi1
    -> before insert
    -> on mahasiswa
    -> for each row
    -> begin
    -> set new.modifikasi=current_date;
    -> end;
    -> $$
Query OK, 0 rows affected (0.02 sec)

mysql> create trigger modifikasi2
    -> before update
    -> on mahasiswa
    -> for each row
    -> begin
    -> set new.modifikasi=current_date;
    -> end;
    -> $$
Query OK, 0 rows affected (0.12 sec)

mysql> insert into mahasiswa (nim_mah, nama_mah, alamat_mah, id_fak, no_tlp, gen
der) values (5, 'yuyu', 'kediri', 2, '08756573576', 'P');
    -> $$
Query OK, 1 row affected (0.14 sec)

mysql> select * from mahasiswa;
    -> $$
+---------+-----------+------------+--------+--------------+--------+------------+
| nim_mah | nama_mah  | alamat_mah | id_fak | no_tlp       | gender | modifikasi |
+---------+-----------+------------+--------+--------------+--------+------------+
|       5 | yuyu      | kediri     |      2 | 08756573576  | P      | 2014-11-23 |
|      11 | Sinta     | malang     |      1 | 085672837462 | P      | NULL |
|      12 | edi       | mojokerto  |      3 | 092837480912 | P      | NULL |
|      13 | wana      | kediri     |      4 | 098765432123 | P      | NULL |
|      14 | luki      | ponorogo   |      2 | 08257656879  | L      | NULL |
|      15 | adi       | malang     |      1 | 053647586978 | L      | NULL |
|      16 | Egi       | mojokerto  |      1 | 085726354766 | P      | NULL |
|      17 | runi      | bali       |      1 | 087736452623 | L      | NULL |
|      50 |    ayu+++ | malang     |      1 | 085676564213 | B      | NULL |
|     500 | ayu       | mojokerto  |      1 | 085676564213 | B      | NULL |
+---------+-----------+------------+--------+--------------+--------+------------+
10 rows in set (0.00 sec)


mysql> update mahasiswa set alamat_mah='kediri' where nim_mah=13;
Query OK, 1 row affected (0.20 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from mahasiswa
    -> ;
+---------+-----------+------------+--------+--------------+--------+-----------
-+
| nim_mah | nama_mah  | alamat_mah | id_fak | no_tlp       | gender | modifikasi
 |
+---------+-----------+------------+--------+--------------+--------+------------+
|       5 | yuyu      | kediri     |      2 | 08756573576  | P      | 2014-11-23|
|      11 | Sinta     | malang     |      1 | 085672837462 | P      | NULL |
|      12 | edi       | mojokerto  |      3 | 092837480912 | P      | NULL |
|      13 | wana      | kediri     |      4 | 098765432123 | P      | 2014-11-24|
|      14 | luki      | ponorogo   |      2 | 08257656879  | L      | NULL |
|      15 | adi       | malang     |      1 | 053647586978 | L      | NULL|
|      16 | Egi       | mojokerto  |      1 | 085726354766 | P      | NULL|
|      17 | runi      | bali       |      1 | 087736452623 | L      | NULL |
|      50 |    ayu+++ | malang     |      1 | 085676564213 | B      | NULL |
|     500 | ayu       | mojokerto  |      1 | 085676564213 | B      | NULL |
+---------+-----------+------------+--------+--------------+--------+------------+
10 rows in set (0.00 sec)

mysql>


Perbandingan  Antara SQL Shell (psql) dan CMD mysql pada XAMPP

Pada perbandingan kali ini, beberapa syntak PSQL dan CMD MySQL itu ada yang sama dan ada juga yang berbeda.

        1.  Didalam PostgreSQL, tidak memerlukan delimiter seperti pada CMD MySQL yang wajib menggunakan delimiter di awal sebagai pembuka dan di akhir sebagai penutup.
        2.  Didalam postgreSQL, untuk mengapit bentuk string seperti pada soal no 3 dan 4 itu menggunakan tanda petik satu atas (') 2x. tetapi pada PostgreSQL MySQL, untuk mengapit string bisa langsung menggunakan tanda petik 2 atas (").
        3.  Pada PostgreSQL jika akan mengeksekusi trigger, harus membuat fungsi terlebih dahulu. tetapi pada CMD MySQL jika akan mengeksekusi trigger tidak perlu membuat fungsi, langsung membuat trigger. Bisa dilihat soal nomor 5.
        4.  Pada CMD MySQL, trigger mepunyai tipe data khusus untuk return yaitu OPAQUE. tetapi pada PostgrSQL tidak punya. Bisa dilihat soal nomor 5.
        5.  Pada PostgreSQL, menggabungkan 2 perintah yang berbeda seperti soal nomor 5 itu bisa. tetapi pada CMD MySQL tidak bisa, harus satu persatu. Berikut pembuktian point 3-5 di atas :
Pada PostgreSQL :
ayu13650039=> create or replace function modif_trigger() --> (membuat fungsi dahulu)
ayu13650039-> returns opaque --> (tipe data khusus)
ayu13650039-> as 'begin
ayu13650039'> new.modifikasi=current_date;
ayu13650039'> return new;
ayu13650039'> end;'
ayu13650039-> language 'plpgsql';
CREATE FUNCTION
ayu13650039=> create trigger modif_data
ayu13650039-> before insert or update --> (terdapat 2 perintah berbeda)
ayu13650039-> on mahasiswa
ayu13650039-> for each row
ayu13650039-> execute procedure modif_trigger();
WARNING:  changing return type of function modif_trigger from "opaque" to "trigger"
CREATE TRIGGER

Pada CMD MySQL :
mysql> delimiter $$ -->(harus ada delimiter)
mysql> create trigger modifikasi1
-> before insert or update --> (2 perintah berbeda membuat Error)
-> on mahasiswa
-> for each row
-> begin
-> set new.modifikasi=current_date;
-> end;
-> $$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'or up
date
on mahasiswa
for each row
begin
set new.modifikasi=current_date;
end' at line 2


Kesimpulan
Kesimpulan dari hasil praktikum dan pekrjaan rumah yang telah dikerjakan yaitu sebagai berikut :
    1. Fungsi SQL adalah kumpulan syntak yang dibuat untuk mempermudah pengguna supaya tidak mengetiknya berulang kali, cukup memanggil fungsi yang telah dibuat tersebut dengan perintah ‘SELECT’ dan kemudian mengisi/menginput .
      2.  Di dalam PostgreSQL, harus di dahului delimiter untuk membuat fungsi.
    3. PL/PGSQL merupakan salah satu bahasa lain untuk membuat sebuah fungsi yang mana biasanya bahasa  ini  digunakan  untuk  menangani  fungsi  yang  lebih  kompleks dan lebih detail.
   4. Trigger merupakan yang dibuat pada setiap event tertentu yang terjadi pada tabel tertentu. Trigger memiliki tipe data khusus untuk mengembalikan hasil (return) yaitu OPAQUE. Tidak seperti pada CMD MySQL, di postgreSQL  untuk mengeksekusi  trigger harus membuat fungsi terlebih dahulu.

Kritik /Saran
Saya menyadari dalam postingan ini masih banyak kekurangan sehingga kritik dari pembaca (khususnya yang lebih mengerti tentang SQL, PL/PGSQL dan Trigger) untuk membenarkan agar tidak terjadi kesalah pahaman.
Saran kepada pembaca untuk tidak putus asa dalam mengerjakan tugas yang bersangkutan dengan postingan ini dan terus mencoba agar bisa menjadi yang lebih baik. Tidak bosan saya mengingatkan untuk berdoa terlebih dahulu  agar sukses dan lancar dalam mengerjakannya.
Semoga ilmu yang sedikit ini bermanfaat bagi anda sekalian. Terima kasih ^_^

DAFTAR PUSTAKA
Pengenalan PL/PGSQL.pdf
PL2.pdf