Anda di halaman 1dari 19

LAPORAN PROYEK PEMBANGUNAN BASIS DATA

MANAJEMEN INFORMATIKA

PERSEWAAN MOBIL FAKHRI RENTAL CAR

Penulis Atyantiraras Retno Widayu 6301114172

TELKOM APPLIED SCIENCE SCHOOL | 2014

1. Proses Bisnis

Fakhri Rental Car adalah sebuah usaha yang bergerak di bidang persewaan mobil dengan jam kerja dari pukul 08.30 WIB - 21.00 WIB. Proses bisnis yang berjalan di Fakhri Rental Car sedikit berbeda dengan persewaan mobil lainnya. Jika persewaan mobil lainnya banyak menawarkan paket dalam bentuk jam, Fakhri Rental Car hadir dengan cara yang baru yaitu dengan harga pinjam yang lebih murah namun perhitungan lama pinjam berdasarkan hari saja. Petugas administrasi melakukan pengelolaan terhadap data pelanggan, data jenis mobil, data mobil, transaksi peminjaman ataupun transaksi pengembalian. Bagi calon peminjam yang sebelumnya belum pernah melakukan peminjaman mobil di Fakhri Rental Car diwajibkan membawa fotocopy KTP sebagai arsip untuk perusahaan. Selanjutnya petugas akan melakukan pencatatan data peminjam ke dalam database untuk selanjutnya dapat melakukan transaksi peminjaman. Sedangkan untuk peminjam lama, dapat langsung melakukan peminjaman. Untuk setiap peminjaman, dapat terdiri dari beberapa mobil dan peminjam dapat mengembalikan mobil secara tidak bersamaan pada saat pengembalian. Misalnya pada saat peminjaman, mobil yang dipinjam adalah Jazz dan Avanza. Kemudian peminjam mengembalikan mobil Jazz tepat pada tanggal wajib kembali yang telah disepakati, sedangkan mobil Avanza terlambat dikembalikan, maka mobil Avanza yang terlambat dikembalikan akan dikenai denda. Berikut adalah beberapa ketentuan yang dimiliki Fakhri Rental Car untuk proses peminjaman (asumsi peminjam sudah melakukan pendaftaran) : a. b. Fakhri Rental Car hanya melayani peminjaman pada jam kerja. Fakhri Rental Car tidak melayani peminjaman mobil dengan menggunakan sopir.

c.

Peminjam diwajibkan memberikan uang muka untuk setiap mobil yang akan dipinjam. Besarnya tidak kurang dari 30% total biaya yang dihitung dari lama pinjam dikalikan dengan harga pinjam mobil. Jika ingin melunasi total biaya justru lebih bagus.

d.

Hari peminjaman dikenakan biaya. Misalnya, jika seorang peminjam ingin meminjam mobil Avanza dengan harga pinjam Rp 200,000.- /hari pada tanggal 1 Januari 2014 3 Januari 2013 (3 hari). Maka peminjam tersebut akan dikenakan biaya sebesar Rp 600,000.-

e.

Perhitungan denda akan ditentukan pada saat pengembalian mobil. Berikut adalah beberapa ketentuan yang dimiliki Fakhri Rental Car untuk proses

pengembalian: a. Peminjam mengembalikan mobil yang telah dipinjam sesuai tanggal wajib pengembalian yang telah disepakati. b. c. d. Peminjam melunasi sisa pembayaran untuk setiap mobil yang telah dipinjam. Denda berlaku untuk setiap mobil yang terlambat dikembalikan. Keterlambatan dihitung dari tanggal pengembalian dikurangi dengan tanggal wajib pengembalian. e. Denda yang diberlakukan di Fakhri Rental Car adalah harga pinjam mobil yang dipinjam dikalikan dengan jumlah keterlambatan pengembalian (satuan hari). f. Batas maksimal pengembalian mobil adalah jam 9 malam, lewat jam tersebut pengembalian tidak akan dilayani dan peminjam harus mengembalikan mobil keesokan harinya pada jam kerja.

