Senin, Mei 07, 2012

procedure dan trigger mysql


PROCEDURE DAN TRIGGER MYSQL


BERKENALAN DENGAN STORE PROCEDURE DAN TRIGGER
Stored Procedures which allow us to automate or program our way out of many tasks on directly on the server rather than having to write external scripts to do complex manipulation of data – MYSQL References
Prosedur merupakan program yang ditulis dan dieksekusi langsung dari Engine database. Beberapa situasi dimana stored procedure sangat bermanfaat :
1.         Pada system yang didalamnya terdapat bermacam-macam platform bahasa pemrograman, akan tetapi proses yang terjadi pada database harus tetap memiliki standard yang sama.
2.         Sistem dikerjakan pada lingkungan yang berbeda-beda dengan prioritas keamanan yang berbeda sehingga diperlukan pembatasan terhadap hak-hak penggunaan terhadap tabel-tabel tertentu.
3.         Dengan adanya multi koneksi , maka dengan store procedure akan memberikan performa yang lebih baik karena proses interkoneksi dari luar server menjadi lebih sedikit.
4.         Programmer gak perlu pusing melihat bertumpuk-tumpuk tabel karena hanya memakai prosedur yang sudah ada.
Sedangkan trigger merupakan store procedure yang digunakan untuk memicu  perubahan pada suatu tabel sesuai dengan event yang  terjadi (insert, delete, update). Trigger dapat digunakan untuk memicu  proses terhadap tabel lain maupun tabel itu sendiri.
Manfaat dari trigger :
1.       Pada pemanfaatan program aplikasi multi platform, proses bisnis dari sistem dapat dibuat langsung dilakukan didatabase sehingga perbedaan interpretasi di  program aplikasi menjadi lebih diminimalisisr
2.       Proses lebih cepat
3.       Programmer  tinggal ongkang-ongkang kaki karena yang pusing DBAnya hehehehe..
Contoh tabel dan sampel data untuk coba-coba trigger dan procedure
CREATE TABLE jurusan (
id CHAR(3),
nama VARCHAR(50) NOT NULL,
Constraint pk_jur primary key(id));
CREATE TABLE Mahasiswa (
Nim CHAR(7),
Nama VARCHAR(50) NOT NULL,
Tgl_lahir DATE,
Jn_Kelamin ENUM(‘L’,'P’),
jalan VARCHAR(50),
Kota VARCHAR(20),
jurusan varchar(3),
constraint pk_mhs primary key(nim),
constraint fk_mhs_jur foreign key(jurusan) references jurusan(id));
CREATE TABLE Dosen (
Nip CHAR(5),
Nama VARCHAR(50) NOT NULL,
Tgl_lahir DATE,
Jn_Kelamin ENUM(‘L’,'P’),
jalan VARCHAR(50),
Kota VARCHAR(20),
jurusan varchar(3),
constraint pk_dsn primary key(nip),
constraint fk_dsn_jur foreign key(jurusan) references jurusan(id));
CREATE TABLE MataKuliah (
Kode_mka CHAR(10) NOT NULL,
Nama VARCHAR(50) NOT NULL,
Semester CHAR(5) NoT NULL,
sks TINYINT NOT NULL,
jenis ENUM(‘P’,W’),
dosen char(5),
constraint pk_mka primary key(kode_mka),
constraint fk_mka_dsn foreign key(dosen) references dosen(nip));
CREATE TABLE Prasyarat(
ID_prasyarat int auto_increment,
Kode_prasyarat char(10),
Kode_mka char(10),
Nilai varchar(1),
constraint pk_pra primary key(id_prasyarat),
constraint fk_pra_mka foreign key(kode_mka) references matakuliah(kode_mka),
constraint fk_pra_pra foreign key(kode_prasyarat) references matakuliah(kode_mka));
CREATE TABLEkuliah (
id int(11) NOT NULL auto_increment,
nilai_angka tinyint(4)NULL,
nilai_huruf char(1)NULL,
bobot tinyint(4)NULL,
Th_akademik char(5) NOT NULL,
nim char(7)NULL,
mka char(10)NULL,
constraint pk_klh primary key(id),
constraint fk_klh_mhs foreign key(nim) references mahasiswa(nim),
constraint fk_klh_mka foreign key(nim) references matakuliah(kode_mka));
INSERT INTO jurusan (Id, Nama) VALUES
(‘J01′, ‘Ilmu Komputer’),
(‘J02′, ‘Teknologi Informasi’),
(‘J03′, ‘Manajemen Informatika’);
INSERT INTO Mahasiswa (Nim, Nama, Tgl_lahir, Jn_Kelamin, jalan, Kota, jurusan) VALUES
(’0110001′, ‘Angga Ramadhan’, ’1986-05-05′, ‘L’, ‘Jl. Brigjen Katamso 50′, ‘Yogyakarta’, ‘J01′),
(’0110002′, ‘Amir syarifudin’, ’1985-06-20′, ‘L’, ‘Jl. Ahmad Yani 47′, ‘Sleman’, ‘J01′),
(’0110003′, ‘Dian Arum Ndalu’, ’1979-03-14′, ‘P’, ‘Jl. Kapten Tendean 23′, ‘Bantul’, ‘J01′),
(’0110004′, ‘Imam Bagus’, ’1980-05-13′, ‘L’, ‘Jl. Karangwaru I/3′, ‘Magelang’, ‘J01′),
(’0110005′, ‘Marlina Zein’, ’1982-02-01′, ‘P’, ‘Jl. Batang 108′, ‘Yogyakarta’, ‘J01′),
(’0110006′, ‘Rahendra Putra’, ’1986-04-12′, ‘L’, ‘Jl. Kenari 2A’, ‘Sleman’, ‘J01′), (’0110007′, ‘Yasinta Priska Nadia’, ’1978-04-29′, ‘P’, ‘Jl. Kertosono 87′, ‘Bandung’, ‘J01′),
(’0210001′, ‘Vivi Pratami’, ’1987-03-13′, ‘P’, ‘Jl. Gambiran 23′, ‘Yogyakarta’, ‘J02′),
(’0210002′, ‘Yuanita Tiara Reni’, ’1985-06-21′, ‘P’, ‘Jl. Mahameru 46′, ‘Jakarta’, ‘J02′),
(’0210003′, ‘Yusuf Nizar’, ’1978-09-23′, ‘L’, ‘Jl. Colombo’, ‘Yogyakarta’, ‘J02′),
(’0210004′, ‘Imelda Nurinda’, ’1984-08-12′, ‘P’, ‘Jl. Antasari 55′, ‘Medan’, ‘J02′),
(’0210005′, ‘Khomaruzaman’, ’1982-10-26′, ‘L’, ‘Jl. Wachid Hasyim 47′, ‘Makasar’, ‘J02′),
(’0210006′, ‘Danis Mariaman’, ’1979-12-18′, ‘L’, ‘Jl. Warungboto 05′, ‘Yogyakarta’, ‘J02′),
(’0210007′, ‘Ardhi Nugroho’, ’1986-09-16′, ‘L’, ‘Jl. Wonosari 63′, ‘Bantul’, ‘J02′),
(’0310001′, ‘Rima Nurasmi’, ’1987-03-03′, ‘P’, ‘Jl. Panggang Indah 108′, ‘Gunung Kidul’, ‘J03′),
(’0310002′, ‘Reza Fitriawati’, ’1985-07-10′, ‘P’, ‘Jl. Samas 2A’, ‘Bantul’, ‘J03′),
(’0310003′, ‘Haris Prasetya’, ’1980-06-28′, ‘L’, ‘Jl. Maga 23′, ‘Semarang’, ‘J03′),
(’0310004′, ‘Binti Nur Fitriani’, ’1986-09-14′, ‘P’, ‘Jl. Randu Belang 23′, ‘Yogyakarta’, ‘J03′),
(’0310005′, ‘Evi Munandari’, ’1988-01-21′, ‘P’, ‘Jl. Kebon Agung 40′, ‘Surakarta’, ‘J03′),
(’0310006′, ‘Nur Yusman Aqim’, ’1979-02-28′, ‘L’, ‘Jl. Kamboja 12′, ‘Magelang’, ‘J03′);
INSERT INTO dosen (Nip, Nama, Tgl_lahir, Jn_Kelamin, jalan, Kota, jurusan) VALUES
(’03002′, ‘Diana Ginting,S.Pd.,M.Cs.’, ’1959-06-21′, ”, ‘Jl. Gatot Subroto 89′, ‘Jakarta’, ‘J03′),
(’03001′, ‘Septian Dwiyanto,S.T.,M.Cs.’, ’1964-03-13′, ‘P’, ‘Jl. Bulukan 03′, ‘Lampung’, ‘J03′),
(’02003′, ‘Wahyu Nirba Habibah,S.T.’, ’1963-04-29′, ”, ‘Jl. Mayoret’, ‘Bandung’, ‘J02′),
(’02002′, ‘Jamalludin,S.T.,M.Kom.’, ’1965-04-12′, ‘P’, ‘Jl. Jend. Sudirman’, ‘Sleman’, ‘J02′),
(’02001′, ‘Mahmudin,S.Ag.,M.Kom.’, ’1956-02-01′, ‘P’, ‘Jl. Disvus 20′, ‘Yogyakarta’, ‘J02′),
(’01003′, ‘Kitri Sri Rahayu,S.T.’, ’1958-03-14′, ‘P’, ‘Jl. Mrican 23′, ‘Yogyakarta’, ‘J01′),
(’01004′, ‘Eko Aribowo,S.T.,M.Kom.’, ’1961-05-13′, ‘P’, ‘Jl. Mawar 56′, ‘Magelang’, ‘J01′),
(’01002′, ‘Imana Kusuma,S.T.,M.Kom.’, ’1960-06-20′, ‘L’, ‘Jl. KOl. Sugiono’, ‘Sleman’, ‘J01′),
(’01001′, ‘Wahyu Pujiono,S.T.,M.Kom.’, ’1957-09-03′, ‘L’, ‘Jl. Ambassador’, ‘Jakarta’, ‘J01′),
(’03003′, ‘Yohanes Surya,S.T.’, ’1960-09-23′, ‘P’, ‘Jl. Tamantirto’, ‘Bantul’, ‘J03′);
INSERT INTO matakuliah (Kode_mka, Nama, Semester, sks, jenis, dosen) VALUES
(‘MI01002′, ‘Operating System’, ’1′, 2, ‘W’, ’03004′),
(‘MI01001′, ‘Konsep Basis Data’, ’1′, 2, ‘W’, ’03004′),
(‘IK02004′, ‘Basis Data’, ’2′, 3, ‘P’, ’01001′),
(‘IK02003′, ‘Arsitektur Komputer’, ’2′, 2, ‘P’, ’01004′),
(‘IK02002′, ‘Dasar Pemrograman II’, ’2′, 3, ‘W’, ’01002′),
(‘IK02001′, ‘Algoritma Pemrograman’, ’2′, 2, ‘W’, ’01003′),
(‘IK01004′, ‘E-Commerce’, ’1′, 2, ‘P’, ’01001′),
(‘IK01003′, ‘Organisasi Komputer’, ’1′, 2, ‘P’, ’01004′),
(‘IK01002′, ‘Dasar Pemrograman’, ’1′, 3, ‘W’, ’01003′),
(‘IK01001′, ‘Statistika & Probabilitas’, ’1′, 2, ‘W’, ’01002′),
(‘TI02004′, ‘Bahasa Rakitan’, ’1′, 2, ‘P’, ’02001′),
(‘TI02003′, ‘Kalkulus 2′, ’2′, 3, ‘W’, ’02003′),
(‘TI02002′, ‘Sistem Operasi’, ’2′, 2, ‘W’, ’02002′),
(‘TI02001′, ‘Algoritma Dan Pemrograman I’, ’2′, 3, ‘W’, ’02002′),
(‘TI01004′, ‘Matematika Diskrit’, ’1′, 2, ‘W’, ’02002′),
(‘TI01003′, ‘Kalkulus 1′, ’1′, 3, ‘W’, ’02003′),
(‘TI01002′, ‘Aljabar Linear’, ’1′, 3, ‘W’, ’02001′),
(‘TI01001′, ‘Statistik Dasar’, ’1′, 2, ‘W’, ’02001′),
(‘MI01003′, ‘Aljabar Elementer’, ’1′, 2, ‘W’, ’03003′),
(‘MI01004′, ‘Fuzzy Logic’, ’1′, 2, ‘P’, ’03001′),
(‘MI02001′, ‘Teknologi Basis Data’, ’2′, 2, ‘W’, ’03002′),
(‘MI02002′, ‘Sistem Operasi’, ’2′, 2, ‘W’, ’03001′),
(‘MI02003′, ‘Pemrograman Terstruktur’, ’3′, 2, ‘W’, ’03001′),
(‘MI02004′, ‘Web Programming’, ’2′, 3, ‘P’, ’03003′);
INSERT INTO prasyarat (ID_prasyarat, Kode_prasyarat, Kode_mka, Nilai) VALUES
(1, ‘IK02002′, ‘IK01002′, ‘C’),
(2, ‘IK02003′, ‘IK01003′, ‘C’),
(3, ‘MI02004′, ‘MI01001′, ‘C’),
(4, ‘MI02004′, ‘MI01002′, ‘C’);
INSERT INTO kuliah (nilai_angka, nilai_huruf, bobot, Th_akademik, nim, mka) VALUES
(66, ‘B’, 3, ’20101′, ’0210003′, ‘TI01001′),
(50, ‘C’, 2, ’20101′, ’0210002′, ‘TI01004′),
(90, ‘A’, 4, ’20101′, ’0210003′, ‘TI01003′),
(70, ‘B’, 3, ’20101′, ’0210001′, ‘TI01001′),
(80, ‘B’, 3, ’20101′, ’0110002′, ‘IK01004′),
(95, ‘A’, 4, ’20101′, ’0110001′, ‘IK01004′),
(70, ‘B’, 3, ’20101′, ’0110001′, ‘IK01003′),
(80, ‘B’, 3, ’20101′, ’0110001′, ‘IK01001′),
(NULL, NULL, NULL, ’20102′, ’0110001′, ‘IK02001′),
(NULL, NULL, NULL, ’20102′, ’0110001′, ‘IK02003′),
(NULL, NULL, NULL, ’20102′, ’0110001′, ‘IK02004′),
(95, ‘A’, 4, ’20102′, ’0110002′, ‘IK02004′),
(NULL, NULL, NULL, ’20102′, ’0210001′, ‘TI02001′),
(NULL, NULL, NULL, ’20102′, ’0210003′, ‘TI02003′),
(NULL, NULL, NULL, ’20102′, ’0210002′, ‘TI02004′),
(NULL, NULL, NULL, ’20102′, ’0210003′, ‘TI02001′),
(NULL, NULL, NULL, ’20102′, ’0110002′, ‘IK02001′);
A. TRIGGER
Contoh Trigger yang digunakan untuk memicu perubahan pada tabel kuliah, pada tabel kuliah proses insert diasumsikan hanya dilakukan pada kolom nilai_angka saja sedangkan nilai huruf dan bobot akan terisi secara otomatis (dg mekanisme trigger) dilakukan jika nilai_angka terisi dengan kriteria tertentu.
Trigger disini dilakukan ketika terjadi 2 event yaitu insert (Before Insert) pada nilai_angka atau update (before update) pada nilai_angka.
Kalo di oracle bisa dibuat satu saja tapi kok di mysql aku coba gak bisa :D, terpaksa bikin 2 trigger.
DELIMITER  &&
CREATE TRIGGER updatebobot before update on kuliah
for each row
begin
if new.nilai_angka < 20 then
set new.bobot = 0;
set new.nilai_huruf=’E’;
else if new.nilai_angka >= 20 and new.nilai_angka <=40 then
set new.bobot = 1;
set new.nilai_huruf=’D’;
else if new.nilai_angka >= 41 and new.nilai_angka <=60 then
set new.bobot = 2;
set new.nilai_huruf=’C’;
else if new.nilai_angka >= 61 and new.nilai_angka <=80 then
set new.bobot = 3;
set new.nilai_huruf=’B’;
else if new.nilai_angka >= 81 and new.nilai_angka <=100 then
set new.bobot = 4;
set new.nilai_huruf=’A’;
end if;
end if;
end if;
end if;
end if;
end &&
DELIMITER ;
DELIMITER  &&
CREATE TRIGGER insertbobot before insert on kuliah
for each row
begin
if new.nilai_angka < 20 then
set new.bobot = 0;
set new.nilai_huruf=’E’;
else if new.nilai_angka >= 20 and new.nilai_angka <=40 then
set new.bobot = 1;
set new.nilai_huruf=’D’;
else if new.nilai_angka >= 41 and new.nilai_angka <=60 then
set new.bobot = 2;
set new.nilai_huruf=’C’;
else if new.nilai_angka >= 61 and new.nilai_angka <=80 then
set new.bobot = 3;
set new.nilai_huruf=’B’;
else if new.nilai_angka >= 81 and new.nilai_angka <=100 then
set new.bobot = 4;
set new.nilai_huruf=’A’;
end if;
end if;
end if;
end if;
end if;
end &&
DELIMITER ;
Untuk mencoba trigger  :
UPDATE KULIAH set nilai_angka =60 where nim =’0110001′ and mka =’IK02001′ and th_akademik=’20102′;
INSERT INTO kuliah (nilai_angka, Th_akademik, nim, mka) VALUES (66, ’20102′, ’010004′, ‘TI01004′);
B. PROCEDURE
Contoh procedure untuk melakukan cetak KRS, cetak KHS dan melakukan Proses KRS (input KRS) dan juga Input Nilai.
a) Procedure cetak KRS
DELIMITER &&
CREATE PROCEDURE CetakKRS(nim char(7), ta char(7))
BEGIN
SELECT distinct concat(m.nim ,”, m.nama ,’ | TA :  ‘, k.th_akademik) as  “Data Mahasiswa” from mahasiswa m
inner join kuliah k on m.nim = k.nim
where k.nim =nim and k.Th_akademik =ta;
SELECT concat(k.mka ,’  | ‘ , mk.nama, ‘ ‘) as “Mata Kuliah”, d.nama as “Dosen”, mk.sks as “SKS” from kuliah k
inner join matakuliah mk on k.mka = mk.kode_mka
inner join mahasiswa mhs on k.nim = mhs.nim
inner join dosen d on d.nip = mk.dosen
where k.nim = nim and k.Th_akademik = ta;
SELECT Concat(‘Jumlah SKS = ‘, sum(mk.sks)) as ” Keterangan” from kuliah k
inner join mahasiswa m on k.nim = m.nim
inner join matakuliah mk on k.mka = mk.kode_mka
where k.nim = nim and k.Th_akademik = ta
group by m.nim  ;
END &&
DELIMITER ;
b) Procedure cetak KHS
DELIMITER &&
CREATE PROCEDURE CetakKHS(nim char(7), ta char(7))
BEGIN
SELECT distinct concat(m.nim ,’   ‘, m.nama ,’  | TA :  ‘, k.th_akademik) as  “Data Mahasiswa” from mahasiswa m
inner join kuliah k on m.nim = k.nim
where k.nim =nim and k.Th_akademik =ta;
SELECT k.mka, mk.nama, mk.sks, k.nilai_huruf as Nilai, k.bobot, (k.bobot * mk.sks) as “bobot (bobot x sks)” from kuliah k
inner join matakuliah mk on k.mka = mk.kode_mka
inner join mahasiswa mhs on k.nim = mhs.nim
where k.nim = nim and k.Th_akademik = ta;
SELECT Concat(‘Jumlah SKS = ‘, sum(mk.sks)) as ” Keterangan  “, (sum(k.bobot * mk.sks)) as “Total Bobot”, (sum(k.bobot * mk.sks)/ sum(mk.sks)) as “IP
Sementara” from kuliah k
inner join mahasiswa m on k.nim = m.nim
inner join matakuliah mk on k.mka = mk.kode_mka
where k.nim = nim and k.Th_akademik = ta
group by m.nim ;
END &&
DELIMITER ;
c)  Proses insert dan update tabel kuliah pada trigger diatas dapat juga  dijadikan procedure
DELIMITER &&
CREATE PROCEDURE InputKRS(nr char(7), mk char(10), ta char(5))
BEGIN
Insert into kuliah(nim , mka, th_akademik)
values (nr, mk, ta);
END &&
DELIMITER ;
DELIMITER &&
CREATE PROCEDURE InputNilai(nr char(7), mk char(10), ta char(5), nl tinyint)
BEGIN
Update kuliah set nilai_angka = nl
where kuliah.nim =nr and kuliah.mka = mk and kuliah.th_akademik = ta;
END &&
DELIMITER ;
Melihat status dari procedure yang aktif
SHOW PROCEDURE STATUS;
Memanggil Procedure yang sudah dibuat
CALL CETAKKRS(’0110001′,’20102′);
CALL CETAKKHS(’0110001′,’20101′);

Tidak ada komentar: