Anda di halaman 1dari 12

LAPORAN teknologi basis data

PERTEMUAN KE 7 dan 8



Disusun Oleh :
Nama : Mohamad Hanafi
Nim : 095410134
Jurusan : TEKNIK INFORMATIKA

LABOROTARIUM TERPADU
SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER
AKAKOM
YOGYAKARTA
2011


PERTEMUAN KE-7
STORE PROCEDURE DAN FUNCTION
A. PEMBAHASAN
STORE PROCEDURE adalah salah satu feature yang terdapat di mysql 5.0 sedang-kan store
procedure sendiri adalah kumpulan-kumpulan SQL berupa routine yang di simpan dalam
database MySQL Server.
MySQL mendukung dua jenis rutin (subprogram):
a. stored procedure yang dapat dipanggil,
b. fungsi yang menghasilkan nilai yang dapat dipakai dalam statemen SQL lain.
Manfaat dari store procedure antara lain :
Akan memperkecil trafik request dari aplikasi ke database karena semua proses
bisnis dilakukan di database mysql dan aplikasi akan menerima hasil proses saja.
Ketika sebuah aplikasi yang didevelop terdiri dari berbagai bahasa pemrograman
(misalkan desktop dan web) yang mana kedua tipe aplikasi tersebut membutuhkan
hasil dan operasi database yang sama.
Untuk meningkatkan securiti, misalkan sebuah aplikasi yang login dengan user abcd
tidak dapat mengakses tabel2 tertentu secara langsung tetapi mesti melalui store
procedure, dengan cara ini akan meningkatkan ke-valid-tan data.
Secara default, MySQL dan berbagai software DBMS lainnya mengguna-kan perintah SQL
untuk definisi maupun pengolahan data. Meskipun bersifat lintas platform tetapi masalah
muncul karena SQL hanya bisa dilakukan secara individual, akibatnya proses untuk akses dan
pengolahan basis data sering dilakukan oleh bahasa lainnya. Hal ini menyebabkan turunya
kinerja karena memerlukan waktu dan sumber daya untuk perosesan antara compiler atau
interpreter suatu bahasa pemrograman dengan server basis data.

Pelaksanaan praktikum :
mysql> delimiter /
mysql> create procedure MhsJurusan() select
NIM,nama_mhs,kd_jur,thn_angkatan fro
m mahasiswa;
-> /
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call MhsJurusan();
+-----+----------+--------+--------------+
| NIM | nama_mhs | kd_jur | thn_angkatan |
+-----+----------+--------+--------------+
| 001 | muntoha | TI | 2009 |
| 002 | udin | SI | 2009 |
| 003 | kevin | MI | 2009 |
| 004 | wawan | TK | 2009 |
| 005 | tyas | KA | 2010 |
+-----+----------+--------+--------------+
5 rows in set (0.00 sec)
Pada pelaksanaan praktikum yang pertama yaitu membuat daftar mahasiswa dalam sintak
diatas berbeda dengan yang ada dimodul soalnya nama baris yang ada di tabel tidak sama
dengan nama yang ada dimodul dalam membuat procedure langkah pertama yaitu
membuat delimiter dahulu terserah bentuk huruf maupun simbol untuk dideklarasikannya
didalam MySQL. Perintah procedure diatas bertujuan untuk menampilkan nim,nama
mahasiswa,nama jurusan dan tahun angkatan. Apabila sudah dideklarasikan pada sintak
procedure akhir janganlah dikasih delimiter lagi tapi kasihlah karakter yang awal pembuatan
procedure dibuat dan apabila sintak delimiter digunakan maka MySQL akan terjadi error.
Untuk pemanggilan procedure diatas yaitu menggunakan sintak call lalu diteruskan dengan
nama procudure apabila user ingin mengganti delimiter yang tadi telah dirubah maka pada
pemanggilan procedure inilah user bisa mengganti delimiternya.

mysql> delimiter /
mysql> create procedure spMhsJurusan(kd_jur varchar(9)) select
NIM,nama_mhs,kd_j
ur,tgl_lahir from mahasiswa;
-> /
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call spMhsJurusan('TI');
+-----+----------+--------+------------+
| NIM | nama_mhs | kd_jur | tgl_lahir |
+-----+----------+--------+------------+
| 001 | muntoha | TI | 1991-07-06 |
| 002 | udin | TI | 1989-04-09 |
| 003 | kevin | TI | 1991-08-12 |
| 004 | wawan | TI | 1991-11-10 |
| 005 | tyas | TI | 1992-11-27 |
+-----+----------+--------+------------+
5 rows in set (0.00 sec)
Pada praktik kedua yaitu menggunakan parameter IN untuk menampilkan mahasiswa
jurusan tertentu. Pada langkah awalnya sama dengan praktik yang pertama yaitu membuat
delimiter terlebih dahulu setelah membuat delimiter membuat nama procedure (dalam
membuat procedure tidak bisa menggunakan nama yang sama dalam satu database kecuali
lain database) setelah itu membuat tipe data tipe data ini sama dengan tipe data yang ada
ditabel tersebut baik dalam ukurannya maupun nama baris dari tabel tersebut dalam contoh
ini diberi nama kd_jur. Dalam pemanggilan seperti praktik no.1 diikuti dengan nama
procedurenya tetapi yang membedakannya adalah didalam kurung kurawal diberi nilai
dimana nilai tersebut dibaca pada pembuatan procedure dalam contoh ini berarti
pemanggilan akan memanggil kd_jur yang tipenya varchar dan ukurannya 9 maka
menampilkan yang kd_jurnya TI.

mysql> delimiter /
mysql> create procedure JumMhs(out jum int) select count(*) into jum
from mahasiswa;
-> /
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call JumMhs(@);
Query OK, 0 rows affected (0.00 sec)
mysql> call (@);
+--------+
|count(*)|
+--------+
| 4|
+--------+
1 rows in set (0.00 sec)
Pada praktik yang ke-3 yaitu menggunakan parameter OUT untuk mengetahui jumlah
mahasiswa. pada awalnya menggunakan delimiter untuk menanggulangi sintak-sintak dalam
MySQL yang sama. Kita membuat terlebih dahulu nama procedure didalam kurung kurawal
itu Cuma perumpamaan yang mana perumpamaan tersebut dijadikan parameter dalam
pendeklarasian MySQLdari tabel mahasiswa, dalam pemanggilannya yaitu seperti biasa
menggunakan call lalu disertai dengan nama procedurenya untuk (@) itu hanya
perumpamaan juga dimana dalam MySQL tersebut untuk melakukan perhitungan, baru yang
terakhir adalah menampilkan jumlah mahasiswa tersebut dengan pemanggilan dan disertai
dengan perumpamaan yang dibuat pada pemanggilan pertamanya.

mysql> select * from jurusan;
+--------+----------+
| kd_jur | nama_jur |
+--------+----------+
| K0123T | TI |
| K0124T | SI |
| K0125T | TK |
| K0126T | MI |
| K0127T | KA |
+--------+----------+
5 rows in set (0.02 sec)

mysql> delimiter /
mysql> create procedure updatejurusan (in kd_jurupdt varchar(10),
in nama_jurupd
t varchar(12))
-> begin
-> update jurusan set kd_jur=kd_jurupdt, nama_jur=nama_jurupdt
where kd_jur=
kd_jurupdt or nama_jur=nama_jurupdt;
-> end;
-> /
Query OK, 0 rows affected (0.11 sec)

mysql> delimiter ;
mysql> call updatejurusan('K0128','KA');
Query OK, 1 row affected (0.03 sec)

mysql> select * from jurusan;
+--------+----------+
| kd_jur | nama_jur |
+--------+----------+
| K0123T | TI |
| K0124T | SI |
| K0125T | TK |
| K0126T | MI |
| K0128 | KA |
+--------+----------+
5 rows in set (0.00 sec)
Pada praktik yang ke-4 yaitu menggunakan perintah sintak BEGIN END. Perintah ini
digunaka untuk menulis blok perintah dari suatu store procedure, pada walnya kita
menggunakan delimiter create procedure updatejurusan (in kd_jurupdt
varchar(10), in nama_jurupdt varchar(12)) perintah ini menentukan nama
procedure dan didalam in tersebut dgunakan sebagai perumpamaan dan tipe datanya sesuai
dengan tabel jurusan perumpamaan tersebut digunakan untuk perubahan data. update
jurusan set kd_jur=kd_jurupdt, nama_jur=nama_jurupdt where
kd_jur=kd_jurupdt or nama_jur=nama_jurupdt; perintah ini digunakan
untuk perfubahan data dan memanggil perumpamaan yang dideklarasikan diatas tadi
gunanya agar store procedure tidak ambigu dalam pengubahan data. Untuk pemanggilan
Menggunakan call dalam pemanggilan store procedure ini berbeda karena disinilah data
yang akan dirubah ditulis sesuai tipe datanya.

mysql> delimiter //
mysql> create function fhitungmhs(kd_jur varchar(10))
-> returns int
-> begin
-> declare jum int;
-> select count(*) into jum from mahasiswa where kd_jur=kd_jur;
-> return jum;
-> end;
-> //
Query OK, 0 rows affected (0.02 sec)
Pada praktik yang ke-5 yaitu tentang fungsi dimana fungsi ini akan mengembalikan suatu
nilai(return value), parameter yang diperbolehkan hanya parameter IN.

LATIHAN
1). Membuat struktur table beli dan supplier
mysql> create table beli(
-> no_id int(13)primary key,
-> nama_brg varchar(12)not null,
-> harga_satuan int(12));
Query OK, 0 rows affected (0.09 sec)

mysql> create table supplier(
-> nama char(10)not null,
-> no_id int(13)primary key,
-> alamat varchar(13)not null,
-> nama_pemasok varchar(10));
Query OK, 0 rows affected (0.06 sec)

mysql> select * from beli;
+-------+--------------+--------------+
| no_id | nama_brg | harga_satuan |
+-------+--------------+--------------+
| 1 | vaseline men | 17500 |
| 2 | lifebuoy | 14900 |
| 3 | betadine | 17000 |
+-------+--------------+--------------+
3 rows in set (0.00 sec)

mysql> select * from supplier;
+---------+-------+--------+--------------+
| nama | no_id | alamat | nama_pemasok |
+---------+-------+--------+--------------+
| hanafi | 1 | ngawi | PT.IRENG |
| sumarmi | 2 | solo | PT.BLONTAN |
| heri | 3 | klaten | PT.ABANG |
+---------+-------+--------+--------------+
3 rows in set (0.00 sec)

2). Membuat perintah store procedure untuk menentukan harga jual barang yang baru
dipasok dari supplier, dengan ketentuan bahwa harga jual adalah 20% lebih tinggi dari harga
belinya.
mysql> delimiter //
mysql> create procedure harga_br()select harga_satuan from
beli;
-> //
Query OK, 0 rows affected (0.00 sec)

3). Panggilah store procedure yang telah dibuat
mysql> delimiter ;
mysql> call harga_br();
+--------------+
| harga_satuan |
+--------------+
| 17500 |
| 14900 |
| 17000 |
+--------------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

4). Buatlah perhitungan pada latihan no.2 menggunakan function
mysql> delimiter //
mysql> create function fBeli(harga_satuan int(12))
-> returns int
-> begin
-> declare jum int;
-> select count(*) into jum from beli
-> where harga_satuan=harga_satuan;
-> return jum;
-> end;
-> //
Query OK, 0 rows affected (0.02 sec)

5). Perbedaan antara store procedure dengan function
Store procedure : sub program dalam bahasa pemrograman yang disimpan dalam databases.
Sedangkan
Function adalah : sub program yang bisa mengembalikan suatu nilai balik (return value)
B. TUGAS

C. LISTING
Terlampir





PERTEMUAN KE-8
MEMBUAT VIEW DAN TRIGGER
A. PEMBAHASAN
Pembahasan kali ini adalah tidak sama persis yang ada didalam modul 8 tapi dalam praktik
kali ini adalah diberikan contoh kepada asisten dosen kita dibuat praktik,latihan sekaligus
pun tugas
Pembahasan dalam praktikum :
mysql> create database toko_buku;
Query OK, 1 row affected (0.05 sec)

mysql> use toko_buku;
Database changed
mysql> create table buku(
-> no_id varchar(12)primary key,
-> nama_buku char(20)not null,
-> harga int(15)not null,
-> stok varchar(13));
Query OK, 0 rows affected (0.06 sec)

