into
into
into
into
into
into
into
into
Kayaknya udah cukup jelas yah untuk fungsi ini Kalau ada pertanyaan silahkan lewat grup.
2.
DBMS_OUTPUT.PUT_LINE('Nimnya'||v_nim||'Mutunya'||v_mutu||'SKSnya'||v_sks||'IPKn
ya'||v_ipk);
update mahasiswa set ipk=v_ipk where nim=v_nim;
end loop;
close cnim;
end;
/
Oke, disini aku sebagai cowok ganteng akan menjelaskan mengenai hal ihwal trigger ini:
Trigger itu adalah perintah yang akan dipanggil secara otomatis ketika terjadi suatu event. Event
tersebut ada 3, yakni before/after insert, before/after update, before/after delete.
create or replace trigger memasukkanNilai
before
insert
on nilai
for each row
Komando di atas artinya kita membuat sebuah komando untuk membuat trigger dengan nama
memasukkanNilai yang akan dilakukan sebelum insert pada table nilai di setiap barisnya (on each
rows). Kalau kamu ingin dilakukan sebelum update atau delete kamu tinggal ganti saja menjadi:
Before
update
Atau
Before
Delete
Atau
Before
insert or update or delete
Kalau pake komando terakhir berarti trigger ini akan dijalankan ketika insert, update, dan delete.
Okey, next: Ciri khas dari trigger adalah kita bisa mengambil data yang sedang diinsertkan atau
sedang diupdate atau sedang di delete. Lihat contoh di bawah:
v_kodemk := :new.kode_mk;
itu artinya nilai kode_mk yang diinsertkan akan ditampung ke variable v_kodemk.
Perintah :new dan :old
Banyak diantara kita yang luarbiasa rieut dengan apa perbedaan antara :old dan :new.
Simpelnya, :new hanya bisa digunakan di insert dan update, dan :old hanya bisa digunakan di
update dan delete.
Misal ada komando:
Insert into kamu(hatimu) values(cintaku);
WARNING: Saya tidak menganjurkan kamu untuk merebut pacar orang. :new dan
:old ini cuman sekedar ilustrasi
Oke. Tearkhir kalau delete seperti komando
Delete from kamu where hatimu=cintaku
Kenapa pake dual? Karena select into itu harus pake table. Mirip dengan kasus untuk mengambil
hasil function.
Okeh, can you keep?
5. Trigger untuk mengisi mutu dan IPK
Haha, ini bagian paling sulit dari kasus ini. Jadi, perhitungan IPK tidak bisa dilakukan pada kondisi
AFTER. Mengapa? Sebab, kalau AFTER artinya data telah terisi dan artinya table Nilai telah
berubah (mutating). Pada kondisi AFTER, mutating adalah sebuah kondisi terlarang (tabu) sehingga
kita tidak bisa mengambil nilai jumlah mutu pada kondisi after. Hehe
Jadi solusi terakhirnya, perhitungan IPK disatukan dengan mengisi mutu. Here the code:
create or replace trigger memasukkanNilai
before
insert
on nilai
for each row
declare
v_nim mahasiswa.nim%TYPE;
v_mutu nilai.mutu%TYPE;
v_sks matakuliah.sks%TYPE;
v_mutu_tot nilai.mutu%TYPE;
v_sks_tot matakuliah.sks%TYPE;
v_ipk mahasiswa.ipk%TYPE;
v_kodemk nilai.kode_mk%TYPE;
cursor c_sks is select sks from matakuliah where kode_mk=v_kodemk;
begin
v_nim := :new.nim;
v_kodemk := :new.kode_mk;
DBMS_OUTPUT.PUT_LINE('KodeMK: '||:new.kode_mk||'nilai: '||:new.nilai||'mutu:
'||:new.mutu);
open c_sks;
fetch c_sks into v_sks;
v_mutu := v_sks*konversiNilai(:new.nilai);
select v_mutu into :new.mutu from dual;
DBMS_OUTPUT.PUT_LINE('vsks: '||v_sks);
close c_sks;
/* kita akan ambil semua mutu */
select sum(mutu) into v_mutu_tot from nilai where nim=v_nim;
/* kita akan ambil semua SKS */
select sum(matakuliah.sks) into v_sks_tot from nilai,matakuliah where
matakuliah.kode_mk=nilai.kode_mk and nilai.nim=v_nim;
v_mutu_tot := v_mutu_tot + v_mutu;
v_sks_tot := v_sks_tot + v_sks;
v_ipk := v_mutu_tot/v_sks_tot;
update mahasiswa set ipk=v_ipk where nim=:new.nim;
end;
/
WARNING: Trigger After biasanya hanya digunakan untuk mengisi table log/rekapitulasi. Silahkan
belajar sendiri