2. Batasan Masalah
Dalam pembuatan aplikasi ini penulis memerlukan beberapa batasan masalah yaitu : 1. Aplikasi ini dapat diakses oleh petugas administrasi dan manager. 2. Aplikasi ini digunakan untuk mengelola transaksi yang terjadi di Fakhri Rental Car dalam sehari-hari, yaitu meliputi pengelolaan data jenis mobil, data mobil, pendaftaran peminjam baru, transaksi peminjaman dan transaksi pengembalian. 3. Aplikasi ini dibuat menggunakan APEX. 4. Petugas administrasi dapat mengakses seluruh halaman yang ada di aplikasi ini, sedangkan untuk manager hanya dapat mengakses halaman yang berupa report dan grafik.

3. Flowmap
Dalam studi kasus ini terdapat dua flowmap, yaitu : a. Flowmap Peminjaman

Peminjaman Mobil
Peminjam Admin

Pilih Mobil

Cek Mobil

Mobil

Ya

Pilih Mobil Lain

Tidak

Tersedia

Ya

Fc.KTP

Cek Masa Aktif KTP

Ya Tidak KTP Aktif Tidak Berlaku Ya Fc.KTP

Tidak Peminjam Baru Batal Pinjam Ya

Pelanggan

Tidak

Pendaftaran Pelanggan Detail Peminjama n Catat Sewa Peminjama n

Bill Peminjaman

Billing (Hitung Tagihan)

Bill Peminjaman & STNK

STNK

Pencari an STNK

Arsip

b. Flowmap Pengembalian

Pengembalian Mobil
Peminjam Admin

STNK & Bill Peminjaman

Cek STNK & Bill Peminjam an

Tidak

Fiksasi Bill

Cek lama pinjam Ya

Perhitungan denda Terlambat

Ya Tidak

Detail Pengembali an

Cetak Bill Pengembalian

Bill Pengembalian

Bill Pengembalian

STNK, Bill Peminjaman, & Bill Pengembalian

Arsip

4. ER-Diagram

Berikut adalah ER-Diagram yang digunakan dalam pembangunan aplikasi ini :


no_ktp nama alamat tgl_daftar kode_jenis harga melakukan 1 Peminjam keterangan tahun

Jenis_Mobil no_telp jk kota 1

memiliki

lama_pinjam tgl_pinjam

tgl_wajib_kembali no_polisi

status

Peminjaman

detail_pinjaman

Mobil

id_pinjam bayar

nama_mobil merk

denda

detail_pengembalian

sisa_pelunasan Pegawai

Pengembalian id_pegawai

nama

id_pengembalian

tgl_kembali

Gambar 1

Sesuai dengan ER-Diagram pada Gambar 1, terdapat entitas Pegawai yang tidak memiliki relasi ke entitas lainnya. Hal ini dikarenakan entitas Pegawai hanya berfungsi untuk menampung id dan nama pegawai yang digunakan sebagai username dan password untuk login ke aplikasi yang terdapat di APEX (berfungsi untuk keamanan).

5. Diagram Relasional
Berikut adalah diagram relasional sesuai dengan ER-Diagram pada Gambar 1 :
PEMINJAM PK no_ktp nama jk alamat kota tgl_daftar DETAIL_PINJAMAN PEMINJAMAN PK FK1 id_pinjam no_ktp tgl_pinjam tgl_wajib_kembali lama_pinjam bayar FK1 PK,FK1 PK,FK2 id_pinjam no_pol PK NO_TELP PK,FK1 PK no_ktp no_telp JENIS_MOBIL PK kode_jenis keterangan tahun harga_pinjam

MOBIL no_pol nama merk kode_jenis status

DETAIL_PENGEMBALIAN PENGEMBALIAN PK id_pengembalian tgl_kembali PEGAWAI PK id_pegawai nama PK,FK1 PK,FK2 PK,FK2 id_pengembalian id_pinjam no_pol denda sisa_pembayaran

Gambar 2

6. Struktur Table
a. Tabel PEMINJAM No
1 2 3 4 5 6.

Nama Kolom
NO_KTP NAMA JK TGL_DAFTAR ALAMAT KOTA

Tipe Data
CHAR(16) VARCHAR2(30) VARCHAR2(15) DATE VARCHAR2(50) VARCHAR2(25)

Keterangan
PRIMARY KEY

b. Tabel NO_TELP No
1 2

Nama Kolom
NO_KTP NO_TELP

Tipe Data
CHAR(16) CHAR(13)

Keterangan
FOREIGN KEY REFERENCE TABEL PEMINJAM, PRIMARY KEY 1 PRIMARY KEY 2

c. Tabel JENIS_MOBIL

No
1 2 3 4

Nama Kolom
KODE_JENIS KETERANGAN TAHUN HARGA_PINJAM

Tipe Data
CHAR(2) VARCHAR2(20) CHAR(4) NUMBER

Keterangan
PRIMARY KEY

d. Tabel MOBIL No 1 2 3 4 5 NO_POL NAMA MERK KODE_JENIS STATUS Nama Kolom Tipe Data VARCHAR2(10) VARCHAR2(30) VARCHAR2(30) CHAR(2) VARCHAR2(30) Keterangan PRIMARY KEY

FOREIGN KEY REFERENCE TABEL JENIS_MOBIL

e. Tabel PEMINJAMAN No
1 2 3

Nama Kolom
ID_PINJAM TGL_PINJAM NO_KTP

Tipe Data
CHAR(5) DATE CHAR(16)

Keterangan
PRIMARY KEY FOREIGN KEY REFERENCE TABEL PEMINJAM

f. Tabel DETAIL_PINJAMAN No
1

Nama Kolom
ID_PINJAM

Tipe Data
CHAR(5)

Keterangan
FOREIGN KEY REFERENCE TABEL PEMINJAMAN, PRIMARY KEY 1 FOREIGN KEY REFERENCE TABEL MOBIL, PRIMARY KEY 2

2 3 4 5

NO_POL TGL_WAJIB_KEMBALI LAMA_PINJAM BAYAR

VARCHAR2(10) DATE NUMBER (3) NUMBER

g. Tabel PENGEMBALIAN No
1 2

Nama Kolom
ID_PENGEMBALIAN TGL_KEMBALI

Tipe Data
CHAR(5) DATE

Keterangan
PRIMARY KEY

h. Tabel DETAIL_PENGEMBALIAN No 1 Nama Kolom


ID_PENGEMBALIAN

Tipe Data
CHAR(5)

Keterangan
FOREIGN KEY REFERENCE TABEL PENGEMBALIAN, PRIMARY KEY 1 FOREIGN KEY REFERENCE TABEL DETAIL_PINJAMAN, PRIMARY KEY 2 FOREIGN KEY REFERENCE TABEL DETAIL_PINJAMAN, PRIMARY KEY 3

ID_PINJAM

CHAR(5)

3 4 5

NO_POL DENDA SISA_PEMBAYARAN

VARCHAR2(10) NUMBER NUMBER

7. Pembahasan
Materi Pemrograman Basis Data yang saya implementasikan dalam aplikasi ini adalah mengenai UTL_FILE , NATIVE DYNAMIC SQL dan DBMS_SCHEDULER. a. UTL_FILE digunakan untuk membuat laporan dalam bentuk file EXCEL, dimana laporan tersebut mencetak jumlah pemakaian dari masing-masing mobil untuk setiap bulannya, serta total uang dan denda yang dihasilkan dari mobil yang bersangkutan. Disertai dengan keterangan mobil yang paling diminati peminjam, dan yang paling jarang dipinjam serta total pendapatan tertinggi dan terendah. Data ini hanya diperuntukkan untuk mobil-mobil yang dikembalikan pada bulan yang diinginkan. b. NATIVE DYNAMIC SQL digunakan untuk membuat table untuk masing-masing mobil (diwakili dengan nomor polisi). Table tersebut berisi jumlah pemakaian mobil yang bersangkutan untuk setiap bulannya. Jika belum dikembalikan, jumlah

pemakaiannya akan tetap dihitung, karena perhitungan jumlah pemakaian didasarkan pada saat mobil dipinjam. Jadi jika mobil belum dikembalikan, tetap akan dihitung. c. DBMS_SCHEDULER digunakan untuk menjalankan procedure untuk membuat table setiap akhir bulan pada saat persewaan mobil sudah tutup.

Adapun coding program UTL_FILE adalah sebagai berikut :


create or replace PROCEDURE laporan_pemakaian_mobil(vbulan in varchar2,vtahun varchar2) is femp UTL_FILE.FILE_TYPE; vline varchar2(200); vno number:=0; vjum number:=0; vsewa number:=0; vdenda number:=0; vtotal number:=0; vtotaldenda number:=0; bulan varchar2(20); vnopol varchar2(10); vnama varchar2(30); cursor rekap_bulanan is select m.no_pol, m.merk, m.nama, count(dpg.no_pol) as jumlah, sum(dpj.lama_pinjam) as lama, sum((dpj.lama_pinjam*jm.harga_pinjam)) as total_harga, sum(dpg.denda) as denda from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.merk, m.nama order by m.nama, m.merk, m.no_pol; cursor mobil_maksimal is select m.no_pol, m.nama from mobil m join (select m.no_pol, m.nama, count(dpg.no_pol) as jumlah from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama) a on (m.no_pol = a.no_pol) where jumlah = (select max(jumlah) from (select m.no_pol, m.nama, count(dpg.no_pol) as jumlah from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama)) and rownum=1 order by m.nama asc;

cursor total_maksimal is select m.no_pol, m.nama, total from mobil m join (select m.no_pol, m.nama, sum((dpj.lama_pinjam*jm.harga_pinjam)+dpg.denda) as total from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama) a on (m.no_pol = a.no_pol) where total = (select max(total) from (select m.no_pol, m.nama, sum((dpj.lama_pinjam*jm.harga_pinjam)+dpg.denda) as total from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama)) and rownum =1 order by m.nama asc; cursor total_minimal is select m.no_pol, m.nama, total from mobil m join (select m.no_pol, m.nama, sum((dpj.lama_pinjam*jm.harga_pinjam)+dpg.denda) as total from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama) a on (m.no_pol = a.no_pol) where total = (select min(total) from (select m.no_pol, m.nama, sum((dpj.lama_pinjam*jm.harga_pinjam)+dpg.denda) as total from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama)) and rownum =1 order by m.nama asc;

cursor mobil_minimal is select m.no_pol, m.nama from mobil m join(select m.no_pol, m.nama, count(dpg.no_pol) as jumlah from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama) a on (m.no_pol = a.no_pol) where jumlah =(select min(jumlah) from (select m.no_pol, m.nama, count(dpg.no_pol) as jumlah from peminjam p join peminjaman pj on (pj.no_ktp=p.no_ktp) join detail_pinjaman dpj on(pj.id_pinjam=dpj.id_pinjam) join mobil m on (dpj.no_pol=m.no_pol) join jenis_mobil jm on (jm.kode_jenis=m.kode_jenis) join detail_pengembalian dpg on(dpg.id_pinjam=dpj.id_pinjam) and (dpg.no_pol=dpj.no_pol) join pengembalian pg on (dpg.id_pengembalian=pg.id_pengembalian) where to_char(pg.tgl_kembali,'MM') = vbulan and to_char(pg.tgl_kembali,'YYYY') = vtahun group by m.no_pol, m.nama)) and rownum=1 order by m.nama asc; BEGIN select distinct to_char(tgl_pinjam,'MONTH') into bulan from peminjaman where to_char(tgl_pinjam,'MM') = vbulan; femp := UTL_FILE.FOPEN('DIR1','Rekap_'||vbulan||'_'||vtahun||'.xls','W'); UTL_FILE.PUT_LINE(femp,chr(9)||chr(9)||'REKAP TRANSAKSI PENYEWAAN MOBIL BULAN' ||bulan||' '||vtahun); UTL_FILE.NEW_LINE(femp); UTL_FILE.NEW_LINE(femp); UTL_FILE.NEW_LINE(femp); UTL_FILE.PUT_LINE(femp,'NO'||chr(9)||'NOPOL'||chr(9)||'MERK'||chr(9)||'NAMA'||chr(9)|| 'JUMLAH PEMINJAMAN'||chr(9)||'TOTAL PEMAKAIAN (HARI)' ||chr(9)||'TOTAL SEWA'||chr(9)||'TOTAL DENDA'||chr(9)|| 'TOTAL PENDAPATAN'); FOR x IN rekap_bulanan LOOP vno := vno+1; vsewa := vsewa+x.total_harga; vdenda := vdenda+x.denda; vtotal := vtotal + (x.denda+x.total_harga); vline := vno ||chr(9)||x.no_pol||chr(9)||x.merk||chr(9)||x.nama||chr(9)||x.jumlah ||chr(9)||x.lama||chr(9)||'Rp '||to_char(x.total_harga,'999,999,999.00') ||chr(9)||'Rp'||to_char(x.denda,'99,999,999.00')||chr(9)|| 'Rp'||to_char(x.denda+x.total_harga,'99,999,999.00'); UTL_FILE.PUT_LINE(femp, vline); END LOOP;