mysql> create table transaksi(
-> no_transaksi varchar(10)primary key,
-> nama_barang char(19)not null,
-> harga int(17)not null,
-> jumlah int(18));
Query OK, 0 rows affected (0.05 sec)

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 50 |
| TI002M | pengenalan web | 24000 | 60 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 35 |
| TI002M | pengenalan web | 24000 | 24 |
| TI003M | basmi virus | 40000 | 50 |
+--------------+---------------------+-------+--------+
3 rows in set (0.00 sec)
Dalam hal ini kita membuat databases toko buku sesuai dengan soal yang diberikan seperti
biasa pembuatannya sederhana yang pertama pembuatan tabel dan yang kedua
memasukkan data didalam tabel data yang diisikan tersebut sembarang seperti yang tertera
diatas.

mysql> create trigger updtstok after update on buku for each row
insert into tra
nsaksi values('updte stok', old.no_id, old.stok, new.stok);
Query OK, 0 rows affected (0.08 sec)
mysql> update buku set stok=12 where no_id='TI001M';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 12 |
| TI002M | pengenalan web | 24000 | 60 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 35 |
| TI002M | pengenalan web | 24000 | 24 |
| TI003M | basmi virus | 40000 | 50 |
| updte stok | TI001M | 50 | 12 |
+--------------+---------------------+-------+--------+
4 rows in set (0.00 sec)
Untuk latihan yang kedua kita membuat trigger untuk mengupdate stok pada tabel buku jika
terjadi transaksi untuk langkah yang pertama kita membuat trigger dalam pembuatan
trigger kita mendeklarasikan nama tabel(field) yang ada di tabel buku dan field tersebut
bernama stok. Stok ini kita gabungkan dengan Id yang sama dengan tabel transaksi apabila
dalam membuat tabel id tidak sama maka untuk mengupdate tabel dan tabel satunnya tidak
ikut berubah maka harus dilakukan primary key yang sama kodenya baik string maupun
integer maka dari itulah kita dapat mengupdate satu tabel dan tabel yang lain tidak perlu di
update maka secara otomatis tabel yang satunnya ikut berubah.

mysql> create view jumtrans as select jumlah, count(jumlah) from
transaksi group
by jumlah;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from jumtrans;
+--------+---------------+
| jumlah | count(jumlah) |
+--------+---------------+
| 24 | 1 |
| 35 | 1 |
| 50 | 1 |
+--------+---------------+
3 rows in set (0.01 sec)

mysql> create view jumbuk as select harga, count(harga) from buku
group by harga
;
Query OK, 0 rows affected (0.31 sec)

mysql> select * from jumbuk;
+-------+--------------+
| harga | count(harga) |
+-------+--------------+
| 24000 | 1 |
| 35000 | 1 |
| 40000 | 1 |
+-------+--------------+
3 rows in set (0.00 sec)
Pada latihan yang keempat kita membuat view untuk menampilkan jumlah transaksi yang
terjadi dan total buku yang terjual pembuatan view itu tersendiri dilkukan penghitungan
untuk tabel transaksi pada field jumlah dimana penghitungan tersebut dilakukan
penghitungan dengan harga itu sendiri tapi anehnya punyaku tidak tampil dengan yang aku
harapkan tapi malah muncul angka satu untuk tiap jumlah maupun harga yang ada di tabel
buku dan transaksi aku bingung hehehehe.....!!!

mysql> delimiter /
mysql> create procedure updtjumlah (in stokupdt varchar(13), in
jumlahupdt int(1
8))
-> begin
-> update transaksi,buku set stok=stokupdt, jumlah=jumlahupdt
where stok=sto
kupdt or jumlah=jumlahupdt;
-> end;
-> /
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter ;
mysql> call updtjumlah(20,30);
Query OK, 3 rows affected (0.00 sec)

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 12 |
| TI002M | pengenalan web | 24000 | 12 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 30 |
| TI002M | pengenalan web | 24000 | 30 |
| TI003M | basmi virus | 40000 | 30 |
+--------------+---------------------+-------+--------+
3 rows in set (0.00 sec)
Pada latihan yang terakhir yaitu kita diminta untuk Buat procedure apabila terdapat
transaksi penjualan buku(tabel buku) maka jumlah buku(tabel transaksi) ikut berubah.
Dalam pembuaatan procedure yang aku buat memanggil field dan fieldnya itu sendiri beda
tabel sehingga untuk update dalam procedure melibatkan dua tabel untuk melakukan
updatenya dilkukan perintah call kenapa dalam perintah tersebut tidak langsung
menampilkan tabelnya karena perintah procedure tersebut melibatkan dua tabel sehingga
muncul Query OK, 3 rows affected (0.00 sec) berarti pengupdate tannya sudah
berhasil untuk melihat isi dari kedua tabel tersebut dilkukanlah perintah select sehingga
akan kelihatan perbuhan pada kedua tabel tersebut.