UTL_FILE.PUT_LINE(femp,'Total '||chr(9)||chr(9)||chr(9)||chr(9)||chr(9)||chr(9)|| 'Rp'||to_char(vsewa,'999,999,999.00')||chr(9)|| 'Rp'||to_char(vdenda,'999,999,999.00')| |chr(9)|| 'Rp'||to_char(vtotal,'999,999,999.00') ); UTL_FILE.PUT_LINE(femp,' '); UTL_FILE.PUT_LINE(femp,' '); UTL_FILE.PUT_LINE(femp,' '); FOR r IN mobil_maksimal LOOP UTL_FILE.PUT_LINE(femp,'Mobil yang Paling Diminati' ||chr(9)||chr(9)||chr(9)||r.no_pol||' '||r.nama); END LOOP; FOR a in mobil_minimal LOOP UTL_FILE.PUT_LINE(femp,'Mobil yang Paling Tidak Diminati' ||chr(9)||chr(9)||chr(9)||a.no_pol||' '||a.nama); END LOOP; FOR s in total_maksimal LOOP UTL_FILE.PUT_LINE(femp,'Total Pendapatan Tertinggi'||chr(9)||chr(9)||chr(9)|| 'Rp'||to_char(s.total,'999,999,999.00')); END LOOP; FOR d in total_minimal LOOP UTL_FILE.PUT_LINE(femp,'Total Pendapatan Terendah'||chr(9)||chr(9)||chr(9)|| 'Rp'||to_char(d.total,'999,999,999.00')); END LOOP; UTL_FILE.FCLOSE(femp); END; /

exec laporan_pemakaian_mobil('12','2013');

Adapun coding program procedure NATIVE DYNAMIC SQL dan DBMS_SCHEDULER adalah sebagai berikut : Procedure yang pertama digunakan untuk mengcreate table-table untuk pertama kalinya.
create or replace procedure proc_mobil is TYPE carCurRef IS REF CURSOR; b carCurRef; vbulan varchar2(20); vbulan1 varchar2(20); jumlah number(4); vtahun varchar2(5); table_name varchar2(35); cmd varchar2(200); q varchar2(600); begin FOR x in (select no_pol from mobil) LOOP table_name cmd := 'Rekap_Mobil_'||x.no_pol; := 'CREATE TABLE '||table_name||'(Bulan varchar2(20), Tahun varchar2(5), JumlahPeminjaman char(20) )';