B. TUGAS
1. Buat database toko buku tabel buku dan tabel transaksi
mysql> create database toko_buku;
Query OK, 1 row affected (0.05 sec)

mysql> use toko_buku;
Database changed
mysql> create table buku(
-> no_id varchar(12)primary key,
-> nama_buku char(20)not null,
-> harga int(15)not null,
-> stok varchar(13));
Query OK, 0 rows affected (0.06 sec)

mysql> create table transaksi(
-> no_transaksi varchar(10)primary key,
-> nama_barang char(19)not null,
-> harga int(17)not null,
-> jumlah int(18));
Query OK, 0 rows affected (0.05 sec)

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 50 |
| TI002M | pengenalan web | 24000 | 60 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 35 |
| TI002M | pengenalan web | 24000 | 24 |
| TI003M | basmi virus | 40000 | 50 |
+--------------+---------------------+-------+--------+
3 rows in set (0.00 sec)
2. Buat trigger untuk mengupdate stok pada tabel buku jika terjadi transaksi
mysql> create trigger updtstok after update on buku for each row
insert into tra
nsaksi values('updte stok', old.no_id, old.stok, new.stok);
Query OK, 0 rows affected (0.08 sec)
mysql> update buku set stok=12 where no_id='TI001M';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 12 |
| TI002M | pengenalan web | 24000 | 60 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 35 |
| TI002M | pengenalan web | 24000 | 24 |
| TI003M | basmi virus | 40000 | 50 |
| updte stok | TI001M | 50 | 12 |
+--------------+---------------------+-------+--------+
4 rows in set (0.00 sec)
3. Buat trigger bila terjadi transaksi total harga > 100.000 maka harga baru = harga lama
dipotong 10% ditabel transaksi.
4. Buat view untuk menampilkan jumlah transaksi yang terjadi dan total buku yang terjual
mysql> create view jumtrans as select jumlah, count(jumlah) from
transaksi group
by jumlah;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from jumtrans;
+--------+---------------+
| jumlah | count(jumlah) |
+--------+---------------+
| 24 | 1 |
| 35 | 1 |
| 50 | 1 |
+--------+---------------+
3 rows in set (0.01 sec)

mysql> create view jumbuk as select harga, count(harga) from buku
group by harga
;
Query OK, 0 rows affected (0.31 sec)

mysql> select * from jumbuk;
+-------+--------------+
| harga | count(harga) |
+-------+--------------+
| 24000 | 1 |
| 35000 | 1 |
| 40000 | 1 |
+-------+--------------+
3 rows in set (0.00 sec)
5. Buat procedure apabila terdapat transaksi penjualan buku(tabel buku) maka jumlah
buku(tabel transaksi) ikut berubah.
mysql> delimiter /
mysql> create procedure updtjumlah (in stokupdt varchar(13), in
jumlahupdt int(1
8))
-> begin
-> update transaksi,buku set stok=stokupdt, jumlah=jumlahupdt
where stok=sto
kupdt or jumlah=jumlahupdt;
-> end;
-> /
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter ;
mysql> call updtjumlah(20,30);
Query OK, 3 rows affected (0.00 sec)

mysql> select * from buku;
+--------+---------------------+-------+------+
| no_id | nama_buku | harga | stok |
+--------+---------------------+-------+------+
| TI001M | pemrograman dekstop | 35000 | 12 |
| TI002M | pengenalan web | 24000 | 12 |
| TI003M | basmi virus | 40000 | 20 |
+--------+---------------------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from transaksi;
+--------------+---------------------+-------+--------+
| no_transaksi | nama_barang | harga | jumlah |
+--------------+---------------------+-------+--------+
| TI001M | pemrograman dekstop | 35000 | 30 |
| TI002M | pengenalan web | 24000 | 30 |
| TI003M | basmi virus | 40000 | 30 |
+--------------+---------------------+-------+--------+
3 rows in set (0.00 sec)

C. LISTING
Terlampir