EXECUTE IMMEDIATE cmd; q := 'select TO_CHAR(pj.tgl_pinjam,''Month'') as bulan, TO_CHAR(pj.tgl_pinjam,''MM'') as bulan1, TO_CHAR(pj.tgl_pinjam,''YYYY'') as tahun, COUNT(dpj.id_pinjam) as jumlah from peminjaman pj join detail_pinjaman dpj '|| 'on(dpj.id_pinjam=pj.id_pinjam) '|| 'where no_pol = :a '||' group by TO_CHAR(pj.tgl_pinjam,''Month''), TO_CHAR(pj.tgl_pinjam,''MM''), TO_CHAR(pj.tgl_pinjam,''YYYY'')'|| 'order by tahun, bulan1 asc'; OPEN b for q using x.no_pol; LOOP FETCH b INTO vbulan, vbulan1, vtahun, jumlah; EXIT WHEN b%NOTFOUND; EXECUTE IMMEDIATE 'insert into '||table_name||' values (:q,:w,:k)' using vbulan, vtahun, jumlah; commit; END LOOP; CLOSE b; END LOOP; END; / exec proc_mobil;

Procedure kedua digunakan untuk mereplace tabel-tabel lama dengan tabel yang baru, dengan procedure ini table bisa dibuat setiap awal tahun. Kedua procedure yang ada dibuat dengan nama yang sama.
create or replace procedure proc_mobil is TYPE carCurRef IS REF CURSOR; b carCurRef; vbulan varchar2(20); vbulan1 varchar2(20); jumlah number(4); vtahun varchar2(5); table_name varchar2(35); cmd varchar2(200); q varchar2(600); begin FOR x in (select no_pol from mobil) LOOP table_name := 'Rekap_Mobil_'||x.no_pol; EXECUTE IMMEDIATE 'DROP TABLE Rekap_Mobil_'||x.no_pol; cmd := 'CREATE TABLE '||table_name||'(Bulan varchar2(20), Tahun varchar2(5), JumlahPeminjaman char(20) )'; EXECUTE IMMEDIATE cmd; q := 'select TO_CHAR(pj.tgl_pinjam,''Month'') as bulan, TO_CHAR(pj.tgl_pinjam,''MM'') as bulan1, TO_CHAR(pj.tgl_pinjam,''YYYY'') as tahun, COUNT(dpj.id_pinjam) as jumlah from peminjaman pj join detail_pinjaman dpj '|| 'on(dpj.id_pinjam=pj.id_pinjam) '|| 'where no_pol = :a '||' group by TO_CHAR(pj.tgl_pinjam,''Month''), TO_CHAR(pj.tgl_pinjam,''MM''), TO_CHAR(pj.tgl_pinjam,''YYYY'')'|| 'order by tahun, bulan1 asc'; OPEN b for q using x.no_pol; LOOP FETCH b INTO vbulan, vbulan1, vtahun, jumlah; EXIT WHEN b%NOTFOUND; EXECUTE IMMEDIATE 'insert into '||table_name||' values (:q,:w,:k)' using vbulan, vtahun, jumlah; commit; END LOOP; CLOSE b; END LOOP; END; / exec proc_mobil;

Kemudian procedure yang telah dibuat, dipanggil ke dalam DBMS_SCHEDULER seperti di bawah ini:
----------------------------------------PROGRAM--------------------------------------------BEGIN DBMS_SCHEDULER.CREATE_PROGRAM ( program_name => 'PROG_MOBIL', program_type => 'STORED_PROCEDURE', program_action => 'proc_mobil', enabled => FALSE, comments => 'Program untuk membuat tabel tentang jumlah pemakaian mobil'); END; /

-----------------------------------------SCHEDULE--------------------------------------------BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE( schedule_name => 'SCHEDULE_MOBIL', start_date => SYSDATE, repeat_interval => 'FREQ=monthly; BYMONTHDAY=-1;' ); END; / --------------------------------------------------JOB--------------------------------------------BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'JOB_MOBIL', program_name => 'PROG_MOBIL', schedule_name => 'SCHEDULE_MOBIL', enabled => TRUE, auto_drop => FALSE, comments => 'Job yang membuat table total jumlah pemakaian per mobil dalam setiap bulan' ); END; /

EKSEKUSI : EXEC DBMS_SCHEDULER.ENABLE('PROG_MOBIL'); EXEC DBMS_SCHEDULER.ENABLE('JOB_MOBIL');

Hasil : 1. UTL_FILE Form Pencetakan Laporan Pemakaian Mobil :

Hasilnya :

2. NATIVE DYNAMIC SQL dan DMBS_SCHEDULER