SQL Dasar
SQL Dasar
Politeknik Telkom
Dilarang menerbitkan kembali, menyebarluaskan, atau menyimpan baik sebagian maupun seluruh isi buku dalam bentuk dan dengan cara apapun tanpa izin tertulis dari Politeknik Telkom Hak cipta dilindungi undang-undang @ Politeknik Telkom 2009 No part of this document may be copied, reproduced, printed, distributed, modified, removed and amended in any form by any means without prior written authorization of Telkom Polytechnic. Copyright @ 2009 Telkom Polytechnic. All rights reserved
ii User, Privilege dan Role
Politeknik Telkom
KATA PENGANTAR
Assalamualaikum Wr. Wb. Segala puji bagi Allah SWT karena dengan karunia-Nya courseware ini dapat diselesaikan. Atas nama Politeknik Telkom, kami sangat menghargai dan ingin menyampaikan terima kasih kepada penulis, penerjemah dan penyunting atas kontribusi yang telah diberikan sehingga courseware ini dapat tersusun. Kami mendorong para pengajar & mahasiswa untuk memberikan masukan yang positif. Saran mereka akan menjadi bahan pertimbangan yang serius dan banyak yang akan dimasukkan sebagai bahan perbaikan di edisi berikutnya. Kami akan sangat mengahargai apabila semua pihak dapat menyampaikan pendapatnya melalui [email protected]. Semoga courseware ini dapat memberikan manfaat bagi seluruh Civitas Akademika Politeknik Telkom dalam memahami materi perkuliahan di Politeknik Telkom. Amin. Wassalamualaikum Wr. Wb. Bandung, September 2009
iii
Politeknik Telkom
DAFTAR ISI
KATA PENGANTAR ............................................................... iii DAFTAR ISI .............................................................................. iv 1 PENGANTAR DASAR DATABASE ..................... 1 1.1 Definisi ............................................................................. 2 1.2 Komponen Sistem Basis Data .......................................... 2 1.3 Sistem Basis Data dan Sistem File ................................... 2 1.4 Abstraksi Data .................................................................. 4 1.5 Database Administrator .................................................... 4 1.6 Struktur Sistem ................................................................. 5 1.7 Bahasa Basis Data ............................................................ 7 1.7.1 Data Definition Language (DDL) .................................... 7 1.7.2 Data Manipulation Language (DML) ............................ 10 1.8 JURNAL Studi Kasus Toko Buku ................................. 16 2 PENGANTAR DASAR DATABASE 2 ................ 19 2.1 Fungsi-fungsi pada SQL ................................................ 20 2.2 JURNAL ........................................................................ 35 3 INSTALASI ORACLE ........................................... 36 3.1 Pendahuluan ................................................................... 37 3.2 Hal-hal yang perlu diperhatikan sebelum proses instalasi ........................................................................................ 37 3.3 Langkah-langkah instalasi .............................................. 40 3.4 JURNAL ........................................................................ 45 4 PENGENALAN PL/SQL DAN TIPE DATA ....... 46 4.1 Pendahuluan ................................................................... 47 4.2 Variabel dan Tipe Data .................................................. 47 4.2.1 Deklarasi Variabel dan Tipe Data .................................. 47 4.2.2 Pendeklarasian Konstanta .............................................. 50 4.3 Struktur Blok PL/SQL.................................................... 53 4.4 Struktur Kondisional ...................................................... 55 4.5 Struktur Iterasi ................................................................ 56 5 CURSOR ................................................................. 67
iv User, Privilege dan Role
Politeknik Telkom
5.1 Cursor Implisit ............................................................... 68 5.2 Cursor Eksplisit .............................................................. 71 5.3 JURNAL ........................................................................ 78 6 ERROR HANDLING.............................................. 80 6.1 ERROR HANDLING (EXCEPTION) .......................... 81 6.2 Cara Kerja EXCEPTION ............................................... 81 6.3 User Defined EXCEPTION ........................................... 84 6.4 Unhandled EXCEPTION ............................................... 85 6.5 Menggunakan RAISE_APPLICATION_ERROR ......... 86 6.6 EXCEPTION INIT PRAGMA ...................................... 87 6.7 JURNAL ........................................................................ 88 7 STORED PROGRAM............................................. 89 7.1 Procedure........................................................................ 90 7.1.1 Non Nested Procedure.................................................... 90 7.1.2 Nested Procedure ........................................................... 92 7.1.3 JENIS-JENIS PROCEDURE PADA ORACLE : .......... 92 7.2 Function.......................................................................... 95 7.2.1 Non Nested Function...................................................... 96 7.2.2 Nested Function ............................................................. 98 7.3 Jurnal ............................................................................ 102 8 TRIGGER .............................................................. 106 8.1 Definisi ......................................................................... 107 8.2 Manfaat ........................................................................ 107 8.3 Batasan ......................................................................... 107 8.4 Struktur Dasar Trigger ................................................. 108 8.5 Jenis-jenis Trigger ........................................................ 110 8.6 Cascading Trigger ........................................................ 114 8.7 Status Trigger ............................................................... 115 8.8 JURNAL ...................................................................... 116 9 INDEX, VIEW dan SEQUENCE ........................ 117 9.1 INDEX ......................................................................... 118 9.1.1 Membuat Index (CREATE INDEX) ............................ 118 9.1.2 Memodifikasi Index (CREATE INDEX) ..................... 118
v
Politeknik Telkom
9.1.3 Mengubah Nama Index ................................................ 119 9.1.4 Menghapus Index (CREATE INDEX) ........................ 119 9.2 Segmen Index ............................................................... 119 9.3 Menentukan Indeks ...................................................... 121 9.3.1 Ekspresi Tunggal .......................................................... 122 9.3.2 Ekspresi Gabungan....................................................... 122 9.4 Jenis-jenis Indeks ......................................................... 122 9.5 Menghindari Duplikasi Data ........................................ 125 9.6 Keputusan Rebuild Indeks ........................................... 126 9.6.1 Rebuild Indeks Online.................................................. 127 9.7 Keputusan Mengubah Indeks ....................................... 127 9.8 Sumber informasi ......................................................... 128 9.9 Partisi Indeks ................................................................ 129 9.9.1 Indeks Global ............................................................... 130 9.9.2 Indeks Lokal ................................................................. 130 9.10 Mengidentifikasi Indeks Unused .................................. 131 9.11 VIEW ........................................................................... 133 9.11.1 Membuat View (CREATE VIEW) ..................... 134 9.11.2 Memodifikasi View (ALTER VIEW) ................. 135 9.11.3 Menghapus View (DROP VIEW) ....................... 135 9.12 SEQUENCE ................................................................. 143 9.12.1 Membuat Sequence (CREATE SEQUENCE) .... 143 9.12.2 Memodifikasi Sequence (ALTER SEQUENCE) 144 9.12.3 Menghapus Sequence (DROP SEQUENCE)...... 144 9.13 JURNAL ...................................................................... 145 10 SIMPLE REPORT ................................................. 146 10.1 Mengatur Dimensi Halaman ........................................ 147 10.1.1 Menggunakan BREAK ....................................... 148 10.1.2 Melakukan Kalkulasi dengan COMPUTE .......... 150 10.1.3 Perintah COLUMN Untuk Memformat Kolom .. 153 10.1.4 Memberi Judul pada Halaman ............................ 158 10.1.5 Menambahkan Tanggal ....................................... 160 10.2 Menyimpan dan Mencetak Laporan ............................. 161
vi User, Privilege dan Role
Politeknik Telkom
10.3 Menciptakan output HTML dengan SQL * Plus ......... 165 10.4 JURNAL ...................................................................... 169 11 USER, PRIVILEGE dan ROLE ............................ 170 11.1 USER MANAGAMENT ............................................. 171 11.1.1 User sebagai Tipe ................................................ 171 11.1.2 User versus Schema ............................................ 171 11.1.3 User versus account............................................. 171 11.1.4 CREATE USER .................................................. 171 11.1.5 ALTER USER ..................................................... 172 11.1.6 DROP USER ....................................................... 173 11.1.7 MONITORING USER ........................................ 173 11.2 PRIVILEGES ............................................................... 174 11.2.1 Operasi-operasi ................................................... 174 11.2.2 REVOKE PRIVILEGES ..................................... 177 11.2.3 Keamanan Privilege dan Roles ........................... 178 11.3 ROLES ......................................................................... 178 11.3.1 System Defined Role........................................... 179 11.3.2 Creating Roles ..................................................... 179 11.3.3 Operasi GRANT.................................................. 179 11.3.4 Memakai Roles.................................................... 180 11.3.5 Removing Roles .................................................. 180 11.3.6 Mengubah Roles.................................................. 181 11.3.7 Membuang Roles ................................................ 181 11.4 JURNAL ...................................................................... 183 12 Backup and Recovery .......................................... 184 12.1 Konfigurasi Setting Backup dan Kebijakan ( policy ) . 186 12.2 Menentukan DBID dan DB_UNIQUE_NAME ........... 189 12.3 Melakukan Backup seluruh Database .......................... 192 12.4 Melakukan Backup database dengan Strategi Oraclesuggested ...................................................................... 196 12.5 Melakukan Recovery Database Secara Keseluruhan ... 200 12.6 Flasback Tabel ............................................................. 204 12.6.1 Enable Row Movement ....................................... 204
vii
Politeknik Telkom
12.6.2 Simulasikan User Error ....................................... 207 12.6.3 Melakukan flashback pada tabel ......................... 207 12.6.4 Flashback Drop ................................................... 211 12.7 Mengatur Backup ......................................................... 218 12.7.1 Menggunakan halaman untuk membackup database yang ada pada waktu sekarang ..................................... 219 12.7.2 Backup Crosschecking ........................................ 221 12.7.3 Menghapus backup yang expired ........................ 224 12.7.4 Menghapus Backup yang usang ( Obsolete ) ...... 226 12.7.5 Menandakan Backup menjadi tidak ada ( unavailable ) ................................................................. 228 12.7.6 Membuat Katalog untuk Backup ........................ 229 12.8 JURNAL ...................................................................... 231 13 Monitoring and Resolving Lock Conflicts ......... 232 13.1 Locks ............................................................................ 233 13.2 Locking Mechanism ..................................................... 234 13.3 Data Concurrency......................................................... 234 13.4 DML Locks .................................................................. 239 13.5 Enqueue Mechanism ( mekanisme antrian ) ................ 239 13.6 Lock Conflicts .............................................................. 240 13.7 Detecting Lock Conflicts ............................................. 242 13.8 Resolving Lock Conflicts ............................................. 245 13.9 Deadlocks ..................................................................... 246 13.10 JURNAL ................................................................ 247 14 TUNING ................................................................. 248 14.1 SQL Tuning .................................................................. 249 14.2 EXPLAIN PLAN ......................................................... 250 14.3 ANALYZE ................................................................... 251 14.4 PLAN TABLE ............................................................. 252 14.5 OPERASI ..................................................................... 254 14.6 Reviewing the Execution Plan ..................................... 257 14.7 JURNAL ...................................................................... 261
viii User, Privilege dan Role
Politeknik Telkom
Overview
Dalam kehidupan sehari-hari kita sering membahas mengenai data dan informasi. Informasi berasal dari kumpulan data yang disimpan secara terstruktur pada sebuah sistem yang dikenal dengan basis data (database). Pada bab awal ini akan dibahas tentang definisi, komponen sistem basis data, sistem file, abstraksi data, bahasa basis data, database administrator dan struktur sistem.
Tujuan
1. 2. 3.
Mahasiswa mengetahui dan mengerti konsep basis data. Mahasiswa mengetahui mengenai komponen-komponen sistem basis data. Mahasiswa mengetahui mengenai abstraksi data dan Database Language.
Politeknik Telkom
1.1 Definisi
Basis data adalah penyimpanan kumpulan informasi secara sistematik dalam sebuah komputer sehingga dapat diperiksa menggunakan suatu program komputer untuk memperoleh informasi dari basis data tersebut. Perangkat lunak yang digunakan untuk mengelola dan memanggil kueri (query) basis data disebut sistem manajemen basis data (database management system, DBMS). Sedangkan sistem adalah sebuah tatanan yang terdiri atas sejumlah komponen fungsional yang saling berhubungan dan secara bersama-sama bertujuan untuk memenuhi suatu proses pekerjaan. Sehingga bisa dikatakan bahwa sistem basis data adalah sistem yang terdiri atas kumpulan file-file yang saling berhubungan dan sekumpulan program (DBMS) yang memungkinkan beberapa pemakai dan atau program lain untuk mengakses dan memanipulasi data tersebut.
Politeknik Telkom
menyimpan data-data. Seiring dengan berkembangnya institusi, bertambahnya bagian/divisi, bertambah pula data dan aplikasi yang digunakan. Bertambahnya aplikasi, bertambah pula file-file yang dibuat. Gaya sistem pemrosesan-file tersebut menyebabkan setiap data disimpan dalam bentuk record dalam berbagai macam file, dan diperlukan aplikasi yang berbeda dalam melakukan pengambilan record dari, dan penambahan record ke dalam file. Hal ini berlaku pada masa sebelum adanya Sistem Basis Data (DBMS). Menyimpan data dalam bentuk file yang berbeda-beda, memiliki kekurangan-kekurangan: Data redundancy dan inconsistency. Dikarenakan programer yang berbeda membuat file dan aplikasi masing-masing, menyebabkan beragam format dan aplikasi yang dibuat. Bahkan, aplikasi pun dibuat menggunakan bahasa pemrograman yang berbeda-beda. Lebih jauh lagi, data atau informasi yang sama bisa terdapat dalam beberapa file yang berbeda. Ini yang disebut dengan redundancy. Redundancy data ini lama kelamaan akan menyebabkan inconsystency dari data. Kesulitan dalam pengaksesan data. Dikarenakan setiap aplikasi memiliki file tersendiri untuk penyimpanan dan pengambilan data, maka jika suatu bagian dari institusi membutuhkan data dari bagian lain, akan menemui kesulitan. Hal ini dikarenakan aplikasi yang dimiliki bagian tersebut, tidak dapat membaca file yang terdapat di bagian lain. Isolasi data. Dikarenakan data tersebar dalam berbagai macam file, dan file tersebut dalam beragam format, pembuatan aplikasi baru akan terasa sulit ketika harus membaca format dari masing-masing file tersebut. Masalah integritas. Data yang disimpan harus memenuhi hal yang dinamakan dengan consistency constraint. Jika sebuah constraint berubah, maka seluruh aplikasi yang digunakan harus mengakomodasinya. Masalah akan muncul, jika constraint melibatkan beberapa data dari file yang berbeda-beda. Masalah keamanan. Tidak semua pengguna dari basis data dapat mengakses semua data. Hal ini akan sulit dilakukan jika menggunakan gaya penyimpanan data dalam file.
Politeknik Telkom
Politeknik Telkom
Politeknik Telkom
Komponen-komponen fungsional dari sebuah sistem basis data dibagi menjadi dua, yaitu komponen query processor dan komponen storage manager. Query processor terdiri atas: DML compiler, menerjemahkan perintah DML pada suatu query ke dalam instruksi level rendah yang dimengerti oleh mesin evaluasi query. Dengan kata lain, DML compiler berusaha mengubah suatu permintaan user menjadi bentuk yang ekivalen namun lebih efisien sekaligus juga menentukan sebuah strategi yang tepat untuk mengeksekusi query tersebut. Embedded DML precompiler, mengkonversi perintah DML yang embed pada sebuah program aplikasi ke procedure call yang normal dalam bahasa host. Precompiler ini harus nerinteraksi dengan DML compiler untuk menghasilkjan kode yang sesuai. DDL interpreter, menginterpretasikan perintah DDL dan mencatatnya dalam sekumpulan tabel yang mengandung metadata. Query evaluation engine, mengeksekusi instruksi level rendah yang dihasilkan oleh DML compiler. Komponen storage manager menyediakan antarmuka antara data level rendah yang tersimpan dalam basis data dan program aplikasi serta query yang diberikan ke sistem. Yang termasuk komponen ini adalah: Manajer otorisasi dan integritas, menguji integritas dari constraint yang ada serta otoritas user untuk mengakses data. Manajer transaksi, meyakinkan basis data tetap pada kondisi konsisten (benar) saat terjadi kegagalan sistem serta meyakinkan bahawa eksekusi dari transaksi yang konkuren (terjadi bersamaan) berlangsung tanpa adanya konflik. Manajer file, mengelola alokasi ruang pada disk penyimpanan struktur data yang digunakan untuk mewakili informasi yang disimpan pada disk. Manajer buffer, bertanggung jawab untuk mengambil data dari disk penyimpanan ke dalam memori utama serta menetukan data yang mana yang akan ditempatkan di memory
Politeknik Telkom
Politeknik Telkom
Keterangan : nama_field1, nama_field2 adalah nama kolom (field) yang akan ada di dalam tabel. tipe_data adalah tipe data yang bisa ditampung oleh field. tipe_constraint adalah batasan yang menentukan suatu field. Tanda [ ] menyatakan bahwa yang didalamnya boleh ada atau tidak. Macam macam tipe constraint yang mungkin adalah : NULL atau NOT NULL Constraint NOT NULL ini berfungsi untuk menjamin field harus diisi sedangkan constraint NULL memperbolehkan suatu field untuk dikosongi UNIQUE Constraint ini berfungsi untuk menjamin bahwa nilai pada setiap record di dalam sebuah tabel adalah unik PRIMARY KEY FOREIGN KEY CHECK Constraint ini berfungsi untuk menjamin bahwa nilai yang akan dimasukkan ke dalam sebuah field sudah sesuai dengan aturan yang dibuat Contoh : pembuatan tabel mahasiswa dengan atribut nim bertipe char(9) dan nama bertipe varchar(20) yang tidak boleh kosong. Sintaks : CREATE TABLE mahasiswa ( Nim char(9), Nama varchar(20) not null, CONSTRAINT pk_mhs PRIMARY KEY (Nim) );
Memanipulasi tabel (ALTER TABLE) Sebuah struktur tabel yang sudah didefinisikan dapat dimodifikasi dengan menggunakan perintah ALTER TABLE. Ada beberapa jenis modifikasi pada tabel :
Politeknik Telkom
1.
Menambahkan constraint baru untuk sebuah tabel Query : ALTER TABLE nama_tabel ADD CONSTRAINT nama_constraint_baru (definisi_constraint); Contoh : (misal pada tabel mahasiswa belum ada primary key) SQL > ALTER TABLE mahasiswa ADD CONSTRAINT pk_mhs PRIMARY KEY (Nim);
2.
Menghapus sebuah constraint di dalam tabel. Query : ALTER TABLE nama_tabel DROP CONSTRAINT nama_constraint; Contoh : SQL > ALTER TABLE mahasiswa DROP CONSTRAINT pk_ mhs;
3.
Manambahkan field baru pada sebuah tabel. Query : ALTER TABLE nama_tabel ADD(nama_field tipe_data [definisi_konstraint]); Contoh : SQL > ALTER TABLE mahasiswa ADD(alamat varchar(50) NOT NULL);
4.
Mengubah definisi field yang telah ada pada sebuah tabel. Query : ALTER TABLE nama_tabel MODIFY(nama_field tipe_field definisi_konstraint); Contoh : SQL > ALTER TABLE mahasiswa MODIFY(alamat varchar(25) not null);
Politeknik Telkom
Menghapus tabel (DROP TABLE) Query untuk menghapus tabel (drop table) adalah : DROP TABLE nama_table [CASCADE CONSTRAINT]; CASCADE CONSTRAINT : akan menghapus semua constraint yang terhubung dengan tabel yang dihapus. Contoh : SQL > DROP TABLE buku;
Perlu diperhatikan bahwa nama_field1, nama_field2, dapat dihilangkan. Hal ini dapat dilakukan bila nilai yang dimasukkan user,
10 User, Privilege dan Role
Politeknik Telkom
urutan sesuai dengan urutan field di dalam tabel tersebut, dan jumlah nilai yang dimasukkan juga harus sama dengan jumlah field pada tabel. Selain itu, proses penyisipan juga harus mematuhi aturan constraint yang telah didefinisikan pada sebuah tabel Contoh : insert into mahasiswa values('30108001', 'paijo', 'skp'); atau insert into mahasiswa (nim,nama,alamat) values('30108001', 'paijo', 'skp'); UPDATE RECORD Setiap nilai record yang telah disimpan di dalam tabel dapat dimodifikasi kembali berdasarkan kondisi tertentu. Jika kondisi tidak didefinisikan, maka nilai semua record akan terupdate Query :
UPDATE nama_tabel SET nama_field1 = nilai_baru1, nama_field2 = nilai_baru2, . [WHERE kondisi];
Contoh : SQL > update mahasiswa set nama = 'paimin', alamat = 'skb' where nim = '30108001'; DELETE RECORD Record yang telah disimpan di dalam sebuah tabel dapat dihapus berdasarkan kondisi tertentu. Jika kondisi untuk menghapus tidak didefinisikan maka seluruh record pada tabel tersebut akan dihapus. Query : DELETE nama_tabel [WHERE kondisi];
11
Politeknik Telkom
Contoh : SQL > delete mahasiswa where nim = '30108001'; (menghapus sebuah record pada tabel mahasiswa dimana nimnya 30108001) SQL > delete mahasiswa; (menghapus semua record pada table mahasiswa) Select Statement Statement SELECT digunakan untuk mengambil record dari sebuah tabel atau lebih. Record yang diambil dengan SELECT dapat disaring dengan menggunakan kondisi yang terdefinisi. Statement SELECT mempunyai format sebagai berikut :
SELECT [DISTINCT | ALL] FROM nama_tabel [WHERE kondisi1] [GROUP BY nama_field] [HAVING kondisi2] [ORDER BY nama_field [ASC | DSC]]; * | nama_field 1, nama_field 2,
DISTINCT digunakan untuk mengambil record yang nilainya tidak ganda. FROM digunakan untuk mendefinisikan tabel yang menjadi sumber data dari suatu perintah SELECT. WHERE digunakan untuk mendefinisikan kondisi pengambilan data pada tabel yang disebutkan di klausa FROM. GROUP BY digunakan untuk mengelompokkan baris baris data berdasarkan ekspresi group group tertentu yaitu untuk field tertentu. HAVING digunakan untuk memilih / mendefinisikan kriteria kelompok group yang akan ditampilkan berdasarkan group yang akan dibuat. Penggunaa klausa HAVING dipakai sebagai pengganti klausa WHERE pada GROUP BY. ORDER BY digunakan untuk mengurutkan seleksi berdasarkan kondisi yang diinginkan.
12 User, Privilege dan Role
Politeknik Telkom
ASC (ascending) berarti pengurutan menaik 1, 2, 3, 4 . DSC (descending) berarti pengurutan menurun 10, 7, 4, 2, . Untuk mengambil semua field pada setiap record, maka ganti semua nama field menjadi tanda bintang * (tanpa tanda kutip) SELECT * FROM nama_tabel [WHERE kondisi]; Contoh : SELECT * FROM mahasiswa; Untuk mengambil record yang memenuhi kondisi tertentu maka statement SELECT digabung dengan klausa WHERE. Format WHERE : WHERE nama_field operator_kondisional nilai Operator kondisional yang diganakan adalah :
Operator = <>, !=, ^= > < >= <= BETWEEN AND IN LIKE IS NULL Arti Sama dengan Tidak sama dengan Lebih besar Lebih kecil Lebih besar atau sama dengan Lebih kecil atau sama dengan Mengambil nilai yang berada pada antara 2 buah bilangan. Mengetes nilai nilai pada list yang disepsifikasikan Menyocokkan sebuah pola karekter Apakah sebuah nilai null?
Untuk menggabungkan beberapa kondisi didalam klausa WHERE, maka digunakan operator boolean AND, OR, dan NOT. AND : apabila setiap kondisi harus dipenuhi. OR : apabila cukup salah satu kondisi yang terpenuhi. NOT : apabila merupakan kebalikan / negasi dari kondisi yang dipenuhi. Contoh : Select * from mahasiswa where nama not paimen;
13
Politeknik Telkom
BETWEEN AND Untuk mengambil record dengan nilai field berada pada batas tertentu, maka digunakan statement BETWEEN atau NOT BETWEEN. Statement ini bergabung menjadi satu dengan klausa WHERE.
WHERE nama_field BETWEEN nilai_awal AND nilai_akhir
IN dan NOT IN Untuk menampilkan record yang nilai fieldnya berada pada suatu kelompok nilai tertentu maka gunakan statement : IN atau NOT IN yang dipakai bersama klausa WHERE
WHERE nama_field IN (nilai1, nilai2, nilai3, ) WHERE nama_field NOT IN (nilai1, nilai2, nilai3, )
Untuk menampilkan record yang nilai fieldnya mengandung nilai tertentu, digunakan statement LIKE atau NOT LIKE yang diletakkan pada klausa WHERE. Pola adalah karekter atau string, yang dapat dipadukan dengan dua macam wild character, yaitu : % : mewakili 0,1 atau beberapa karakter _ : mewakili tempat sebuah karakter. Contoh : 1. %JO% String yang sesuai dengan %JO% adalah : JOHAN, IJO, PAIJO, JOJON
14
Politeknik Telkom
2. _ELO_ String yang sesuai dengan _ELO_ adalah : BELOK, KELOK, BELON Field yang dapat menggunakan statement LIKE atau NOT LIKE adalah field yang bertipe Char, Varchar, atau Varchar2. IS NULL dan IS NOT NULL
WHERE nama_field IS NULL; WHERE nama_field IS NOT NULL;
Salah satu kegunaan nilai NULL adalah untuk merepresentasikan sebuah nilai yang belum ada. Dalam hal ini nilai field untuk sebuah record belum terisi. Sebuah nilai NULL tidak idektik dengan spasi atau 0. Untuk menampilkan record yang mempunyai nilai field NULL atau tidak, gunakan statement IS NULL atau IS NOT NULL yang dimasukkan dalam statement WHERE OPERATOR ARITMATIKA Ada kemungkinan, pada saat menampilkan nilai, kita ingin memodifikasi nilai yang ingin ditampilkan, misalnya kita ingin menampilkan harga barang, namun harga barang tersebut ditambah 500. Untuk memodifikasi nilai tersebut kita gunakan operator aritmatika yang diletakkan pada klausa SELECT.
SELECT nama_field1 operator nilai_tambahan, FROM nama_tabel [WHERE kondisi];
Operator yang digunakan adalah : *, /, +, dan Field yang bisa menggunakan operator ini harus bertipe numerik, date? Contoh : SQL > SELECT nim, spp + 50000 FROM keuangan;
15
Politeknik Telkom
No_telp
supplier
1
jml_beli no_faktur supply Jml_jual
n
punya
jenis
Id_jenis
buku
n
punya
transaksi
m n
ditangani
1
stock
pengarang
pegawai
harga
16
Politeknik Telkom
1. 2.
Berdasarkan ER Diagram diatas buatlah Data Definition Language (DDL)? Masukkan data-data berikut ke tabel jenis !
ID JENIS AG AK BH BI EK FL FI IT KATEGORI Agama Akuntansi Bahasa Biologi Ekonomi Filsafat Fisika Komputer dan Internet Manajemen Umum
MN UM
3.
ID SUPPLIER SP-001
17
Politeknik Telkom
4.
ID BUKU
JUDUL 10 Langkah Belajar Logika & Algoritma Meng. Bahasa C & C++ 10 Mp.Lotus Notes 4.5 Kamus Bahasa Inggris 101 Tip & Trik Adobe Photoshop Cs 101 Tip & Trik Belajar Anatomi Manusia 101 Tip & Trik Ms Access Project 2003 & Sql Server 2000 Konsep-konsep Marketing RENUNGAN JUM'AT 11 Langkah Menjadi Sahabat Ana 12 Kreasi Logo Dengan Adobe Illustrator Cs2
PENGARANG
HARGA
STOCK
BK-001
IT
SP-002
Ema Utami
Rp27.375
10
BK-002
IT
SP-001
Rp9.180
34
BK-003
BH
SP-004
Rp15.980
65
BK-004
IT
SP-001
Gregorius Agung
Rp16.830
26
BK-005
BI
SP-001
Gregorius Agung
Rp19.380
84
BK-006
IT
SP-002
Hengky Alexander M.
Rp16.830
36
BK-007
MN
SP-002
Rp12.580
26
BK-008
AG
SP-004
Rp31.280
BK-009
UM
SP-003
V. Dwiyani
Rp19.380
BK-010
IT
SP-002
Jubilee Enterprise
Rp27.880
88
BK-011
UM
SP-004
R. Herry Prasetyo
Rp16.830
25
18
Politeknik Telkom
Overview
Pengambilan data dari database dijalankan melalui sebuah queri atau select statement. Fungsionalitas - fungsionalitas dalam pembuatan queri ini sangat beragam dalam rangka membentuk informasi yang sesuai dengan keinginan developer.
Tujuan
4. 5. 6.
Mahasiswa dapat menggunakan fungsi fungsi untuk queri dengan menggunakan SQL * Plus. Mahasiswa dapat melakukan join terhadap beberapa tabel. Mahasiswa dapat membuat query bersarang dengan menggunakan SQL *Plus.
19
Politeknik Telkom
Politeknik Telkom
SQL > SELECT MAX(donasi) Donasi Terbesar FROM keuangan; Donasi Terbesar : merupakan alias dari hasil fungsi MAX(donasi) Queri diatas digunakan untuk menampilkan nilai donasi yang paling besar di dalam tabel keuangan. MIN (Minimum) MIN berfungsi untuk mengambil nilai minimum yang terdapat pada sekumpulan nilai pada sebuah field. Contoh : SQL > SELECT MIN(donasi) Donasi Terkecil FROM keuangan; Donasi Terkecil : merupakan alias dari hasil fungsi MIN(donasi) Queri diatas digunakan untuk menampilkan nilai donasi yang paling kecil di dalam tabel keuangan. SUM (jumlah / sigma) SUM berfungsi untuk menghitung jumlah total nilai pada sebuah kolom tertentu. Contoh : SQL > SELECT SUM(donasi) Total donasi FROM keuangan; Queri diatas digunakan untuk menampilkan total jumlah donasi untuk seluruh mahasiswa pada tabel keuangan. COUNT (banyak record) COUNT berfungsi untuk menghitung jumlah record yang memenuhi kondisi tertentu. Contoh : SQL > SELECT COUNT(*) Donasi Manajemen Informatika FROM keuangan WHERE nim like 3010%;
21
Politeknik Telkom
Queri diatas digunakan untuk menampilkan jumlah mahasiswa Manajemen Informatika yang memberikan donasi. Built-In Function Oracle Built-In Function adalah fungsi yang disediakan oleh Oracle agar dapat digunakan di dalam SQL *Plus maupun oleh program eksternal. Fungsi ini terdiri dari beberapa kelompok, yaitu : Fungsi Aritmatika Fungsi Kegunaan ABS Mengembalikan nilai absolute CEIL Mengembalikan bilangan bulat terbesar EXP Mengembalikan nilai pemangkatan bilangan natural (ex) FLOOR Mengembalikan bilangan bulat terkecil LN Mengembalikan nilai logaritma natural LOG Mengembalikan nilai logaritma MOD Menghasilkan sisa pembagian POWER Mengembalikan nilai pangkat ROUND Mengembalikan bilangan pembulatan SIGN Mengembalikan nilai positif, negative, atau nol. Nilai balikan sign ada tiga yaitu 1 jika x>0 0 jika x=0 -1 jika x<0
22
Contoh ABS(-10) = 10 CEIL(4.2) = 5 CEIL(-4.2) = -4 EXP(0) = 1 EXP(1) = 2.718 FLOOR(4.2) = 4 FLOOR(-4.2) = -5 LN(2) = 0.693147181 LOG(10,10) =1 MOD(4,2) = 0 MOD(7,2) = 1 POWER(2,3) = 8 ROUND(5.56,1) = 5.6 SIGN(-6) = -1 SIGN(3) = 1
Politeknik Telkom
Fungsi trigonometri Mengembalikan nilai akar Mengembalikan nilai yang telah dipotong
Fungsi Karakter / String Fungsi Kegunaan ASCII(karakter) Memgembalikan nilai ASCII dari karakter CHR(nilai_ASCII) Memgembalikan karakter dari sebuah nilai ASCII CONCAT(teks1, Menggabungkan teks2) teks1 dan teks2 DECODE(field, kode_decode) Menggantikan nilai yang terdapat di dalam field dengan nilai lain.
Contoh ASCI(A) = 65 CHR(65) = A CONCAT (sate, ayam) = sate ayam DECODE(bulan,1, Januari, 2,Februari, 3,Maret, 4,April, 5,Mei, 6,Juni, Bulan Lain ) bulan GREATEST (3,10,15,4) = 15 INITCAP(pOLItek Nik tElkoM) = Politeknik Telkom INSTR (SQL n PL/SQL, SQL) = 1
23
Mengembalikan nilai terbesar dari sederetan nilai Mengembalikan string yang terdiri dari huruf kapital pada setiap kata. Mencari posisi teks2 yang terdapat di dalam teks1.
Politeknik Telkom
INSTR(teks1, teks2, i) INSTR(teks1, teks2, 1, n) LEAST(nila1, nilai2, nilai3,) LENGTH(String) LOWER(String) LPAD (teks1, n , teks2)
Pencarian dapat dimulai dari posisi ke-i. n menyatakan pengulangan yang ken kali dari teks2 yang terdapat di dalam teks1. Mengembalikan nilai terkecil dari sederetan nilai Mengembalikan panjang String Mengubah String menjadi huruf kecil semuanya Menyisipkan karakter teks2 ke dalam teks1 untuk karakter kosong sepanjang n disebelah kiri teks1 Menghapus karakterkarakter pada bagian kiri teks1 sehingga tidak diawali dengan sembarang karakter pada teks2. Default teks2 adalah spasi Menggantikan kemunculan karakter teks2 di dalam teks1 dengan teks3. Bila teks3 tidak disebutkan maka teks2 pada teks1 akan dihapus karena default teks3 null
INSTR (SQL n PL/SQL, SQL, 4) = 10 INSTR (SQL n PL/SQL, SQL,1,2) = 10 LEAST(2,2,5,1,6) =1 LENGTH(1233) =4 LOWER (PoLTeK) = poltek LPAD (Oracle, 10 , /) = ////Oracle
24
Politeknik Telkom
SUBSTR(Teks,i) SUBSTR(Teks, i, n)
UPER(String)
Menyisipkan karakter teks2 ke dalam teks1 untuk karakter kosong sepanjang n disebelah kanan teks1 Menghapus karakterkarakter pada bagian kanan teks1 sehingga tidak diakhiri dengan sembarang karakter pada teks2. Default teks2 adalah spasi Mengambil karakter pada string teks dimulai dari posisi ke-i (dari kiri ke kanan) sebanyak n buah. Jika i bernilai negatif, maka posisi ke-i dimulai dari kanan ke kiri Menggantikan kemunculan karakter teks2 di dalam teks1 dengan teks3. perbedaannya dengan REPLACE adalah karakter yang digantikan dilakukan secara individual Mengubah String menjadi huruf besar semuanya
UPER(PoLTeK) = POLTEK
25
Politeknik Telkom
Contoh sysdate =06-JUL-05 ADD_MONTHS (sysdate, 2) = 08-JUL-05 ADD_MONTHS (sysdate, -2) = 04-JUL-05 LAST_DAY (sysdate) = 31-JUL-05 MONTHS_BETW EEN (01-JUL-05, 14-MAR-05) = 3.58064516129032 NEXT_DAY() = 07-JUL-05 TO_CHAR (sysdate, DD-MM-YYYY) = 06-07-2006
Menghasilkan tanggal terakhir pada sebuah bulan Mengahsilkan selisih tanggal2 dan tanggal1 dalam satuan bulan
Mengembalikan tanggal berikutnya Mengubah tanggal menjadi bentuk karakter sesuai dengan format. Sehingga dapat ditampilkan sebagai string
26
Politeknik Telkom
Join Tabel
JOIN adalah menggabungkan beberapa tabel dangan cara mengakses setiap tabel secara individu berdasarkan kondisi yang diberikan, kemudian hasilnya digabungkan. Syarat penggunaan JOIN adalah harus terdapat hubungan / keterkaitan diantara tabel tabel yang dijadikan sumber dari kolom kolom yang hendak di join dan ditampilkan. Keterkaitan diatara tabel tabel berupa kolom kolom yang memiliki nilai dan tipe data yang sama. Join dimungkinkan dikarenakan oleh model relasional, begitu juga sebaliknya, join dibutuhkan dikarenakan model relational. Join sebetulnya secara umum terbagi dalam 3 jenis: cartesian product, join condition dan outer join. Cartessian Product Cartessian product merupakan himpunan dari hasil kombinasi yang memungkinkan dari baris-baris data dari 2 tabel atau lebih. Cartessian product merupakan join tanpa menggunakan join condition. Dengan demikian, sebuah baris pada tabel yang satu akan digabungkan dengan semua baris pada tabel yang lain, seterusnya sehingga jumlah baris hasil query menjadi ( n1* n2 *...*nn ) dengan ni adalah jumlah baris pada tabel ke-i. Jumlah baris hasil query yang merupakan hasil perkalian dari jumlah baris dari tabel-tabel inilah yang disebut dengan produk kartesian (cartesian product). Contoh : Misalkan ilustrasi sebagai berikut Tabel A A1 1 2 A2 10 100 Tabel B B1 2 3 B2 4 9
Jika kita melakukan operasi seperti ini: SELECT * FROM A, B; maka akan dihasilkan Cartesian Product.
27
Politeknik Telkom
A1 1 1 2 2
Untuk menghindari hal seperti ini, paling tidak terdapat sebuah join condition pada query yang melakukan join terhadap kedua tabel tersebut dengan catatan join condition tersebut valid. Join Condition Join condition menspesifikasikan kondisi join dari beberapa tabel. Seperti telah disinggung sebelumnya, join biasanya selalu melibatkan kolom-kolom yang terdapat pada tabel yang terlibat join yang memiliki kesamaan dan keserupaan maksud representasi dari kolom tersebut. Equjoin/simple join/inner join adalah join yang menggunakan operator sama dengan (=) pada join condition-nya. Contoh : Misalnya jika kita melakukan operasi SELECT * FROM A, B WHERE A.A1 = B.B1 Maka akan dihasilkan sbb: A1 A2 2 100
B1 2
B2 4
Dari hasil operasi join tersebut dapat terlihat bahwa hanya nilai-nilai dari field A1 pada tabel A dan nilai-nilai field B1 pada tabel B yang bersesuaian yang ditampilkan. Dalam skenario ini adalah A1=B1=2. Non-Equjoin adalah sebuah join yang menggunakan join condition yang berisi operator selain sama dengan (=) misalnya operator BETWEEN...AND Self Join adalah query yang menggabungkan sebuah tabel dengan dirinya sendiri. Tabel tersebut muncul dua kali pada klausa from dan
28 User, Privilege dan Role
Politeknik Telkom
masing-masing harus diikuti dengan nama aliasnya. Penggunaan tabel alias ini wajib dilakukan untuk menghindari ambiguous karena semua nama kolom pada tabel pertama ada juga pada tabel kedua. Contoh: Misalkan terdapat tabel C sebagai berikut Tabel C C1 C2 C3 C4 1 1 2 2 10 10 100 100 2 3 2 3 4 9 4 9
Jika dilakukan perintah: SELECT a.C1,a.C2,a.C3,a.C4 FROM C a, C b WHERE a.C1=b.C3 Dari skenario ini dapat dibayangkan kita memiliki dua buah tabel yang identik yaitu tabel alias a dan tabel alias b. Dimana operasi yang dilakukan dapat digambarkan sebagai berikut: Tabel C C1 1 1 2 2 Tabel Alias a C1 1 1 2 2 C2 10 10 100 100 C3 2 3 2 3 C4 4 9 4 9 C1 1 1 2 2 C2 10 10 100 100 C2 10 10 100 100 C3 2 3 2 3 C4 4 9 4 9 Tabel Alias b C3 2 3 2 3 C4 4 9 4 9
29
Politeknik Telkom
C3 2 3 2 3
C4 4 9 4 9
Outer Join Outer join biasanya digunakan ketika kita ingin baris data dari tabel yang pertama, atau dari tabel yang kedua atau dari keduanya tetap ditampilkan meskipun tidak terdapat pasangan baris data tersebut dari tabel lain pada kondisi join-nya. Misalkan tabel A di-join dengan tabel B. Semua baris data pada tabel A ingin ditampilkan walaupun tidak memenuhi join condition. Untuk itu, operator outer join (+) pada join condition harus disertakan setelah kolom-kolom tabel B. Penulisan operator join dapat ditulis sebagai berikut. A.col_name = B.col_name(+) Dalam hal ini, tabel B akan memberikan nilai NULL untuk setiap baris pada tabel A jika join condition tidak terpenuhi. Contoh : Misalnya jika kita melakukan operasi SELECT * FROM A, B WHERE A.A1 = B.B1(+) maka akan dihasilkan A1 A2 B1 B2 1 2 10 100 NULL 2 NULL 4
Pada outer join ada beberapa aturan yang perlu diperhatikan : Operator + hanya boleh ada pada klausa WHERE dan hanya dapat dikenakan pada kolom dari tabel atau view.
30
Politeknik Telkom
Jika terdapat lebih dari satu join condition, operator + harus dikenakan pada semua join condition tersebut. Jika tidak, hasilnya dengan inner join. Jika ada kondisi yang mengandung kolom tabel B dan kolom tersebut dibandingkan dengan sebuah nilai konstan, operator + haru s dikenakan pada kolom tersebut. Misalkan: SELECT * FROM A, B WHERE A.A1 = B.B1(+) and B.B1(+) > 0; Kondisi yang mengandung operator + tidak boleh dikombinasikan dengan logika OR dan IN. Kolom dengan operator + tidak boleh dibandingkan dengan hasil subquery. Misalkan: SELECT * FROM A, B WHERE A.A1 = B.B1(+) and B.B1(+) > (SELECT C4 FROM C WHERE C4=2); Untuk query yang menggunakan outer join dan melibatkan lebih dari dua tabel, misalnya tabel A, B, dan C, maka tabel yang satu hanya dapat men-generate tabel NULL untuk satu tabel. Dengan demikian, operator + tidak dapat dikenakan pada kolom tabel B untuk dua buah join condition: A join B dan C join B. Misalkan: SELECT * FROM A, B WHERE A.A1 = B.B1(+) and C.C1=B.B1(+) ; Kesimpulan: Operasi join digunakan untuk menampilkan data dari beberapa tabel. Ada beberapa macam operasi join, antara lain : Operator Join Cartesian Product
Deskripsi Menampilkan data dari beberapa tabel tanpa kondisi tertentu. Menampilkan data dari beberapa tabel dengan kondisi tertentu Menampilkan data dari beberapa tabel
Contoh SELECT NAMA_PEGAWAI, NAMA_DEPARTEMEN FROM PEGAWAI P, DEPARTEMEN D SELECT NAMA_PEGAWAI, NAMA_DEPARTEMEN FROM PEGAWAI P, DEPARTEMEN D WHERE P.NO_DEP= D.NO_DEPARTEMEN; SELECT P. NAMA_PEGAWAI, M. NAMA_PEGAWAI AS
31
Join Condition
Outer Join
Politeknik Telkom
Query Bersarang
Pada kondisi tertentu, terkadang beberapa query membutuhkan nilai yang dihasilkannya dan digunakan sebagai kondisi pembandingan (dalam klausa WHERE sebagai contoh). Query tersebut dapat diformulasikan menggunakan nested query (query bersarang). Query bersarang akan melibatkan query dan subquery. Subquery merupakan statement SELECT yang bersarang didalam klausa WHERE dari statement SELECT yang lain. Meskipun jarang, tetapi subquery juga bisa terdapat pada statement DML yang lain seperti INSERT, UPDATE ataupun DELETE. Secara umum, sintaks dari NESTED QUERY adalah: SELECT [DISTINCT] select_list FROM table1, table_2 [,table_3 ] WHERE {expression {[NOT] IN | comparison operator} | [NOT] EXIST } ( SELECT [DISTINCT] subquery_select_list FROM table_list WHERE search_conditions ) Yang dilakukan oleh subquery adalah menetapkan kondisi pencarian pada klausa WHERE dalam beberapa cara: Menghasilkan list untuk klausa IN Mengembalikan sebuah nilai yang dapat digunakan oleh operator Mengembalikan nilai boolean (true atau false)
32
Politeknik Telkom
Didalam sebuah SELECT statement, subquery boleh berada pada klausaklausa berikut ini: Klausa WHERE Klausa HAVING Klausa FROM Klausa START WITH (pada query hirarki) Sebagai catatan, subquery pada klausa WHERE sering disebut sebagai nested subquery. Sedangkan subquery pada klausa FROM sering disebut dengan istilah inline view. Banyak permasalahan yang dapat dipecahkan dengan menggunakan subquery. Daftar berikut ini menunjukkan beberapa kegunaan subquery: Memberikan nilai sebagai kondisi di dalam klausa WHERE, HAVING, dan START WITH (subquery pada SELECT, UPDATE, dan INSERT statement). Menentukan sekumpulan baris data untuk kebutuhan membuat view (subquery pada CREATE VIEW statement). Mendefinisikan sebuah tabel (inline view) yang digunakan oleh query utama (subquery pada klausa FROM dari sebuah SELECT statement). Menentukan sekumpulan baris data yang dimasukkan ke dalam tabel tujuan, baik ke dalam tabel yang sudah ada (subquery pada INSERT statement) maupun pada saat yang bersamaan dengan pembuatan tabel (subquery pada CREATE TABLE statement). Mendapatkan satu nilai atau lebhih yang digunakan untuk mengubah data yang sudah ada (subquery pada UPDATE statement). Klausa IN Subquery yang dilakukan menggunakan klausa IN akan dilakukan pengecekan apakah suatu nilai ada atau tidak dalam hasil dari subquery. Contoh : SELECT A1 FROM A WHERE A1 IN (SELECT C3 FROM C) Hasilnya sbb: A1 A2 2 100
33
Politeknik Telkom
Klausa ALL Membandingkan nilai dengan setiap nilai yang dikembalikan oleh query tersarang. Kondisi perbandingan akan bernilai benar jika semua nilai yang dikembalikan oleh subquery memenuhi kondisi tersebut. Contoh : SELECT * FROM A WHERE A1 < ALL(SELECT C3 FROM C) Hasilnya sbb: A1 A2 1 10 Klausa ANY/SOME Membandingkan nilai dengan salah satu nilai yang dikembalikan oleh query tersarang. Kondisi perbandingan akan bernilai benar jika salah satu nilai yang dikembalikan oleh subquery memenuhi kondisi tersebut dan akan bernilai salah atau tidak terpenuhi jika subquery tidak mengembalikan nilai apapun (tabel kosong). Contoh : SELECT * FROM A WHERE A1 < ANY(SELECT C3 FROM C) Hasilnya sbb: A1 A2 1 10 2 100 Klausa [NOT] EXISTS Klausa EXISTS digunakan untuk melakukan pengecekan apakah hasil dari nested query yang berkorelasi menghasilkan baris data atau tidak. Operator exists akan menghasilkan nilai TRUE jika subquery yang mengikutinya menghasilkan paling tidak satu baris data. Contoh : SELECT * FROM A WHERE EXISTS (SELECT C3 FROM C) Hasilnya sbb: A1 A2 1 10 2 100
34
Politeknik Telkom
2.2 JURNAL
1. 2. 3. Buatlah query untuk menampilkan data-data supplier( id supplier, nama) dan jumlah jenis buku yg disupplay oleh supplier ybs! Buatlah query untuk menampilkan data-data buku beserta nama supplier dan jenis bukunya! Jelaskan dan tuliskan output query dibawah ini, jika query tersebut salah maka buatlah query yang benar: select a.id_buku, (select kategori from jenis where id_jenis=a.id_jenis) as kategori, (select nama from jenis where id_supplier=a.id_supplier) as supplier, a.judul from buku a where stock > 50; Jelaskan dan tuliskan output query dibawah ini, jika query tersebut salah maka buatlah query yang benar: select a.id_jenis, a.kategori, sum(b.stock) from jenis a, buku b where a.id_jenis=id_supplier;
4.
35
Politeknik Telkom
INSTALASI ORACLE
Overview
Sebelum menggunakan DBMS hal pertama yang harus kita lakukan tentu saja adalah melakukan instalasi dan konfigurasi DBMS. Hal ini juga berlaku ketika kita akan menggunakan Oracle, ada beberapa hal yang harus diperhatikan baik sebelum maupun pada saat instalasi dan konfigurasi. Pada bab ini akan dibahas mengenai persyaratan dan cara instalasi dan konfigurasi oracle 10g.
Tujuan
1. 2.
Mahasiswa mengerti mengenai persyaratan sistem yang harus dipersiapkan untuk instalasi oracle. Mahasiswa memahami tetang cara konfigurasi Oracle 10g.
36
Politeknik Telkom
3.1 Pendahuluan
Secara umum, guide ini berlaku untuk semua instalasi Oracle. Di semua OS baik Windows maupun Unix (Sun Solaris, IBM AIX, HP UX, Linux, dan lainlain) proses instalasi itu sama, hanya sedikit berbeda di pre-installation requisite-nya.
Politeknik Telkom
Pilihan instalasi Database Oracle 10g : 1. Enterprise Editon : Merupakan pilihan instalasi yang membutuhkan lisensi. Selain fitur-fitur standar yang dimiliki oracle, konfigurasi database dan management tool serta fitur untuk data warehousing dan transaction processing disertakan dalam pilihan instalasi ini. Standard Edition : melakukan instalasi management tool, distribusi penuh, replikasi, fitur-fitur untuk web, dan fasilitas-fasilitas untuk membangun aplikasi. Personal Edition : melakukan instalasi fitur yang sama seperti pada Enterprise Edition tetapi hanya mendukung single user development dan deployment environment. Custom : melakukan instalasi dengan cara memilih fitur-fitur yang dibutuhkan secara manual.
2.
3.
4.
38
Politeknik Telkom
Hal-hal yang perlu diperhatikan pada saat instalasi Oracle 10g: Ketika setup meminta memasukkan password ada beberapa hal yang perlu diperhatikan antara lain: Pastikan panjang password 4 sampai dengan 30 karakter. Sertakan database character set seperti underscore( _ ), dollar ( $ ), dan pound sign ( # ) karena akan dapat memperkuat password. Jangan memulai password dengan karakter numeric Jangan menggunakan username untuk password. Jangan menggunakan istilah-istilah yang sudah ada di oracle untuk password. Jangan menggunakan password change_on_install untuk account SYS. Jangan mengunakan password manager untuk account SYSTEM. Jangan menggunakan password sysman untuk account SYSMAN. Jangan menggunakan password dbsnmp untuk account DBSNMP. Pastikan password terdiri dari punctuation mark character. karakter alphabet, numeric, dan
Jangan menggunakan kata-kata sederhana untuk password seperti welcome, account, database, user, dll. Jangan mengubah-ubah setingan Java Runtime Environment (JRE) yang digunakan oleh oracle. Jika tipe instalasi yang anda pilih mengharuskan untuk melakukan konfigurasi Database Configuration Assistant dan Oracle Net Configuration Assistant secara manual anda harus mendefinisikan secara detail mengenai konfigurasi database dan jaringan.
Instalasi Oracle
39
Politeknik Telkom
Pilih option Basic Installation Masukkan directory Oracle Home Location Pilih Installation Type Jangan pilih Create Starter Database Klik button Next
40
Politeknik Telkom
2. Oracle installer akan mengecek OS kita, apakah requirement-nya dipenuhi atau tidak. Lihat gambarnya di sini
Pastikan semua statusnya Succeeded. Kalau ada warning, atau statusnya bukan Succeed, bereskan dulu OS-nya. Kemudian klik button Next
Instalasi Oracle
41
Politeknik Telkom
3. Dalam proses installasi, Oracle akan menjalankan program java. Bila firewall PC anda memblock java, dan muncul alert Windows Security Alert, klik tombol Unblock. Lihat gambarnya di bawah ini
4. Muncul summary komponen Oracle Database 10g yang siap kita install. Kemudian klik tombol Install. Lihat gambarnya di bawah ini
42
Politeknik Telkom
5.
Instalasi Oracle
43
Politeknik Telkom
6. Setelah itu akan dilakukan konfigurasi tambahan oleh Oracle Installer. Kita cukup perhatikan saja. Setelah konfigurasi selesai, klik tombol Next. Kadang-kadang kita tidak perlu kilk tombol Next tersebut karena secara otomatis wizard menuju ke berikutnya. Lihat gambarnya di bawah ini
44
Politeknik Telkom
7. Akhirnya instalasi selesai. Setelah itu klik tombol Exit. Lihat gambarnya di bawah ini
3.4 JURNAL
1. Lakukan instalasi Oracle 10g berdasarkan langkah-langkah yang telah dijelaskan diatas, kemudian masuk ke SQL Plus dan login sebagai user SYSTEM! Jelaskan perbedaan antara Oracle 10g dan Oracle 10g XE!
2.
Instalasi Oracle
45
Politeknik Telkom
Overview
PL/SQL mengkombinasikan kemampuan manipulasi data SQL dengan kemampuan bahasa prosedural, dengan kata lain PL/SQL adalah SQL ditambah Procedural Language. PL/SQL merupakan bahasa berstruktur blok yang berupa fungsi, prosedur, dan blok anonim. Suatu blok biasanya ditujukan untuk menyelesaikan suatu tugas tertentu dan suatu blok boleh memiliki subblok (nested). Struktur blok PL/SQLitu terdiri dari bagian deklarasi, bagian kode program, dan bagian eksepsi untuk penanganan error.
Tujuan
1. Mengerti esensi penggunaan Percabangan (pemilihan/kodisional) dalam PL/SQL. 2. Mengerti esensi penggunaan Pengulangan (Looping/Iterasi) dalam PL/SQL. 3. Mengerti esensi penggunaan Sekuensial dalam PL/SQL. 4. Memahami bentuk umum Percabangan, Pengulangan dan Sekuensial. 5. Mampu memecahkan masalah sederhana dengan menggunakan Percabangan atau Pengulangan atau Sekuensial dan mengimplementasikan ke dalam PL/SQL.
46
Politeknik Telkom
4.1 Pendahuluan
Karena pada SQL tidak mendukung pemrograman secara prosedural, maka dikembangkanlah PL/SQL. PL merupakan kependekan dari Procedural Language. PL/SQL mengkombinasikan kekuatan dan kefleksibilitasan SQL dengan pemrograman prosedural. PL/SQL memiliki keistimewaan sebagai berikut: Programmer dapat mendeklarasikan variable untuk digunakan selama pemrosesan statement. Programmer dapat menggunakan penanganan kesalahan untuk mencegah kegagalan program. Programmer dapat menulis program yang interaktif yang menerima input dari user. Programmer dapat membagi fungsi-fungsi ke dalam blok-blok lojik dari kode. Teknik pemrograman secara modular ini mendukung fleksibilitas selama pengembangan aplikasi. Statement SQL dapat diproses secara simultan untuk performansi keseluruhan yang lebih baik.
47
Politeknik Telkom
Dimana ekspresi bisa merupakan literal, variabel yang lain atau sebuah ekspresi yang terdiri atas operator dan fungsi. Jika nilai inisial/awal tidak diberikan, maka suatu variabel akan diberikan nilai NULL untuk nilai inisialnya. Contoh untuk data karakter: alamat VARCHAR2(20); kodepos CHAR(5) := 40257; Contoh untuk tipe data number: gaji NUMBER(7,2); jumlah NUMBER NOT NULL := 0; Contoh untuk tipe data tanggal: alamat VARCHAR2(20); kodepos CHAR(5) := 40257; Tanda := dipakai untuk menugaskan ( assign) nilai kepada suatu variabel. Nilai inisial/awal atau disebut juga nilai default adalah nilai yang diberikan pada saat awal variabel tersebut dideklarasikan. Tipe Data pada PL/SQL Selain tipe data yang ada di Oracle SQL, PL/SQL menyediakan beberapa tambahan tipe data yang dapat dideklarasikan sebagai berikut: Tipe Data BOOLEAN DATE NUMBER [(p [,s])] Keterangan Data lojikal dengan nilai TRUE atau FALSE. Data tanggal waktu. Nilai yang valid adalah antara 1 Januari 4712 SM sampai dengan 31 Desember 9999. Tipe data numerik dengan p angka penting dan sejumlah s angka penting di belakang koma. Nilai p adalah integer dengan nilai maksimal 38 dan nilai s berada pada rentang -84 sampai dengan 127. Nilai s negatif berarti pembulatan sampai dengan 10 s terdekat. Turunan dari NUMBER. Presisi sampai dengan 38 digit. Sama dengan FLOAT. Turunan dari number. Presisi sampai dengan 18 digit. Sama dengan NUMBER [(p [,s])]. Sama dengan NUMBER [(p [,s])]. Sama dengan NUMBER [(p [,s])]. Sama dengan NUMBER [(n,0)].
User, Privilege dan Role
FLOAT DOUBLE PRECISION REAL DEC [(p [,s])] DECIMAL [( p [,s])] NUMERIC [(p [,s])] INTEGER [(n)]
48
Politeknik Telkom
INT [(n)] SMALLINT [(n)] BINARY_INTEGER NATURAL NATURALN POSITIVE POSITIVEN SIGNTYPE PLS_INTEGER VARCHAR2(n) VARCHAR(n) CHAR [(n)] STRING(n) CHARACTER [(n)] LONG [(n)] NCHAR [(n)]
NVARCHAR2(n)
RAW(n)
Sama dengan NUMBER [(n,0)]. Sama dengan NUMBER [(n,0)]. Tipe variabel ini digunakan menyimpan nilai mulai dari -2.147.483.647 s/d 2.147.483.647 Bagian dari binary integer, mampu menyimpan mulai dari 0 s/d 2.147.483.647. Bagian dari binary integer, mampu menyimpan mulai dari 0 s/d 2.147.483.647. Tipe data ini tidak boleh bernilai NULL. Bagian dari binary integer, mampu menyimpan mulai dari 1 s/d 2.147.483.647 Bilangan integer dengan rentang nilai 1 sampai dengan 2147483647. Tipe data ini tidak boleh bernilai NULL. Tipe data bilangan yang bernilai -1, 0 atau 1. Bilangan integer dengan rentang nilai -2147483647 sampai 2147483647. Data karakter dengan panjang tidak tetap. Nilai n minimum sama dengan 1 dan maksimum sama dengan 32767 byte. Sama dengan VARCHAR2(n). Data karakter dengan panjang tetap sebesar n byte. Nilai n maksimum adalah 32767. Nilai n minimum dan juga nilai default adalah 1. Sama dengan VARCHAR2(n). Sama dengan CHAR(n). Data karakter dengan panjang tidak tetap. Nilai n maksimum sama dengan 32760 byte. Data karakter dengan panjang tetap. Panjang maksimum sama dengan 32767 byte. maksimum bergantung pada national character set yang dipakai. Nilai default adalah 1. Data karakter dengan panjang tidak tetap. Panjang maksimum sama dengan 32767 byte. Nilai n maksimum bergantung pada national character set yang dipakai. Data binary dengan panjang tidak tetap. Nilai n
49
Politeknik Telkom
UROWID [(n)]
maksimum sama dengan 32767 byte. Data binary dengan panjang tidak tetap. Nilai n maksimum sama dengan 32760 byte. Identitas baris pada suatu tabel-index yang dinyatakan dengan string heksa desimal. Identitas tersebut menunjukkan posisi baris data. Tipe data ini merupakan balikan dari kolom palsu ROWID. Identitas baris pada suatu tabel-index yang dinyatakan dengan string heksa desimal. Nilai n adalah ukuran kolom UROWID. Nilai n maksimum adalah 4000 byte. Tipe data large object untuk data file. Tipe data large object untuk karakter binary. Tipe data large object untuk karakter satu byte. Tipe data large object untuk karakter multi byte. Untuk mendeklarasikan variabel dengan tipe data yang sesuai dengan suatu kolom pada suatu tabel. Untuk mendeklarasikan variabel dengan tipe data yang sesuai dengan semua kolom pada suatu tabel. Biasanya untuk menampung suatu cursor.
50
Politeknik Telkom
Atribut variabel berfungsi untuk memberikan tipe data yang sama dengan tipe data suatu kolom dari suatu tabel. Atribut variabel juga dapat digunakan untuk tipe data record. Dengan demikian, atribut variabel ada dua. Untuk atribut kolom digunakan %TYPE, sedangkan untuk atribut record gunakan %ROWTYPE. Cara penggunaannya ditunjukkan berikut ini: [schema.]table.column%TYPE; <cursor_name|[schema.]table>%ROWTYPE; Sebagai contoh, varaiabel v_nama mempunyai tipe data yang sama dengan kolom nama pada tabel pegawai. Deklarasi variabel tersebut dapat dituliskan seperti ini: v_nama mahasiswa.nama%type; Selain dapat digunakan untuk variabel record, atribut %ROWTYPE bisa dipakai pada variabel cursor. Dan untuk mengakses baris-baris pada cursor atau record tersebut digunakan format nama_var.COLUMN. Contoh: pgw_rec pgw_cur%rowtype; Menugaskan Nilai ke Dalam Variabel Sintaks: identifier := ekspresi; Dimana identifier adalah nama variabel target, atau field untuk menerima nilai dari ekspresi. Sedang ekspresi mungkin berupa literal, nama variabel lain yang sudah ada, atau suatu ekspresi yang cukup kompleks yang diperlukan untuk menentukan suatu nilai yang akan ditugaskan. Contoh: v_jumlah := 0; Operator pada PL/SQL Operator-operator SQL statement juga berlaku pada PL/SQL. Berikut ini prioritas dari semua operator tersebut ditampilkan pada tabel di bawah ini dengan prioritas yang lebih tinggi ditempatkan pada baris yang lebih atas: Operator **, NOT +, *, / +, -, || =, <, >, <=, >=, <>, !=, IS Operasi Pemangkatan dan negasi logika Tanda positif dan negatif Perkalian dan pembagian Penjumlahan., pengurangan konkatinasi Perbandingan
dan
51
Politeknik Telkom
Konjungsi inklusi
Mencetak Keluaran pada Layar SQL*Plus Untuk mencetak sebuah nilai pada layar SQL*Plus dapat digunakan procedure PUT, PUT_LINE dan NEW_LINE yang terdapat dalam package DBMS_OUTPUT. Package ini merupakan salah satu package yang telah built in pada Oracle. Procedure PUT dan PUT_LINE membutuhkan sebuah argumen berupa NUMBER, VARCHAR2 ataupun DATE. Kedua procedure tersebut akan menyimpan argumen tersebut ke dalam buffer dan akan ditampilkan di layar bila procedure tersebut dijalankan. Procedure NEW_LINE tidak membutuhkan argumen apapun. Procedure ini berfungsi untuk menyimpan karakter new line ke dalam buffer. Namun sebelum procedure tersebut dijalankan, harus dijalankan perintah SET SERVEROUTPUT ON untuk mengaktifkan pencetakan ke layar dengan menggunakan procedure yang ada pada package DBMS_OUTPUT. SET SERVEROUTPUT <ON|OFF> [SIZE n] [FOR[MAT] <WRA[PPED] | WOR[D_WAPPED] | TRU[NCATED]] Pilihan SIZE n bertujuan untuk menentukan jumlah byte maksimum yang dapat ditampung oleh buffer. Nilai n ini tidak boleh kurang dari 2000 dan tidak boleh lebih dari 1.000.000. Nilai defaultnya 2000. pilihan format bertujuan untuk menetukan format keluaran. WRAPPED akan melanjutkan bagian yang tidak mencukupi dari suatu baris ke baris yang baru. Pilihan TRUNCATE akan memotong bagian yang melampaui ukuran satu baris tepat pada karakter yang berada setelah batas maksimum baris. Ukuran satu baris, yakni jumlah karakter maksimum dalam satu baris, ditentukan oleh sistem variabel LINESIZE.
52
Politeknik Telkom
53
Politeknik Telkom
1) DECLARATION SECTION Digunakan untuk mendefinisikan atau mendeklarasikan variabel, konstanta, cursor dan seluruh exception yang didefinisikan oleh user yang akan digunakan pada bagian eksekusi. Penulisan blok ini dimulai dengan menulis DECLARE. Contoh: declare v_nama mahasiswa.nama%type; v_nim mahasiswa.nim%type;
2) EXECUTABLE SECTION Digunakan untuk mengeksekusi atau menjalankan blok perintah PL/SQL seperti pengulangan, percabangan, perintah SQL dan perintah cursor. Berisi statement SQL untuk memanipulasi data pada basis data dan statement PL/SQL untuk memanipulasi data dalam blok. Contoh: declare v_nama mahasiswa.nama%type; v_nim mahasiswa.nim%type; begin select nim, nama into v_nim, v_nama from pegawai where nim=30108001 dbms_output.put_line(v_nama); exception when no_data_found then dbms_output.put_line(gak ada); end; 3) EXCEPTION SECTION Merupakan bagian yang akan diaktifkan bila terjadi kesalahan atau pengecualian pada saat menjalankan program PL/SQL. Exception section terdiri atas predefined dan user defined. Sebagai contoh exception predefined NO_DATA_FOUND akan diaktifkan bila perintah DML SQL tidak menemukan data dalam klausa WHERE.
54 User, Privilege dan Role
Politeknik Telkom
Contoh: declare v_nama mahasiswa.nama%type; v_nim mahasiswa.nim%type; begin select nim, nama into v_nim, v_nama from pegawai where nim=30108001 dbms_output.put_line(v_nama); exception when no_data_found then dbms_output.put_line(gak ada); end;
Baris pada baris perintah dapat berupa perintah IF sehingga akan membentuk blok IF bersarang. Bagian ELSIF bisa muncul beberapa kali sesuai dengan kebutuhan sedangkan bagian ELSE biasanya dipakai untuk menangani
Pengenalan PL/SQL dan Tipe Data 55
Politeknik Telkom
kondisi jika semua kondisi pada kalang IF... THEN atau ELSIF... THEN tidak terpenuhi. Namun bagian ELSE ini bisa saja tidak digunakan. contoh: declare penuh exception; n1 number; n2 number; begin if b1>n2 then raise penuh; else dbms_ouput.put_line(bisa); end if; end;
56
Politeknik Telkom
Contoh: DECLARE x number; BEGIN x := 0; LOOP x := x + 1; EXIT WHEN x > 5; -- exit loop immediately END LOOP; dbms_output.put_line('Hasil looping : '||x); END; Bisa juga digunakan format seperti ini: IF kondisi THEN EXIT; END IF;
Contoh: DECLARE x number; BEGIN x := 0; LOOP x := x + 1; IF x > 5 THEN EXIT; -- exit loop immediately END IF; dbms_output.put_line('Hasil looping ke- '||x); END LOOP; END;
57
Politeknik Telkom
DECLARE vno number; BEGIN vno:=1; LOOP insert into coba(no) values vno; vno:=vno+1; if vno > 10 then exit; end if; END LOOP; END; Pernyataan LOOP bisa diberi label atau nama, sintaksnya sebagai berikut : <<label_name>> LOOP sequence_of_statements END LOOP label_nama; //optional Contoh: <<outer>> LOOP ... LOOP ... EXIT outer WHEN ... -- exit both loops END LOOP; ... END LOOP outer; Pada contoh diatas, saat EXIT maka akan keluar dari kedua looping yang ada.
Perintah WHILE-LOOP akan terus melakukan iterasi (memproses baris perintah secara berulang) selama KONDISI bernilai TRUE. Bentuk umum dari pernyataan LOOP sebagai berikut:
58
Politeknik Telkom
WHILE kondisi LOOP //Baris perintah END LOOP; Contoh: DECLARE x number; BEGIN x := 0; WHILE x <= 5 LOOP x := x + 1; dbms_output.put_line('Hasil looping ke- '||x); END LOOP; END; Selain dapat digunakan pada perintah LOOP, perintah EXIT ini juga dapat digunakan pada WHILE-LOOP untuk menambahkan kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja. Contoh: DECLARE vno number; BEGIN vno:=1; WHILE vno <= 10 LOOP insert into coba(no) values vno; EXIT WHEN vno = 10; vno:=vno+1; END LOOP; END;
Politeknik Telkom
macam yaitu : menaik (ascending) atau menurun (descending). Sintaksnya sebagai berikut : FOR LOOP Baris perintah END LOOP; Perintah FOR-LOOP melakukan iterasi selama nilai COUNTER berada dalam range nilai i_terendah dan i_teratas. Pada FOR-LOOP, counter tidak perlu dideklarasikan. Penggunaan kata kunci RESERVE akan menyebabkan nilai counter dimulai dari i_teratas ke i_terendah. Dua titik antara i_terendah dan i_teratas merupakan operator rentang nilai. i_terendah maupun i_terkecil bisa berupa nilai integer ataupun variabel yang bernilai integer yang sudah dideklarasikan sebelumnya. i_upper harus lebih besar dari i_lower dan jika tidak maka iterasi tidak akan dilakukan. Contoh: BEGIN FOR vno IN 1..10 LOOP insert into coba(no) values vno; dbms_output.put_line('Hasil looping ke- '||x); END LOOP; END; BEGIN FOR vno IN REVERSE 1..10 LOOP insert into coba(no) values vno; dbms_output.put_line('Hasil looping ke- '||x); END LOOP; END; counter IN [REVERSE] i_terendah .. i_teratas
60
Politeknik Telkom
Ruang Lingkup Pernyataan FOR LOOP Contoh : DECLARE ctr INTEGER; -- global variable BEGIN ... FOR ctr IN 1..25 LOOP ... IF ctr > 10 THEN ... -- refers to loop counter END IF; END LOOP; END; Untuk menuju ke variabel global, harus ditambahkan label dan notasi dot. Contoh : <<main>> DECLARE ctr INTEGER; ... BEGIN ... FOR ctr IN 1..25 LOOP ... IF main.ctr > 10 THEN -- refers to global variable ... END IF; END LOOP; END main; Hal ini juga berlaku untuk nested loop. Contoh : <<main>> DECLARE ctr INTEGER; ...
Pengenalan PL/SQL dan Tipe Data 61
Politeknik Telkom
BEGIN <<outer>> FOR step IN 1..25 LOOP FOR step IN 1..10 LOOP ... IF outer.step > 15 THEN ... END IF; END LOOP; END LOOP outer; END main; Selain dapat digunakan pada perintah LOOP, perintah EXIT ini juga dapat digunakan pada FOR-LOOP untuk menambahkan kondisi tertentu. Namun perintah EXIT ini hanya bisa digunakan dalam loop saja. Contoh: BEGIN FOR j IN 1..10 LOOP FETCH c1 INTO mhs_rec; EXIT WHEN c1%NOTFOUND; ... END LOOP; END;
BEGIN <<outer>> FOR i IN 1..5 LOOP ... FOR j IN 1..10 LOOP FETCH c1 INTO mhs_rec; EXIT outer WHEN c1%NOTFOUND; -- exit both FOR loops ... END LOOP; END LOOP outer; -- control passes here END;
62 User, Privilege dan Role
Politeknik Telkom
Perintah GOTO
Perintah ini digunakan untuk mengarahkan proses ke baris yang ditandai dengan label tertentu. Bentuk umum pemakaian perintah ini adalah: GOTO nama_label; Untuk memberikan label pada suatu baris tertentu, gunakan format penamaan label seperti berikut ini: <<nama_label>> Penggunaan perintah GOTO dalam jumlah yang banyak akan
menyebabkan suatu blok PL/SQL menjadi tidak terstruktur. Karena itu sebaiknya penggunaan GOTO ini dihindari. Contoh: DECLARE x number; BEGIN x := 0; LOOP x := x + 1; IF x = 5 THEN GOTO EndOfLoop; END IF; END LOOP; <<EndOfLoop>>dbms_output.put_line('Hasil looping : '||x); END; Contoh: create or replace procedure coba (v_nim mahasiswa.nim %type) is cursor mhs_cur is select nim, nama, alamat from mahasiswa where nim=v_nim; mhs_rec mhs_cur%rowtype;
Pengenalan PL/SQL dan Tipe Data 63
Politeknik Telkom
begin open mhs_cur; <<iterasi>> fetch mhs _cur into mhs _rec; if mhs _cur%notfound then goto lbl_end; end if; dbms_output.put_line(mhs _rec.nama_pegawai||' '|| mhs_rec.alamat||' '|| mhs_rec.gaji); goto iterasi; Dengan adanya perintah goto iterasi, proses berikutnya menuju baris <<iterasi>> yang berada beberapa sebelum baris goto tersebut. Selanjutnya, perintah-perintah yang mengikutinya akan diproses sesuai dengan urutannya (sekuensial). Sedangkan perintah <<lbl_end>> menentukan proses berikutnya adalah baris <<lbl_end>> yang berada setelah perintah goto tersebut. Namun demikian, pada saat menggunakan perintah goto harus diperhatikan hal-hal berikut: perintah goto tidak boleh menuju label yang berada dalam perintah IF, LOOP, blok lain dan blok yang menjadi sub bloknya. Sebuah label harus diikuti oleh paling tidak sebuah perintah eksekusi PL/SQL. Kata atau reserved word seperti END, END IF dan END LOOP tidak termasuk sebagai perintah eksekusi. Tetapi NULL termasuk perintah eksekusi.
64
Politeknik Telkom
JURNAL 1. Buatlah tampilan seperti ini pada SQL Plus: 1 3 5 7 8 11 2. 3. Buatlah tampilan seperti ini pada SQL Plus: 1 3 5 7 9 11 Jelaskan maksud blok PL/SQL dibawah ini, jika nilai variabel input_nilai = 8: DECLARE nilai1 number; nilai2 number; nilai3 number; hasil number; BEGIN nilai1:=1; nilai2:=1; nilai3:='&input_nilai'; dbms_output.put_line(nilai1||' '); dbms_output.put_line(nilai2||' '); loop hasil:=nilai1+nilai2; if hasil>=nilai3 then goto endloop; end if; dbms_output.put_line(hasil||' '); nilai1:=nilai2; nilai2:=hasil; end loop; <<endloop>>
65
Politeknik Telkom
dbms_output.put_line(' '); END; / 4. Jelaskan maksud blok PL/SQL dibawah ini, jika nilai variabel input_nilai = 8:
DECLARE batas_b number; batas_a number; BEGIN batas_b:='&batas_bawah'; batas_a:='&batas_atas'; while batas_b<=batas_a loop if mod(batas_b,2)=1 then dbms_output.put_line(batas_b||' '); end if; batas_b:=batas_b+1; end loop; dbms_output.put_line(' '); END; /
66
Politeknik Telkom
5 CURSOR
Overview
Pada Programming Language untuk Oracle pengambilan data dari database yang dijalankan melalui sebuah queri atau select statement hanya menghasilkan sebuah output. Diperlukan cursor yang bisa digunakan untuk menampung output sehingga berapa baris pengambilan data tidak menjadi masalah
Tujuan
1. 2.
Cursor
67
Politeknik Telkom
Blok PL/SQL tidak memungkinkan untuk menangani query dengan keluaran lebih dari satu baris(record) karena variabel penampungnya harus mempunyai sebuah nilai. Karena itu, diperlukan sebuah cursor untuk menampung semua kondisi dari keluaran sebuah query. Cursor merupakan suatu variabel yang digunakan untuk menampung hasil query yang terdiri atas lebih dari satu row atau record. Cursor dapat diilustrasikan sebagai penampung sekaligus pointer atas hasil eksekusi query. Pada dasarnya perintah SELECT .. pada PL/SQL merupakan sebuah cursor. Terdapat dua macam cursor, yaitu: cursor implisit dan cursor eksplisit
68
Politeknik Telkom
Contoh: declare mhs_rec mahasiswa%rowtype; nim_nya mahasiswa.nim%type; begin nim_nya := '30108001'; select nim, nama, alamat into mhs_rec from nahasiswa where nim = nim_nya; ... end;
Jika nilai nim sama dengan 30108001 dipenuhi maka hasil proses select menghasilkan satu baris, sedangkan jika nilai nim_nya diganti dengan nilai lain dimana nilai tersebut tidak akan menghasilkan satu baris pun, maka Oracle akan mengeluarkan pesan kesalahan. Demikian pula jika klausa where pada cursor di atas dihilangkan sementara di dalam tabel proyek terdapat lebih dari satu baris, maka cursor tersebut tidak dapat menampung semua baris yang diterima. Hal ini akan menimbulkan error exact fetch returns more than requested number of rows.
Politeknik Telkom
when no_data_found then dbms_output.put_line('Tidak ada mahasiswa dengan nim : '||vnim); when too_many_rows then dbms_output.put_line('Data yang dihasilkan lebih dari 1 baris'); end; /
70
Politeknik Telkom
Cursor
71
Politeknik Telkom
Merupakan deklarasi nama cursor dan definisi struktur query yang akan dilakukan di dalamnya. Contoh: DECLARE CURSOR CUR1 IS SELECT nim, nama, alamat FROM mahasiswa .. .. ..
Statement open
OPEN nama_cursor; Sebelum suatu cursor dapat digunakan, cursor harus dibuka terlebih dahulu. Contoh: OPEN CUR1;
Statement fetch FETCH nama_cursor INTO <variable1,variable2,..>; Fetch merupakan perintah untuk mengambil isi cursor, dimana isi dari cursor tersebut adalah hasil query yang telah dideklarasikan pada statement deklarasi cursor. Dan tiap-tiap field hasil query tersebut
72 User, Privilege dan Role
Politeknik Telkom
kemudian ditampung dalam variable-variable yang tipe datanya sesuai dengan tipe-tipe kolom query pada statemen deklarasi. Fetch ini dilakukan untuk tiap-tiap baris. Contoh: FETCH CUR1 INTO v_nim, v_nama, v_alamat;
Setelah pemrosesan query selesai, cursor harus ditutup dengan satatemen CLOSE ini. Berikut ini adalah atribut-atribut untuk mendapatkan status cursor. Setiap atribut dalam penggunaannya harus didahului dengan nama cursor. Atribut nama_cursor%FOUND Keterangan TRUE jika cursor menghasilkan sebuah baris dari queri yang dideklarasikan. Sebaliknya FALSE. nama_cursor%NOTFOUND nama_cursor%ROWCOUNT Kebalikan dari %FOUND Jumlah baris yang difetch atau diambil dari active set. nama_cursor%ISOPEN TRUE jika cursor sedang terbuka dan FALSE jika sebaliknya.
Cursor 73
Politeknik Telkom
Contoh: DECLARE v_nama varchar2(20); v_nim char(9); CURSOR CUR1 IS SELECT NAMA, NIM FROM MAHASISWA; BEGIN OPEN CUR1; FETCH CUR1 INTO v_nama, v_nim; WHILE CUR1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_nama); DBMS_OUTPUT.PUT_LINE(v_nim); FETCH CUR1 INTO v_nama, v_nim; END LOOP; CLOSE CUR1; END;
Politeknik Telkom
Contoh: DECLARE CURSOR cur1 IS select nama from mahasiswa; BEGIN FOR rec IN cur1 LOOP dbms_output.put_line(rec.nama); END LOOP END; Nama record yang didefinisikan sesudah for merupakan pendeklarasian yang hanya internal di dalam loop, dan ruang lingkupnya bersifat internal sampai loop berhenti. Sebenarnya di dalam loop for, cursor tidak harus dideklarasikan terlebih dahulu.
cursor cursor1 is select nim, nama from mahasiswa; n number; begin dbms_output.put_line('Data Mahasiswa); dbms_output.put_line('No Nim Nama'); open cursor1; loop fetch cursor1 into vnim, vnama; exit when cursor1%notfound; dbms_output.put_line(cursor1%rowcount||'. '||vnim||' '||vnama); end loop; n := cursor1%rowcount; dbms_output.put_line('Jumlah data = '||n);
Cursor 75
Politeknik Telkom
close cursor1; exception when no_data_found then dbms_output.put_line('Tidak ada data mahasiswa'); end; /
Politeknik Telkom
Politeknik Telkom
n := n + 1; dbms_output.put_line(n||'. '||x.nim|| ' '||x.nama); end loop; dbms_output.put_line('Jumlah data = '||n); exception when no_data_found then dbms_output.put_line('Tidak ada data mahasiswa'); end; /
5.3 JURNAL
1. 2. Jelaskan perbedaan antara cursor dengan perintah SELECT! Buatlah cursor implisit dan eksplisit yang menampilkan datadata buku beserta suppliernya! 3. Jelaskan maksud dan keluaran dari blok PL/SQL dibawah ini: declare vid_buku buku.id_buku%type; vjudul buku.judul%type; cursor cursor1 is select id_buku, judul from buku; n number; begin dbms_output.put_line('Data Buku); dbms_output.put_line(id_buku Judul); open cursor1; fetch cursor1 into vid_buku, vjudul; while cursor1%found loop dbms_output.put_line(cursor1%rowcount|| .'||vid_buku||' '||vjudul); fetch cursor1 into vid_buku, vjudul; end loop; n := cursor1%rowcount;
78 User, Privilege dan Role
Politeknik Telkom
dbms_output.put_line('Jumlah data = '||n); close cursor1; exception when no_data_found then dbms_output.put_line('Tidak buku); end; / Jalankan blok PL/SQL dibawah ini pada SQL Plus kemudian jika terjadi error perbaiki : DECLARE v_idsupplier supplier.id_supplier%TYPE; v_nama supplier.nama%TYPE; v_no_telepon supplier.no_telepon%TYPE; v_alamat supplier.alamat%TYPE; BEGIN select id_supplier, nama, no_telepon, alamat into vid_supplier, vnama, vno_telepon, valamat from supplier order by id_supplier; if SQL%NOTFOUND then dbms_output.put_line('Nama Pemesan Tidak Ditemukan '); else dbms_output.put_line('Daftar Nama Pemesan yang Total Banquetnya <= 500000 :'); dbms_output.put_line(v_npm); end if; END; / 4.
ada
data
Cursor
79
Politeknik Telkom
6 ERROR HANDLING
Overview
Jika terdapat kesalahan, maka pada Oracle akan muncul pesan kesalahan yang kurang dipahami user. Handling error dimaksudkan untuk menangani hal tersebut.
Tujuan
1. 2. 3. 4. 5. 6. 7. 8.
80
Mampu memahami cara kerja exception. Mampu memahami Predefined Exception pada Oracle. Mampu memahami User Defined Exception. Mampu memahami Unhandled Exception. Mampu memahami penggunaan RAISE_APPLICATION_ERROR Mampu memahami EXCEPTION INIT PRAGMA. Mampu menerapkannya exception dalam PL/SQL di Oracle. Mampu Menguasai dan menerapkan Multi Blok dalam PL/SQL
User, Privilege dan Role
Politeknik Telkom
Misalkan ketika proses SELECT tidak menghasilkan baris data apapun, Oracle akan membangkitkan error dengan kode ORA-01403. Begitu error tersebut muncul, proses akan berpindah ke bagian exception section.
Handling Error
81
Politeknik Telkom
Bentuk umum blok exception adalah sebagai berikut: EXCEPTION WHEN exception1 [OR exception2 [OR ...]] THEN Statement-statement [ WHEN exceptiona [OR exceptionb [OR ...]] THEN statement-statement ] ... [ WHEN OTHERS THEN statement-statement ]
Beberapa jenis kesalahan yang umum terjadi antara lain : Jenis Error Keterangan Syntax Error Misal kurang tanda ; dan dalam penulisan statement Logic Error Loop yang tanpa berhenti, urutan dari operator Compile Error Penggunaan perintah yang salah yang baru diketahui pada saat di compile Run Time Error Error yang terjadi pada saat program dijalankan
Predefined EXCEPTION
Beberapa jenis error yang sangat umum dimasukkan ke dalam predefined exception sehingga seorang user dapat membuat penanganan error terhadap exception yang umum tersebut tanpa harus mengetahui kode error-nya.
82
Politeknik Telkom
Nama Exception
CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR ROWTYPE_MISMATCH
Kode Error
ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01017 ORA-01403 ORA-01012 ORA-06501 ORA-06504
Deskripsi
Membuka cursor yang sedang terbuka Memasukkan nilai duplikat pada kolom unik Operasi cursor ilegal Gagal mengkonversi karakter ke NUMBER. Login dengan username atau password yang salah. SELECT INTO statement tidak menghasilkan baris data. Mengakses database tetapi tidak terkoneksi. Terjadi PL/SQL internal error. Dalam satu penugasan, tipe data antara cursor, variabel dengan PL/SQL cursor tidak cocok Memori rusak atau proses membutuhkan memori yang lebih besar. Time out. SELECT INTO statement menghasilkan lebih dari satu baris data. Kesalahan pada operasi aritmetika, konversi, truncate atau batasan rentang nilai. Membagi dengan nol.
ZERO_DIVIDE
ORA-01476
Handling Error
83
Politeknik Telkom
Contoh: DECLARE v_pembagi NUMBER := &v_pembagi; v_hasil NUMBER := 1000; BEGIN v_hasil := v_hasil/v_pembagi; DBMS_OUTPUT.PUT_LINE(v_hasil); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE(dibagi dengan nol); END;
Identifier EXCEPTION;
Dan dibangkitkan dengan perintah:
RAISE Identifier;
84
Politeknik Telkom
Handling Error
85
Politeknik Telkom
End;
86
Politeknik Telkom
v_alamat varchar2(25) := &valamat; jangan_null exception; kepanjangan exception; pragma exception_init(jangan_null,-1400); pragma exception_init(kepanjangan,-6502); begin insert into Mahasiswa values(v_nim,v_nama,v_alamat); exception when jangan_null then dbms_output.put_line('kolom harus diisi'); when kepanjangan then dbms_output.put_line('isinya kepanjangan'); when others then dbms_output.put_line('apa coba yang salah?'); end;
Handling Error 87
Politeknik Telkom
6.7 JURNAL
1. Sebutkan dan jelaskan kegunaan dari error handling pada PL/SQL! 2. Tambahkan exception pada blok PL/SQL dibawah ini DECLARE pe_ratio NUMBER(3,1); BEGIN SELECT price / earnings INTO pe_ratio FROM buku WHERE id_jenis = 'IT; -- might cause division-by-zero error INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio); COMMIT; END; -- exception handlers and block end here 3. Buatlah cursor untuk mengambil nilai stok buku pada tabel buku kemudian buatlah exception untuk menangani kesalahan ketika stok buku yang dihasilkan bernilai nol.
88
Politeknik Telkom
7 STORED PROGRAM
Overview
Pada Programming Language setiap iterasi dijalan secara terurut. Jika akan menjalankan kegiatan yang sebenarnya sama developer perlu mendeklarasikan ulang apa yang telah dibuat sebelumnya. Stored program dibuat untuk mengatasi hal tersebut. Sehingga menghemat tenaga dan lebih memudahkan dalam memodifikasi sebuah program.
Tujuan
1. Mengetahui dan memahami procedure. 2. Mengetahui dan memahami function. 3. Mampu mengimplementasikan procedure pemrograman di oracle.
Stored Program
dan
function
dalam
89
Politeknik Telkom
STORED PROGRAM
PROCEDURE
FUNCTION
NESTED PROCEDURE
NESTED FUNCTION
7.1 Procedure
7.1.1 Non Nested Procedure
Non nested Procedure atau stored procedure merupakan sekumpulan blok PL/SQL yang tersimpan di dalam skema database dan dapat dieksekusi secara berulang kali jika user memiliki privilege untuk mengeksekusi procedure tersebut. Nama procedure yang dibuat nantinya akan menjadi objek dengan tipe procedure. Procedure akan dieksekusi pada saat pemanggilan setelah sebelumnya dibuat terlebih dahulu. Sintaks Pendeklarasian: CREATE [OR REPLACE] PROCEDURE nama_procedure [argumen1 tipe_data, argumen2 tipe_data,...] AS [deklarasi variabel lokal] BEGIN badan_prosedur EXCEPTION END;
90 User, Privilege dan Role
Politeknik Telkom
Keterangan nama_procedure argumen badan_prosedur Contoh : CREATE OR REPLACE ( v_nim v_nama v_alamat ) IS BEGIN
: nama dari procedure yang akan dibuat : parameter-parameter yang dipakai saat pemanggilan procedure : tempat blok PL/SQL yang memuat baris kode. PROCEDURE tambahMahasiswa mahasiswa.nim%type; mahasiswa.nama%type; departemen.lokasi%type
insert into mahasiswa values(v_nim,v_nama,v_alamat); END; Setelah procedure dibuat, dijalankan dengan sintaks berikut. EXECUTE nama_procedure(parameter_1,parameter_2,...); Contoh : EXECUTE tambahMahasiswa (30108002,paimen,sukapura); Untuk menghapus procedure yang telah kita buat, dapat menggunakan sintaks berikut DROP PROCEDURE nama_procedure; Contoh : DROP PROCEDURE tambahMahasiswa;
Stored Program 91
Politeknik Telkom
Politeknik Telkom
END; /
Hasil setelah dieksekusi adalah sbb, SQL> EXECUTE lihat_mahasiswa; Nama mahasiswa dengan nim 30108002 adalah paimen Procedure lihat_mahasiswa di atas bersifat statis, dieksekusi kapanpun memiliki output yang sama. PROCEDURE DENGAN PARAMETER/ARGUMEN Perbedaan dengan procedure tanpa parameter yaitu procedure dengan parameter memiliki output yang dinamis sesuai dengan nilai yang diberi pada parameter procedure tersebut. Default argumen pada Oracle adalah IN. Jenis-Jenis parameter/argumen dari Procedure adalah : Parameter Masukan (Input) Ditandai dengan atribut IN, dimana nilai dari parameter ini merupakan inputan untuk sebuah procedure. Contoh: CREATE OR REPLACE PROCEDURE lihat_mahasiswa (vnim IN mahasiswa.nim%type) IS vnama mahasiswa.nama%type; BEGIN SELECT nama INTO vnama FROM mahasiswa WHERE nim = vnim; DBMS_OUTPUT.PUT_LINE('Nama mahasiswa dengan nim '||vnim||' adalah '||vnama); END; /
Stored Program 93
Politeknik Telkom
Parameter Keluaran (Output) Ditandai dengan atribut OUT, dimana parameter ini merupakan variabel penampung untuk output sebuah procedure. Contoh: Procedure yang menggunakan parameter masukan dan juga keluaran adalah sebagai berikut : CREATE OR REPLACE PROCEDURE lihat_mahasiswa (vnim IN mahasiswa.nim%type, vnama OUT mahasiswa.nama%type) parameter
IS BEGIN SELECT nama INTO vnama FROM mahasiswa WHERE nim = vnim; DBMS_OUTPUT.PUT_LINE('Nama mahasiswa dengan nim '||vnim||' adalah '||vnama); END; /
Untuk mengeksekusi procedure lihat_mahasiswa : SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 vnama mahasiswa.nama%type; 3 BEGIN 4 lihat_mahasiswa ('30108002',vnama); 5 DBMS_OUTPUT.PUT_LINE('Nama mahasiswa teladan bulan ini adalah '||vnama); 6 END; 7 / Nama mahasiswa teladan bulan ini adalah paimen
94
Politeknik Telkom
Parameter Masukan/Keluaran (Input/Output) Ditandai atribut IN OUT, dimana parameter tersebut dianggap sebagai masukan kemudian diproses dan ditampilkan kembali sebagai keluaran. Contoh: CREATE OR REPLACE PROCEDURE kuadrat (x IN OUT number) IS BEGIN x:=x*x; END; / Untuk mengeksekusi procedure kuadrat : SQL> SET VERIFY OFF; SQL> DECLARE 2 bil number := '&input_angka'; 3 n number; 4 BEGIN 5 n := bil; 6 kuadrat(bil); 7 DBMS_OUTPUT.PUT_LINE('kuadrat dari '||n||' adalah '||bil); 8 END; 9 / Enter value for input_angka : 5 kuadrat dari 5 adalah 25
7.2 Function
Perbedaan mendasar antara function dan procedure adalah bahwa function harus mengembalikan nilai tertentu kepada pemanggilnya. Nilai ini dikembalikan dengan menggunakan sintaks RETURN.
Stored Program
95
Politeknik Telkom
RETURN ekspresi;
Dalam satu fungsi dimungkinkan penggunaan RETURN yang lebih dari satu tetapi bila di dalam badan fungsi tidak terdapat pernyataan RETURN maka akan terjadi error. Contoh: CREATE OR REPLACE FUNCTION tambah
Politeknik Telkom
Cara mengeksekusi : SQL > select tambah (1,8) from dual; tambah (1,8) ----------9
Contoh : CREATE OR REPLACE FUNCTION cariMahasiswa (vnim mahasiswa.nim%type) RETURN number IS v_nim mahasiswa.nim%type; BEGIN SELECT nim FROM mahasiswa WHERE nim = vnim; IF SQL%FOUND THEN RETURN 1; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; END cariPegawai;
Contoh pemanggilan fungsi: declare begin IF(cariMahasiswa('30108002') = 1) THEN; dbms_output.put_line('mahasiswa terdaftar'); ELSE dbms_output.put_line('mahasiswa tidak terdaftar'); END IF; end;
Stored Program
97
Politeknik Telkom
END;
JENIS-JENIS FUNCTION : 1. FUNCTION TANPA PARAMETER Function ini tidak memiliki parameter/argumen biasanya bersifat statis setiap kali dieksekusi. Contoh :
User, Privilege dan Role
98
Politeknik Telkom
DECLARE FUNCTION jumMahasiswa RETURN number IS jum number; BEGIN select count(nim) into jum from mahasiswa; RETURN(jum); END jumMahasiswa; BEGIN dbms_output.put_line('Jumlah mahasiswa saat ini adalah '||TO_CHAR(jumMahasiswa));
END;
2.
FUNCTION BER-PARAMETER Sama seperti Procedure berparameter, Function ber-parameter memiliki outputan yang dinamis sesuai dengan nilai yang diassign ke parameter pada function tersebut. Adapun parameter yang dimaksud disini adalah : a. Parameter masukan Contoh : CREATE OR REPLACE FUNCTION luas_persegi_panjang (p number,l number) RETURN number IS BEGIN RETURN (p*l); END;
Stored Program
99
Politeknik Telkom
Salah satu cara untuk mengeksekusinya dengan menggunakan klausa SELECT seperti di bawah ini : SQL> SELECT luas_persegi_panjang (8,3) FROM dual; LUAS_PERSEGI_PANJANG(8,3) -----------------------------------------24 b. Parameter keluaran Contoh : CREATE OR REPLACE FUNCTION volume_tabung (r IN number, t IN number,luas OUT number) RETURN number IS pi number:=3.14; vol number; BEGIN luas:=pi*r*r; return (luas*t); END;
Misal digunakan blok PL/SQL untuk menjalankan fungsi diatas : declare L_alas number; begin dbms_output.put_line('Volume tabung paijo adalah '||volume_tabung(2,5,L_alas)); dbms_output.put_line('Luas alas lingkaran pada tabung paijo adalah '||L_alas); end;
100
Politeknik Telkom
Output : Volume tabung paijo adalah 62.8 Luas alas lingkaran pada tabung paijo adalah 12.56 Contoh di atas menunjukan bahwa function dapat mengembalikan lebih dari satu nilai lewat parameter OUT. c. Parameter masukan/keluaran Contoh : CREATE OR REPLACE FUNCTION volume_tabung_ku (x IN OUT number, t IN number) RETURN number IS pi number:=3.14; vol number; BEGIN x:=pi*x*x; vol:= x*t; return (vol); END; digunakan blok PL/SQL berikut untuk menjalankan fungsi diatas : declare y number:='&jari_alas'; begin dbms_output.put_line('Volume tabung paimen adalah '||volume_tabung2(y,5)); dbms_output.put_line('Luas alas lingkaran tabung paimen adalah '||y); end;
Stored Program
101
Politeknik Telkom
Output : Enter value for jari_alas: 2 old 2: L number:='&jari_alas'; new 2: L number:='2'; Volume tabung paimen adalah 62.8 Luas alas lingkaran tabung paimen adalah 12.56
7.3 Jurnal
1. Buat sebuah procedure untuk melakukan enkripsi sebuah string yang diinputkan oleh user. jika string yang dihasilkan tetap sama maka keluarkan perintah gagal enkripsi. contoh : SQL> execute enkripsi('oh semoga nilaiku bagus'); ====================== enkripsi berhasil ====================== string sebelum enkripsi : oh semoga nilaiku bagus string sesudah enkripsi : 0h s3m0g4 n1l41ku b4gus PL/SQL procedure successfully completed. SQL> execute enkripsi('kyt kmnwxz zzbfr'); ====================== enkripsi gagal ====================== PL/SQL procedure successfully completed.
102
Politeknik Telkom
2.
Buatlah fungsi untuk menghasilkan nilai biner dari suatu angka desimal. Tuliskan juga cara mengeksekusinya. Contoh: SQL> select biner(10) from dual; BINER(10)
3.
PROCEDURE calc_bonus (emp_id IN INTEGER, bonus OUT REAL) IS hire_date DATE; bonus_missing EXCEPTION; BEGIN SELECT sal * 0.10, hiredate INTO bonus, hire_date FROM emp WHERE empno = emp_id; IF bonus IS NULL THEN RAISE bonus_missing; END IF; IF MONTHS_BETWEEN(SYSDATE, hire_date) > 60 THEN bonus := bonus + 500; END IF; ... EXCEPTION WHEN bonus_missing THEN ... END calc_bonus;
Stored Program
103
Politeknik Telkom
4.
Jalankanlah Package di bawah ini ! CREATE OR REPLACE PACKAGE lihat IS function is_kartu(id pembayaran.id_pembayaran%type) return number; procedure all_kartu; END; create or replace package body lihat is function is_kartu(id pembayaran.id_pembayaran%type) return number is kartu pembayaran.pembayaran_kartu%type; tunai pembayaran.pembayaran_tunai%type; begin select pembayaran.pembayaran_kartu, pembayaran.pembayaran_tunai into kartu, tunai from pembayaran where id=pembayaran.id_pembayaran; if kartu>=tunai then return (1); else return (0); end if; end; procedure all_kartu is cursor c_pembayaran is select * from pembayaran where is_kartu (pembayaran.id_pembayaran)=1 ;
104
Politeknik Telkom
nama pemesan.nama_pemesan%type; id pembayaran.id_pembayaran%type; begin dbms_output.put_line ('---------------------------------------------------------------'); for x in c_pembayaran loop id:=x.id_reservasi; select c.nama_pemesan into nama from reservasi b, pemesan c where id=b.id_reservasi and b.id_pemesan=c.id_peme san; dbms_output.put_line (c_pembayaran%rowcount ||'. '||x.id_pembayaran||' pada tanggal '||x.tgl_pembayaran||' oleh '||nama); end loop; end; end; EXECUTE lihat.all_kartu; Apa output dari package tersebut dan Analisalah package tersebut !!
Stored Program
105
Politeknik Telkom
8 TRIGGER
Overview
Salah satu masalah dalam database adalah integritas bagaimana menjaga data agar tetap konsisten. Hal ini bisa ditangani dengan trigger yang menyerupai fungsi atau procedure yang dijalankan secara otomatis sebagai pemicu dari sebuah kondisi.
Tujuan
1. 2. 3.
Praktikan mengetahui dan mengerti trigger dalam Oracle. Praktikan mengerti manfaat dan batsan penggunaan trigger. Praktikan Mampu mengimplementasikan trigger dalam oracle.
106
Politeknik Telkom
8.1 Definisi
Merupakan blok PL/SQL yang memiliki fungsi hampir sama dengan procedure maupun function , hanya saja, jika procedure atau function dijalankan secara eksplisit lewat pemanggilan procedure atau function tersebut, sedangkan untuk trigger, dijalankan secara implisit melalui perintah insert, delete atau update.
8.2 Manfaat
Manfaat trigger: Mengatur integritas dari constraint yang kompleks yang tidak mungkin ditangani oleh sintaks-sintaks pembuatan tabel. Mencegah transaksi yang tidak valid Memperbaiki keamanan database dengan menyediakan audit yang lebih kompleks mengenai informasi perubahan database dan user siapa yang melakukan perubahan. Secara otomatis memberi sinyal program lain untuk melakukan sesuatu jika isi tabel diubah.
8.3 Batasan
Trigger mempunyai batasan Tidak dapat menggunakan perintah commit dan rollback, selain itu juga tidak dapat memanggil procedure, function atau package yang menggunakan perintah commit dan rollback. Tidak dapat diimplementasikan pada kolom pada suatu tabel yang memilki constraint, jika pada akhirnya akan menyebabkan pelanggaran constraint. Biasanya terjadi akibat modifikasi pada primary key
Trigger
107
Politeknik Telkom
Contoh: Create or replace trigger bef_upd_row_keuangan before Trigger Timing update of donasi on keuangan Trigger Event for each row Trigger Type when (new.donasi => 0) Trigger Restriction begin dbms_output.put('Donasi terbaru:'||:new.donasi); end; / Triggering Statement : Update keuangan set donasi=10000000 where nim=30108001 Trigger body
108
Politeknik Telkom
Keterangan Menunjukkan kapan trigger akan dieksekusi relatif terhadap suatu event. Jenis manipulasi data pada tabel/view yang menyebabkan trigger terpacu.
yang
Trigger event
Batasan yang mengizinkan pengeksekusian trigger. Berapa kali body trigger dieksekusi. Berisi algoritma aksi yang akan dilakukan.
INSERT UPDATE DELETE CREATE ALTER DROP STARTUP SHUTDOWN LOGOFF LOGON SERVERERROR SUSPEND When (boolean value) ROW-level STATEMENT-level Blok PL/SQL
Nama trigger sebaiknya dengan jelas mencerminkan table yang diaplikasikan, Perintah DML Trigger, status before/after, dan apakah row level atau statement level. Misalnya trigger BEFORE UPDATE dengan row level pada table KARYAWAN dapat diberi nama bef_upd_row_karyawan. Triggering statement adalah statement/perintah yang menyebabkan trigger tereksekusi.
Trigger 109
Politeknik Telkom
110
Politeknik Telkom
Untuk mendapatkan data baru pada sebuah tabel di dalam trigger body, dapat dilakukan dengan perintah sebagai berikut:
:new.nama_kolom
Untuk mendapatkan data lama pada sebuah tabel di dalam trigger body, perintah yang digunakan:
:old.nama_kolom
Referensi nilai kolom di trigger: insert (new.nama_kolom) update (new.nama_kolom dan old.nama_kolom) delete (old.kolom_name) Before dan After trigger tidak dapat diimplementasikan pada view. 3. Instead Of Trigger Instead of trigger hanya akan dieksekusi bagi view dan diaktivasi jika terjadi perubahan pada base table (tabel asli). Proses yang akan dilakukan oleh triggering statement akan digantikan oleh aksi pada trigger body. 4. System Event & User Event Trigger Penggunaan trigger dapat dikelompokkan menurut event yang terjadi: System events a. Database startup & shutdown b. Server error message events c. User events User logon and logoff a. DDL statements (CREATE, ALTER, and DROP) b. DML statements (INSERT, DELETE, and UPDATE)
Trigger
111
Politeknik Telkom
Contoh 1: Tabel T_HISTORY apabila ada user yang mengubah data pada tabel KEUANGAN. Siapa usernya beserta waktu pengubahan data dan keterangan. Pertama buat dahulu tabel T_HISTORY dengan sintak dibawah ini: SQL> CREATE TABLE T_HISTORY (NAMA_USER VARCHAR2(9), WAKTU VARCHAR2(25), KET VARCHAR2(50)); Table created. Langkah kedua adalah membuat trigger untuk keperluan di atas sintaksnya sebagai berikut: CREATE OR REPLACE TRIGGER HISTORY_KEUANGAN AFTER INSERT OR DELETE ON KEUANGAN FOR EACH ROW BEGIN INSERT INTO T_HISTORY(NAMA_USER,WAKTU,KET) VALUES (USER, TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS'), 'Terjadi perubahan' ); dbms_output.put('TERJADI PENGUBAHAN PADA TABEL KEUANGAN'); END; Kemudian lakukan pengujian pada trigger di atas dengan mengisi data pada tabel keuangan dengan sintaks berikut: SQL> INSERT INTO KEUANGAN VALUES ('30108001','10000000','lunas'); TERJADI PENGUBAHAN PADA TABEL KEUANGAN 1 row created.
112 User, Privilege dan Role
Politeknik Telkom
Untuk melihat tabel T_HISTORY, gunakan sintaks berikut: SQL> select * from T_ HISTORY; NAMA_USER WAKTU KET --------- -------------------- --------------------PELATIHAN 10-AUG-2003 21:34:45 Terjadi perubahan contoh 2 : CREATE OR REPLACE TRIGGER BEF_UPD_MAHASISWA BEFORE UPDATE OF NAMA ON MAHASISWA FOR EACH ROW DECLARE VNAMA_BARU MAHASISWA.NAMA%TYPE; VNAMA_LAMA MAHASISWA.NAMA%TYPE; BEGIN VNAMA_BARU:= :NEW.NAMA; VNAMA_LAMA:= :OLD.NAMA; DBMS_OUTPUT.PUT_LINE(TELAH DIUPDATE); DBMS_OUTPUT.PUT_LINE(NIM MAHASISWA : ||:OLD.NIM); DBMS_OUTPUT.PUT_LINE(NAMA MAHASISWA LAMA : || VNAMA_LAMA); DBMS_OUTPUT.PUT_LINE(NAMA MAHASISWA BARU : || VNAMA_BARU); END;
Trigger
113
Politeknik Telkom
Contoh 3 : misal terdapat tabel STATUS_MHS untuk menyimpan status apakah donasi mahasiswa telah dilunasi CREATE OR REPLACE TRIGGER AFT_INS_KEUANGAN AFTER INSERT ON KEUANGAN FOR EACH ROW WHEN (new.donasi > 0) DECLARE BEGIN IF INSERTING THEN UPDATE STATUS_MHS SET STATUS = lunas WHERE NIM = :new.nim; END IF; END;
Politeknik Telkom
dbms_output.put_line(jumlah mahasiswa yang memberi donasi sebanyak || n); END; ketika dijalankan perintah berikut SQL > delete keuangan Where nim = 30108001 Pasti akan muncul kesalahan bahwa tabel keuangan is mutating
: untuk menonaktifkan trigger yang sudah dibuat : untuk mengaktifkan kembali trigger yang sudah di DISABLE. gunakan sintaks
Trigger
115
Politeknik Telkom
Sedangkan untuk menghapus trigger digunakan perintah berikut : DROP TRIGGER nama_trigger;
8.8 JURNAL
1. 2. 3. 4. Jelaskan perbedaan function, procedure, dan package! Buatlah sebuah trigger dimana ketika id_jenis pada tabel jenis diubah maka id_jenis pada tabel buku ikut berubah! Buatlah trigger dimana trigger tersebut akan menjamin nilai stok pada tabel buku berkisar antara 0 sampai 100! Jelaskan maksud trigger dibawah ini: create trigger ledger_after_ins_row before insert on LEDGER_AUDIT for each row begin call INSERT_LEDGER_DUP(:new.Action_Date, :new.Action, :new.Item, :new.Quantity, :new.QuantityType, :new.Rate, :new.Amount, :new.Person); end;
116
Politeknik Telkom
Overview
Pada Modul ini, akan dipelajari DDL pada index, view, dan sequence.
Tujuan
1. Dapat membuat index. 2. Dapat membuat view 3. Dapat membuat sequence dengan menggunakan SQL *Plus
Simple Report
117
Politeknik Telkom
9.1 INDEX
Index adalah objek schema yang berisi catatan dari nilai-nilai yang muncul pada satu kolom atau kombinasi kolom di index dari sebuah tabel. Index dibuat untuk mempercepat pengaksesan data pada suatu tabel. Index ini dibuat berdasarkan pada field field dari sebuah tabel. Index bisa dibuat secara otomatis untuk constraint primary key atau unique key dan secara manual melalui CREATE INDEX statement.
Contohnya :
SQL>CREATE INDEX mahasiswa_idx mahasiswa(nim, nama, alamat ); ON
Contoh :
SQL > ALTER INDEX mahasiswa_idx INITRANS 10;
118
Politeknik Telkom
contoh :
ALTER INDEX mahasiswa_idx RENAME TO mhs_idx;
Simple Report
119
Politeknik Telkom
hdg,
hdg,
Ukuran bytes : Jumlah Bit : Jumlah Extent : Initial Extent Min Extent : Max Extent : Freelist Freelist Group Header File : Header Block : Tipe Segmen :
120
Politeknik Telkom
SQL> SET HEADING ON SQL> SELECT extent_id, block_id, bytes, blocks 2 FROM dba_extents 3 WHERE segment_name= NOTES_ID EXTENT_ID 0 1 2 3 4 5 6 7 8 LOCK_ID 9 17 25 33 41 49 57 65 73 BYTES 65536 65536 65536 65536 65536 65536 65536 65536 65536 BLOCKS 8 8 8 8 8 8 8 8 8
Tablespace untuk indeks ditentukan melalui statement pembuatan indeks dan parameter storage dapat disertakan untuk menetapkan karakteristik extent dari suatu segmen indeks. Tampak bahwa indeks pada tabel notes dengan kunci indeks kolom A mempersiapkan 9 extent dengan total 72 blok data.
Politeknik Telkom
gunakan indeks B-Tree. Sedangkan untuk nilai data yang kurang bervariasi gunakan bitmap.
Politeknik Telkom
beragam. Ketika transaksi berlangsung, nilai data pada tabel dan pohon indeks diperbarui. Apabila terjadi query, rowid yang digunakan untuk menemukan letak row data dalam tabel dicari pada indeks. Jadi pada indeks ini rowid untuk setiap key dari masing-masing row tabel akan disimpan dalam indeks. Perintah create index boy.kar_idx on boy.karyawan (nik) akan menghasilkan indeks B-Tree dan cocok untuk menangani transaksi OLTP karena update terhadap kolom yang dindeks dapat berlangsung secara cepat melalui penerapan penguncian pada level row. 2. Indeks Bitmap Berbeda dengan indeks B-Tree yang secara default menyimpan rowid, indeks bitmap menyimpan suatu bitmap untuk setiap nilai kunci pada node leaf. Bitmap itu merupakan pengenal yang disusun oleh sejumlah bit dan dipetakan ke rowid. Jika bitnya diset, berarti baris dengan sejumlah rowid yang bersesuaian mengandung nilai key. Indeks bitmap sangat efektif untuk query yang mengandung banyak kondisi pada klausa where dengan and dan or karena operasi itu secara langsung membandingkan bitmap sebelum mengkonversi bitmap ke rowid. Indeks ini menggunakan space yang lebih kecil dan cocok untuk hardware dengan prosesor dan memori yang terbatas. Indeks bitmap cocok untuk menangani data berukuran besar dengan tingkat transaksi kecil atau pada lingkungan data warehouse serta kolom-kolom dengan cardinilty rendah. Namun mungkin saja DBA membuat indeks bitmap pada kolom dengan cardility yang tinggi untuk lingkungan data warehouse. Untuk data warehouse dengan star schema gunakan indeks bitmap join yang merupakan fungsionalitas baru di Oracle10g. Jika kolom pada dimension table digunakan untuk membatasi data yang dipilih dari fact tabel (dengan foreign key) dan n dimension tabel (dengan primary key), indeks bitmap join bisa menghindari operasi join antartabel tersebut. Cardinality rendah merupakan kolom dengan nilai data berulang atau kolom yang perbedaan nilai datanya sangat kecil dibandingkan jumlah row-nya. Cardinality dapat dilihat pada tabel karyawan berikut ini. NIK 100 101 102 103 104 Nama Goge Titin Beni Joel Susan Kelamin Laki-laki Perempuan Laki-laki Laki-laki Perempuan Status Menikah Janda Belum Menikah Duda Menikah Dept 02 01 03 05 03
Simple Report
123
Politeknik Telkom
Kolom kelamin, status, dan memiliki cardinality rendah karena itu tepat untuk menggunakan indeks bitmap misalnya create index boy.kar_depix bitmap on boy.karyawan(dept); sedangkan nik dan nama memiliki cardinality tinggi sehingga indeks B-Tree dapat diterapkan. 3. Indeks Reverse Jika dibandingkan dengan indeks B-Tree, indeks reverse key membalik (reverse) byte setiap kolom yang diindeks (kecuali rowid) dan mempertahankan urutan kolomnya agar perubahan dapat disebar pada beberapa block indeks. Misalnya jika nilai suatu kolom yang diindeks adalah 1234 maka indeks reverse menggunakan angka 4321 agar pemutakhiran pohon indeks tersebar pada beberapa leaf blok. Oleh karena itu indeks ini cocok digunakan jika kolom-kolom yang diindeks memiliki nilai data yang berurutan atau mirip. Indeks ini digunakan pada real application cluster (RAC) di mana perubahan indeks dilakukan pada kumpulan blok leaf yang kecil. Dengan me-reverse key yang diindeks maka insert akan tersebar pada berbagai leaf suatu pohon indeks.
Perintah pertama membuat reverse indeks, sedangkan perintah kedua melakukan rebuild indeks. Apabila indeks ini akan diubah ke mode default, gunakan klausa NOREVERSE untuk menormalkan pola penyimpanan key pada pohon indeks. Pencarian data dengan range-scanning tidak dapat diterapkan pada reverse indeks karena kunci indeks tidak lagi disimpan secara berdekatan sehingga pengambilan data hanya dapat dilakukan melalui key yang ditentukan atau fulltable scan.
124
Politeknik Telkom
4. Indeks Fungsi Indeks ini menggunakan fungsi (funtion-based index) untuk mendefinisikan kunci indeksnya.
Perintah pertama menghasilkan indeks entry dengan mengkapitalkan nama penduduk melalui fungsi built in upper. Pada contoh kedua digunakan fungsi PL/SQL. funcsal yang harus ditentukan deterministic dan parameter inisialisasi QUERY_REWRITE_ENABLED, QUERY_REWRITE_INTEGRITY bernilai TRUE dan TRUSTED. Tabel stat_sales itu dapat dianalisa setelah indeks dibuat dan query harus tidak memerlukan nilai null.
Simple Report
125
Politeknik Telkom
BLEVEL pada data dictionary DBA_INDEXES adalah B-Tree level atau branch level yang menunjukkan kedalaman atau level indeks dari node root. Level nol menunjukkan node root dan node leaf yang sama. Jika nilai blevel lebih dari empat maka direkomendasikan untuk me-rebuild indeks. Nilai blevel diperoleh setelah indeks dianalisa sehingga nilai blevel yang kosong atau
126 User, Privilege dan Role
Politeknik Telkom
keterangan BLEVEL HIGH menunjukkan indeks yang belum dianalisa. Untuk itu indeks tes_idx_idx dengan blevel 5 perlu di-rebuild dengan perintah alter index tes_idx_idx rebuild.
CARDINALITY INDEKS.
SQL> ANALYZE INDEX boy.tes_idx_idx VALIDATE STRUCTURE; Index Analyzed SQL> SELECT del_lf_rows *100/ 2 DECODE(lf_rows, 0,1,lf_rows) PCT_DELETED, 3 (lf_rows distinct keys) *100/ 4 DECODE(lf_rows,0,1, lf_rows) DISTINCTIVENESS 5 FROM index_stats 6 WHERE NAME=&index_name; Enter value for index_name: TES_IDX_IDX
Simple Report 127
Politeknik Telkom
Old New
6: 6:
Kolom pct_deleted menunjukkan persentase leaf (index entry) yang telah dihapus dan masih belum diisi. Semakin banyak persentasenya , pohon indeks menjadi tidak balance. Sebagai acuan jika pct_deleted bernilai di atas 20 persen, indeks itu perlu di-rebuild. Namun angka di atas 10 persen juga dapat dijadikan dasar untuk me-rebuild indeks lebih sering. Kolom distictiveness menunjukkan seberapa sering suatu nilai kolom yang diindeks berulang. Misalnya jika suatu tabel memiliki 10000 row dan ada 9000 variasi nilai untuk kolom yang diindeks maka berdasarkan formula script di atas diperoleh hasil 10. Angka ini menunjukkan distribusi yang baik untuk indeks. Jika untuk 10000 row hanya terdapat variasi dua nilai data maka diperoleh hasil 99,98. Ini berarti hanya sedikit variasi nilai data terhadap seluruh yang ada pada kolom yang diindeks. Kolom ini bukan merupakan calon untuk proses rebuild indeks tetapi sebaiknya dibuatkan indeks bitmap.
INFORMASIINDEKS.
SQL> SELECT index_name, index_type, status 2 FROM dba_indexes 3 WHERE owner=BOY; INDEX_NAME INDEX_TYPE STATUS -----------------------------------------------PEG_DEP_REVERSE NORMAL/REV VALID KAR_DEP_BITMAP BITMAP VALID KOTA_PENDUDUK_NDX CLUSTER VALID NAMA_IX FUNTION-BASED NORMAL VALID
128 User, Privilege dan Role
Politeknik Telkom
SQL>SELECT index_name, table_name, column_name 2 FROM dba_ind_columns 3 WHERE index_owner=BOY 4 ORDER BY table_name; INDEX_NAME TABLE_NAME COLUMN_NAME --------------------------------------------------SYS_C002985 DAFKURSUS SYS_NC0000600007$ SYS_C002986 DAFKURSUS SYS_NC_OID$ SYS_IOT_TOP_33369 EMPSUS_TAB NESTED_TABLE_ID SYS_IOT_TOP_33369 EMPSUS_TAB NO PEG_DEP_REVERSE PEGAWAI DEPT_NO KAR_DEP_BITMAP KARYAWAN DEPT_NO SYS_C003094 PRODUKSI_RANGE NIK PROD_IDX PRODUKSI_RANGE TGL TED_IDX_IDX TES_IDX A1 SQL>SELECT o.object name 2 FROM sys.dba_objects o 3 WHERE owner = BOY AND o.object_id 4 IN (SELECT i.obj# FROM sys.ind$ I WHERE 5 BITAND(i.property,4)=4); OBJECT_NAME ----------------------------------------------------PEG_DEP_REVERSE
Politeknik Telkom
THAN
Setiap partisi indeks itu diberi nama dan disimpan pada tablespace indeks default. Agar pemutakhiran indeks global selalu dilakukan, sertakan klausa update global indexes pada setiap statement yang melibatkan operasi DDl pada partisi.
130
Politeknik Telkom
MEMANTAU INDEKS UNUSED. --Buat table SQL> CREATE TABLE kanwil (kode SQL> INSERT INTO kanwil VALUES SQL> INSERT INTO kanwil VALUES SQL> INSERT INTO kanwil VALUES SQL> INSERT INTO kanwil VALUES SQL> COMMIT;
--Buat indeks primary key SQL> ALTER TABLE kanwil ADD( 2 CONSTRAINT kanwil_pk PRIMARY KEY (kode)); Table altered. --Monitoring indeks belum bekerja SQL> SELECT index_name, monitoring, used, 2 start_monitoring, end_monitoring 3 FROM v$object_usage; No row selected --Aktifkan monitoring indeks SQL> ALTER INDEX kanwil_pk MONITORING USAGE; Index altered. --Monitoring indeks diaktifkan SQL> SELECT index_name, monitoring, used, 2 start_monitoring, end_monitoring 3 FROM v$object_usage; INDEX_NAME MONITORING USED START_MONITORING END_MONITORING ---------------------- ----------------------------------KANWIL_PK YES NO 01/31/2004 01:30:16 --Buat table PLAN_TABLE jika belum ada. SQL> @D:\ora9i\rdbms\admin\ut1xplan.sql --Tracing rencana eksekusi
Simple Report
131
Politeknik Telkom
SQL> SET AUTOTRACE ON EXPLAIN SQL> SELECT * FROM kanwil WHERE kode =1; KODE NAMA ---------- -----------1 KANWIL I Execution Plan -------------------------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF KANWIL 2 1 INDEX (UNIQUE SCAN) OF KANWIL_PK (UNIQUE) SQL> SET AUTOT OFF --Jalankan query SQL> SELECT * FROM kanwil WHERE kode =1; SQL> SELECT index_name, monitoring, used, 2 start_monitoring, end_monitoring 3 FROM v$object t_usage; INDEX_NAME MONITORING USED START_MONITORING END_MONITORING ---------------------- ---------------------------------KANWIL_PK YES YES 01/31/2004 01:45:47 --Akhiri monitoring indeks SQL> ALTER INDEX kanwil_pk NOMONITORING USAGE; Indes altered. SQL> SELECT index_name, monitoring, used, 2 start_monitoring, end_monitoring 3 FROM v$object_usage; INDEX_NAME MONITORING USED START_MONITORING END_MONITORING ----------- ---------- --------------------------------------KANWIL_PK NO YES 01/31/2004 01:45:47 01/31/2004 01:47:07
View dictionary V$OBJECT_USAGE berisi informasi indeks yang dimonitor untuk mengetahui indeks yang telah digunakan. Jika kolom used bernilai yes maka indeks pernah digunakan selama selang waktu tertentu berdasarkan kolom start_monitoring dan end_monitoring. Kolom monitoring bernilai yes jikamonitoring indeks sedang berlangsung dan berakhir setelah perintah monitor menghentikan monitor indeks dijalankan. Untuk memantau indeks dalam ruang lingkup database maka perintah alter indexmonitoring usage harus dilakukan bagi setiap nama indeks. Untuk it u perlu dibuat script yang menghasilkan statement tersebut dengan membaca data dictionary DBA_INDEXES baik script untuk memulai maupun menghentikan monitoring indeks.
132
Politeknik Telkom
9.11 VIEW
View adalah sebuah virtual tabel yang dibangun dari satu atau beberapa tabel yang sudah ada, baik berdasarkan kondisi tertentu ataupun tidak. Secara fisik view tidak menyimpan record seperti pada tabel, tetapi ia menyimpan data berupa pointer yang menunjukkan ke record yang bersangkutan di dalam tabel.
Simple Report
133
Politeknik Telkom
Sumber data view dapat berasal dari table atau view lain. Mirip dengan table, Anda dapat melakukan update, delete, dan insert pada view sehingga perubahan itu akan direfleksikan pada base tabelnya. Berbeda dengan table, view tidak menyimpan data, view hanya menyimpan definisi query pada data dictionary dan tidak memerlukan ruang penyimpanan data. Penerapan view dapat diaplikasikan pada situasi berikut : Membatasi akses sesuai otoritas user Memudahkan pemahaman tehadap kolom penampung data yang mungkin berbeda dengan definisi kolom pada table dasar Menyederhanakan pandangan user terhadap data Menangani data kompleks Memudahkan penggunaan quey yang berulang karena disimpan sebagai stored query
9.11.1
Query : CREATE [or replace] [force] [noforce] VIEW nama_view [(nama_field1, )] AS subquery [with check option] or replace noforce force with check option : mendefinisikan kembali view yang sudah ada : view hanya akan dibuat jika tabel induk telah dibuat. : view dapat dibuat walau tabel induk belum dibuat. : view akan menvalidasi data yang diinsert atau diupdate ke view
Contoh : SQL > CREATE or REPLACE VIEW mahasiswa_view (nim, nama, alamat) AS SELECT nim, nama, alamat FROM mahasiswa WHERE alamat != with check option;
134 User, Privilege dan Role
Politeknik Telkom
9.11.2
Query :
Alter view digunakan untuk mengkompilasi ulang sebuah view. ALTER VIEW nama_view COMPILE; Contoh : SQL > ALTER VIEW mahasiswa_view COMPILE:
9.11.3
Query :
View Read-Only
View yang ditujukan hanya untuk dibaca saja, dibuat dengan menyertakan klausa with read only. Sebagai gambarannya, berikut ini didefinisikan objek table dan view yang diciptakan dalam satu kali transaksi melalui create schema.
Politeknik Telkom
16 WHEREa.dept_no = b.no 17 CREATE VIEW dep_karyawan_rro 18 AS SELECT a.nik, a.nama AS "Nama Karyawan", 19 a.dept_no, b.nama "Department" 20 FROM boy karyawan a, boy.dept b 21 WHEREa.dept_no = b.no 22 WITH READ ONLY; Schema created. SQL> INSERT INTO SQL> INSERT INTO SQL> INSERT INTO SQL> INSERT INTO SQL> INSERT INTO SQL> INSERT INTO SQL> INSERT INTO SQL> COMMIT Commit complete. boy.dept VALUES (100,'SDM'); boy.dept VALUES (100,'Produksi'); boy.dept VALUES (100,'Pemasaran'); boy.karyawan VALUES (100,'SDM'); boy.karyawan VALUES (100,'SDM'); boy.karyawan VALUES (100,'SDM'); boy.karyawan VALUES (100,'SDM');
View dep_karyawan_ro merupakan view read-only yang menggunakan table karyawan dan dept. View ini hanya dapat dibaca saja dan menghindari manipulasi data dengan delete, insert, atau update melalui view.
Politeknik Telkom
2 3
View dep_karyawan_ro didefinisikan dengan empat kolom dimana referensi terhadap kolom karyawan.nama dialisakan menjadi Deaprtmen. Ini berarti referensi terhadap kolom itu bersifat case sensitive karena dinyatakan dalam tanda petik , pada statement kedua tampak bahwa insert tidak dapat dilakukan ORA17333 da iyu dibuktikan melalui dictionary USER_UPDATABLE_COLUMNS yang melaporkan bahwa kolom-kolom view itu tidak dapat diupdate.
View Updatable
Meskipun view tidak menyimpan data seperti table, perubahan terhadap base table dapat dilakukan melalui view seperti ditunjukkan pada script berikut :
Simple Report
137
Politeknik Telkom
SQL> SELECT * FROM dep_karyawan_rw; NIK NAma Karyawan Dep_no Departmen ----------------------------------------1 Isaman 100 SDM 2 nova 100 SDM 3 donda 200 Produksi 4 rino 300 Pemasaran 5 didik 200 Produksi
View dep_karyawan_rw memiliki tiga kolom yang dapat diupdate dan melalui statement insert di atas , penabahan data pada view tersebut akan direfleksikan pada table karyawan.
Materialized View
Materialized view (MV) merupakan objek schema yang berisi hasil query. Tabel-tabel yang digunakan pada query dapat berupa hasil, view atau MV lain yang disebut sebagai table master (replikasi) atau table detail (data warehouse) dan informasinya tersedia pada dictionary ALL_MVIEWS, DBA_MVIEWS, dan UESR_MVIEWS. Materialized view atau snapshotini digunakan pada database terdistribusi untuk membuat aplikasi dengan sinkronisasi data pada berbagai site maupun untuk data warehouse yang mempersiapkan dan menyimpan data agregat. MV meningkatkan kecepatan akses query melalui perkalkulasi join dan operasi agregat sebelum menjalankan dan menyimpan hasinya pada database. Ketika query terhaap MV dilakukan, query optimizer akan mengetahui bilamana MV yang ada dapat digunakan dan segera mengakses MV, bukan ke table detail (query rewrite) Membuat Materialized View Privilege pembuatan MV haus di-grant secara langsung jadi tidak melalui role. Untuk membuat MV pada Schema user diperlukan priviledge system create materialized view dan create table atau create any table serta previlege system select any table. Sedangkan pembuatan MV pada schema user lain memerlukan previledge system create any materialized view. Untuk dapat membuat MV yang berisi summary jumlah penduduk setiap kota dapat dibuat denagn cara berikut ini :
138 User, Privilege dan Role
Politeknik Telkom
Perintah diatas menghasilkan data dalam MV (build immediete) ynag mengguanakn metode refresh force untuk memilih pemutakhiran data secara incremental atau komplit MV_sap_kot itu tidak bias digunakan untuk query rewrite. Agar kemampuan itu tersedia maka opsi with query rewrite enabled harus dipilih dengan syarat owner memiliki privileged system query rewrite. Materialized view juga dapat dibat melalui OEM Console Untuk memeriksa integritas struktur materialized view seperti halnya table, index, arau cluster gunakan perintah analyze. Miasalnya analyze table sanp_kota validate structure cascade. Jika objek tidak valid, lakukan refresh MV secar komplit namun jika masih tidak valid lakukan drop dan buat ulang materiliazednya. Perintah alter materialized view snap_kota compile melakukan vaildasi MV secara eksplist dan digunakan pada situasi dimana telah terjadi perintah drop atu alter tterhadap objek-objek yang digunakan oleh MV. Perintah alter ini juga digunakan untuk mengubah karakteristik MV seprti metode dan mengaktifkan query rewrite.
Simple Report
139
Politeknik Telkom
Materialized View Read/Write MV dapat ditujukan hanya untuk dibaca saja sehingga menghindari perubahan MV da data pada table master. Sebagai conroh daftar kota yang terdapat pada table master kota dapat dibuatkan MV-nya dengan nama sanp_kota sehingga user dapat mengakses data melalui MV itu.
Untuk membuat MV yang dapat diupdate, tambahkanklausa for update pada definisi MV.
140
Politeknik Telkom
Refresh Data Data dalam MV diperbaharui jika ada perubahan pada table master. Pemutakhirannya dapat dilakukan secara incremental (fast refresh) atau memutakhirkan semua data (complete) atau memilih cara refresh yang tersedia (force). Jika MV menggunakan metode fast refresh, materialized view log akan merekam perubahan terhadap table master. MV dapat di refresh secara periodic (automatically on), sesuai keperluan (on demand) atau jika MV itu berada pada database yang sama dengan table masternya, refresh terjadi setelah commit (on commit). Untuk dapat me refresh MV secara on commit diperlukan privilege system on commit refresh atau dengan privilege objek on commit refresh pada setiap table master yang tidak dimiliki user. Jika table detail atau master mempunyai primary key, gunakan opsi primary key, sebaiknya gunakan metode refresh yang menggunakan rowed. Materialized View Log Materialized view log adalah objek schema yang mencatat perubahan yang terjadi pada table sehingga memungkinkan table master diperbaharui secara incremental (fast refresh). Berikut ini dibuat MV log untuk data warehouse dengan fast refresh yang menggunakan rowed.
Untuk mendukung fast refresh pada MV tampak bahwa definisi MV log menyertakan klausa ROWID yang disertai including new values untuk merekam niali dat yang lama dan baru pada log.
Simple Report
141
Politeknik Telkom
Data Warehouse Materialized view digunakan untuk organisasi data pada warehouse, misalnya dalam pembuatan ringkasan penduduk per kota melalui script berikut ini :
AS
Statement diatas membuat MV jwa_kota dengan menghitung jumlah penduduk dalam satu kota dan kecamatan dengan operasi join. MV segera dipopulasikan karena menggunakan metode bulid immediate dan tersedia untuk digunakan melalui query rewrite. Metode fast refresh bias dilakukan karena MV log telah dibuat untuk table kota dan penduduk.
142
Politeknik Telkom
9.12 SEQUENCE
Sequence digunakan untuk membangkitkan serangkaian nilai serial yang unik.
Politeknik Telkom
144
Politeknik Telkom
9.13 JURNAL
1. 2. 3. Sebutkan dan jelaskan keuntungan jika kita menggunakan index! Apakah semakin banyak index yang kita pakai maka semakin baik pula pengaruhnya terhadap performansi DBMS? Berdasarkan studi kasus yang ada di modul 1 lakukan analisis terhadap tabel-tabel yang ada untuk menentukan index yang akan dibuat kemudian buatlah index pada tabel-tabel tersebut dan berikan alasan kenapa index tersebut harus dibuat! Apakah syarat-syarat yang harus dipenuhi sehingga sebuah View dapat dinyatakan sebagai view updatable? Buatlah contoh view updatable berdasarkan studi kasus yang ada di modul 1! Buatlah view yang isinya merupakan hasil outer join dari tabel buku dan jenis dimana tabel buku menjadi acuannya! Jelaskan fungsi/kegunaan dari sequence jika dikaitkan dengan tabel! Berdasarkan studi kasus yang ada di modul 1 lakukan analisis terhadap tabel-tabel yang ada untuk menentukan sequence yang akan dibuat kemudian buatlah sequence pada tabel-tabel tersebut dan berikan alasan kenapa sequence tersebut harus dibuat!
4. 5. 6. 7. 8.
Simple Report
145
Politeknik Telkom
10 SIMPLE REPORT
Overview
Pokok-pokok bahasan di dalam bab ini menjelaskan cara mengatur format tampilan data dengan mengatur environment melalui perintah SET dan menggunakan perintah-perintah SQL*Plus lainnya. Pengaturan format tampilan data ini sering dipakai di dalam file script yang ditujukkan untuk menghasilkan laporan sederhana (simple report).
Tujuan
1. 2.
Dapat menagatur format tampilan data pada SQL*PLUS . Dapat membuat laporan sederhana menggunakan SQL*PLUS.
146
Politeknik Telkom
PAGES -----------------------------------------------------------**********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ PAGES -----------------------------------------------------------**********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ **********$$$$$$$$$$**********$$$$$$$$$$**********$$$$$$$$$$ 15 row selected
Simple Report
147
Politeknik Telkom
Perhatikan hasil query di atas. Suatu halaman di mulai dengan satu baris kosong. Setelah itu diikuti oleh judul baris kolom (heading) dan baris garisbawah judul kolom. Kemudian, dibawahnya ditampilkan baris-baris data. Apabila panjang baris judul kolom (atau baris data) lebih besar dari LINESIZE, baris tersebut ditampilkan dalam dua baris atau lebih. Apabila baris-baris yang ditampilkan tidak cukup ditampung dalam satu halaman, akan dibuat halaman baru yang terdiri atas satu baris kosong, judul kolom, garis-bawah judul kolom, dan baris-baris data. Demikian seterusnya sampai semua data ditampilkan. Penutup dari halaman terkahir adalah sebuah baris kosong, dan atribut-atribut lainnya seperti FEEDBACK dan TIMING. Apabila PAGESIZE diberi nilai 0 (nol), yang ditampilkan hanya baris-baris data saja tanpa awalan baris kosong, judul kolom, garis-bawah judul kolom dan atribut-atribut lainnya. Baris kosong yang berada sebelum baris judul kolom sebenarnya dapat ditentukan jumlahnya dengan mengatur system variable NEWPAGE. Pada keluaran hasil query di atas, nilai NEWPAGE yang digunakan adalah satu (default). Perlu diinformasikan juga bahwa Anda dapat melihat nomor baris yang sedang ditampilkan dari sebuah halaman menggunakan perintah SHOW LNO. Nomor halaman dapat dilihat dengan perintah SHOW PNO. Apabila tidak disebutkan secara khusus, PAGESIZE dan LINESIZE yang digunakan pada pokok-pokok bahasan berikutnya didalam bab ini adalah 50 dan 65.
10.1.1
Menggunakan BREAK
Perintah BREAK dapat digunakkan untuk hal-hal seperti berikut ini. Menampilkan hanya satu nilai untuk beberapa nilai yang sama pada kolom yang ditentukan. Menambahkan baris kosong setiap kali nilai dari kolom yang ditentukan berubah. Mencetak nilai hasil perhitungan untuk kelompok baris dengan nilai kolom yang sama pada kolom yang ditentukan (lihat pokok batasan berikutnya). Bentuk umum perintahnya adalah sebagai berikut.
BRE[AK] [{ ON <column | expr | ROW | REPORT> [SKIP n | [SKIP] PAGE] [NODUP[LICATES] | DUP[LICATES]] }]
148
Politeknik Telkom
Nama column tidak boleh mengandung schema dan/atau table. Untuk kolomkolom yang menggunakan format tab_name,col_name di dalam SQL statement-nya, sebaiknya berikan kolom alias pada SQL statement tersebut sehingga nama kolom alias tersebut dapat digunakan pada perintah BREAK. Jika expr digunakan, break tersebut berlaku jika expr terdapat pada SQL statement dan tanpa menggunakan kolom alias. Pilihan ON ROW digunakan untuk break setiap kali baris berikutnya berbeda dengan baris sebelumnya. ON REPORT biasanya digunakan bersamaan dengan kalkulasi untuk keseluruhan data (lihat perintah COMPUTE pada pokok bahasan berikutnya). SKIP n dapat digunakan untuk memberikan baris kosong sebanyak n baris setiap masuk ke break berikutnya. Apabila SKIP PAGE digunakan keluaran diceyak di halaman berikutnya setiap kali break terjadi. NODUP[LICATES] digunakan apabila nilai-nilai yang duplikat tida ingin dicetak. Pilihan ini adalah default. DUP[LICATES] digunakan apabila nilai-nilai yang duplikat ingin dicetak. Berikut ini diberikan sebuah contoh penggunaan perintah BREAK untuk kolom bayar. Sebuah baris kosong dicetak setiap kali break terjadi.
SQL> break on bayar skip 1 SQL> SELECT nim, prodi, nama, bayar 2 FROM mahasiswa ORDER BY nim; NIM NAMA PRODI BAYAR -----------------------------------------------------------------------------------------------30107001 ANGGI NOVEMBRA MI 2000000 30107003 30107004 30207005 30207006 30207007 WIDO KESUMA MURDIJAT ARIF PRABOWO TK ANUGRAH DWI ARDIANTO ANDRE ADRIAN ANDI HAKIM ARIF TK TK MI MI 2000000 15000000 8000000 2000000 4000000
149
Simple Report
Politeknik Telkom
30307008 30307009
KA KA
10000000 3500000
Bagaimana jika ingin menggunakan banyak criteria break? Anda dapat menggunakan klausa ON sebanyak criteria yang diinginkan. Contoh-contoh break dapat ditemukan pada pokok-pokok bahasan berikutnya. Apabila perintah BREAK dijalankan tanpa klausa ON, perintah tersebut ditujukan untuk memunculkan perintah BREAK yang terakhir. Sebagai contoh ditunjukkan di bawah ini.
SQL> break Break on bayar skip 1 nodup
Perlu diingat bahwa setiap kali perintah BREAK dijalankan, perintah tersebut berlaku sampai perintah BREAK berikutnya dijalankan atau sampai CLEAR BREAKS dijalankan. Perintah CLEAR BREAKS berguna untuk menghapus definisi break yang ada seperti yang ditunjukkan seperti ini.
SQL> clear breaks Breaks cleared
150
Politeknik Telkom
Satu perintah COMPUTE dapat menggunakan lebih dari satu fungsi. dengan urutan pengerjaan COMPUTE. Label text dapat diberikan untuk membuat text menjadi tanda atau cap pada baris hasil COMPUTE. Jika tidak diberikan, default text adalah nama fungsi. Klausa OF berfungsi untuk menentukan expr atau kolom apa yang dikalkulasi. KLAUSA ON berfungsi untuk menentukan criteria break untuk satu perhitungan COMPUTE. Sebagai catatan, hasil dari perintah COMPUTE hanya dicetak jika perintah BREAK disertakan. Nama column atau expr pada klausa ON perintah COMPUTE harus ada pada klausa ON perintah BREAK tersebut. Fungsi-fungsi untuk Perintah COMPUTE Nama Fungsi Perhitungan AVG Nilai rata-rata. Baris yang diperhitungkan hanya baris dengan nilai yang tidak NULL COU[NT] Menghitung jumlah baris yang nilai column atau expr-nya tidak NULL MIN[MUM] Nilai minimum MAX[MUM] NUM[BER] SUM SID VAR[IANCE] Nilai maksimum Menghitung jumlah baris, termasuk yang bernilai NULL Jumlah nilai Standar deviasi dari nilai column atau expr yang tidak NULL Variance dari nilai column atau expr yang tidak NULL Tipe Data NUMBER
Semua NUMBER, VARCHAR2 NUMBER, VARCHAR2 Semua NUMBER NUMBER NUMBER CHAR, CHAR,
Simple Report
151
Politeknik Telkom
Berikut ini diberikan sebuah contoh perhitungan rata-rata, nilai minimum, dan nilai maksimum dari bayar yang dikelompokkan prodi. Pengurutan data (ORDER BY) juga berpengaruh pada keluaran. Perhatikan juga, BREAK dikenakan pada kolom departemen dengan skip satu baris dan pada kolom pos_id tanpa skip.
SQL> break on prodi skip 2; SQL> compute avg max min of bayar on prodi; SQL> select nim, nama, prodi, bayar from mahasiswa order by prodi; NIM NAMA PRODI KA ***** avg minimum maximum MI BAYAR 3500000 10000000 ---------6750000 3500000 10000000 2000000 2000000 15000000 ---------6333333,33 2000000 15000000 4000000 8000000 2000000 ---------4666666,67 2000000 8000000
30107003 WIDO KESUMA 30107001 ANGGI NOVEMBRA 30107004 MURDIJAT ARIF PRABOWO
30207007 ANDI HAKIM ARIF 30207005 ANUGRAH DWI ARDIANTO 30207006 ANDRE ADRIAN
152
Politeknik Telkom
Sebagai catatan tambahan, semua atribut yang telah ditentukan dengan perintah COMPUTE dapat dihapus menggunakan perintah CLEAR COMPUTES.
Apanila perintah COLUMN digunakan tanpa column atau expr maka SQL*Plus akan mengeluarkan atribut COLUMN yang sedang berlaku pada session SQl*Plus tersebut (bukan session user database). Apabila perintah COLUMN digunakan dengan menyertakan column atau expr namun tanpa option, SQL*Plus akan mengeluarkan atribut COLUMN untuk kolom atau ekspresi yang disebutkan. Nilai option dapat berupa klausa-klausa yang diperhatikan pada Tabel. Tabel Option pada Perintah COLUMN Klausa ALI[AS] alias Desripsi Memberi nama alias yang dapat digunakan untuk menggantikan nama column pada perintah BREA, COMPUTE, ataupun COLUMN Mengembalikan atribut colomn ke nilai default sesuai dengan tipe data, panjang data, dan sebagainya Menambahkan karakter baris baru (carriage
153
CLE[AR]
FOLD_A[FTER]
Simple Report
Politeknik Telkom
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING]
return) setelah judul column dan setelah nilai column dari setiap baris. Tidak berlaku untuk kolom terakhir pada klausa SELECT Menambahkan karakter baris baru (carriage return) sebelum judul column dan setelah nilai column dari setiap baris. Tidak berlaku untuk kolom pertama pada klausa SELECT Menentukan format tampilan nilai column. Format untuk kolom karakter berupa An dimana n adalah lebar kolom. Format untuk kolom DATE mengikuti NLS_DATE_FORMAT namun lebar kolomnya apat ditentukan dengan An. Format untuk kolom NUMBER sama dengan format yang digunakan pada fungsi TO_CHAR(NUMBER) yang ditampilkan pada Tabel 3.7 pokok bahasan 3.5.2. *) Menentukan text sebagai judul kolom untuk menggantikan judul kolom yang diberikan di dalam SELECT statement. String karakter text dapat
User, Privilege dan Role
154
Politeknik Telkom
LIKE[expr|alias]
NEWL[INE]
NEW_V[ALUE] variable
mengandung karakter HEADSEP untuk menampilkan judul kolom dalam dua baris atau lebih. Menentukan apaah judul kolom dan nilai kolom ditampilkan rata kiri, di tengah-tengah. Atau rata kanan. Jika tidak disebutkan maka kolom NUMBER ditampilkan rata kanan dan kolom lainnya rata kiri Menyalin atribut tampilan dari kolom lain. Atribut yang disalin hanya atribut yang tidak ditemtukan secara eksplisit. Sama efeknya dengan FOLD_BEFORE, yakni menampilkan baris baru sebelum nilai column ditampilkan Digunakan untuk membuat variable yang nilainya adalah nilai kolom. Variable tersebut biasanya digunakan pada perintah TITLE untuk membuat judul-atas pada laporan master detail. Agar pengaruhnya terlihat, kolom pada perintah ini harus digunakan juga apada perintah BREAKSKIP
155
Simple Report
Politeknik Telkom
NOPRI[NT]|PRI[NT]
ON|OFF
WRA[PPED]|WOR[D_WRAPPED|TRU[NCATE]
PAGE Mengatur apakah judul dan nilai column dicetak di layar (ON) atau tidak (OFF). Default adalah OFF Menentukan text sebagai nilai yang dicetak pada kolom yang ditentukan Digunakan untuk membuat variable yang nilainya adalah nilai kolom. Variable tersebut biasanya digunakan pada perintah BTITLE untuk membuat judul-bawah pada laporan master detail. Kolom pada perintah ini harus digunakan juga pada perintah BREAKSKIP PAGE Mengaktifkan (ON) atau menonaktifkan (OFF) atribut-atribut kolom yang sudah didefinisikan Perintah ini khusus untuk kolom DATE atau karakter yang lebarnya ditentukan namun nilai kolom tersebut melebihi lebar kolom yang disediakan. Pilihan WRAPPED akan melanjutkan bagian yang tidak mencukupi ke baris yang baru pada kolom yang sama. Pilihan WORD_WRAPPED
User, Privilege dan Role
156
Politeknik Telkom
akan melanjutkan katakata yang tidak mencukupi ke baris yang baru pada kolom yang sama . Pilih TRUNCATE akan memotong bagian yang tidak mencukupi. *) Format yang tercantum pada table 3.7 hampir semuanya berlaku kecuali: FM, TM, U, dan X. Selain itu ada tambahan format DATE yang bertujuan untuk menampilkan nilai NUMBER sebagai Julian_date dalam format DD/MM/YY. Berikut ini diberikan sebuah contoh performatan kolom-kolom dari data-data mahasiswa. Petrintah-perintah tersebut ditulisakan di dalam script rpt_mahasiswa.sql.
--rpt_mahasiswa.sql /* Mengatur beberapa nilai system variable*/ SET PAGESIZE 600 SET LINESIZE 950 SET HEADSEP "|" SET RECSEP OFF /*Menghapus BREAKS, COMPUTES, dan COLUMNS*/ CLEAR BREAKS; CLEAR COMPUTES; CLEAR COLUMNS; /*Mengatur format kolom*/ COLUMN nim FORMAT A10 WORD_WRAPPED COLUMN nama FORMAT A20 WORD_WRAPPED COLUMN prodi FORMAT A10 WORD_WRAPPED HEADING "PRODI|JUR" COLUMN bayar FORMAT 99G999G999D99 /*Query untuk menampilkan data-data mahasiswa*/ select nim, nama, prodi, bayar from mahasiswa ORDER BY 1,2;
Simple Report
157
Politeknik Telkom
8 rows selected.
Perhatikan script dan keluaran di atas. Perhatikan pula bagian-bagian yang diberi latar abu-abu. Lebar kolom prodi ditentukan sebesar 10 karakter. Judulnya menjadi PRODI JUR dan dituliskan dalam dua baris (HEADING PRODI | JUR). Lebar kolom nama ditentukan sebesar 20 karakter dan diberikan pilihan WORD_WRAPPED. Dengan demikian maka string posisi yang lebih dari 20 karakter akan dituliskan dalam dua baris. Lihatlah nama MURDIJAT ARIF PRABOWO yang nama terakhirnya diwrap. Kolom bayar diformat dengan pemisah grup (ribuan) dan diberi tanda decimal (tanda titik). Jumlah angka pecahan decimal adalah dua angka. Sebagai catatan tambahan, semua atribut tampilan yang ditentukan oleh perintah COLUMN dapat dihapus dengan menggunakan perintah CLEAR COLUMNS.
10.1.4 Memberi Judul pada Halaman Judul halaman dapat diberikan dengan menggunakan perintah TTITLE dan BTIITLE. TTITLE untuk judul atas, sedangkan BTITLE untuk judul bawah. Bentuk umum kedua perintah ini diperlihatkan di bawah ini.
TTITLE{[printspec [text | variable ]]} [ON|OFF] BTITLE{[printspec [text | variable ]]} [ON|OFF]
158
Politeknik Telkom
Nilai printcpec bertujuan untuk menentukan spesifikasi cetak dari text atau variable. Pilihan-pilihan untuk printspec diberikan pada Tabel. Tabel Spesifikasi Cetak pada Perintah TTITLE dan BTITLE Spesifikasi Cetak Kegunaan COL n Menentukan posisi ceak dimulai dari kolom ke n. S[KIP] [n] Memulai baris baru n berikutnya dari baris sebelumnya. Jika n tidak disertakan, n=1. Jika n=0, text atau variable dicetak pada baris berikutnya TAB n Menambahkan tab maju sebanyak n.Jika n negative, yang dicetak adalah tab mundur LE[FT] | CE[NTER] | R[IGHT] Menentukan apakah judul dicetak rapat kiri, di tengah , atau rapat kanan BOLD Mencetak dengan huruf tebal. Pada SQL*Plus disimbolkan dengan mencetak text atau variable sebanyak tiga kali. Beberapa system operasi dapat menerjemahkan menjadi cetak tebal apabila dicetak ke printer FORMAT format Menentukan format. Format yang valid adalah yang berlaku untuk perintah COLUMN. Nilai variable dapat diisi dengan user variable, termasuk variable yang dibuat dengan perintah COLUMN, dan juga dapat diisi dengan nilai-nilai system SQL*Plus. Nilai-nilai system SQL*Plus dapat berupa salah satu dari daftar berikut ini. SQL.LNO, untuk menampilkan nomor dari current line. SQL.PNO, untuk menampilkan nomor dari current page. SQL.RELEASE, untuk menampilkan nomor release Oracle. SQL.ERRORCODE, untuk menampilkan kode kesalahan. SQL.USER, untuk menampilkan nama current user. Kecuali SQL.ERRORCODE, nilai-nilai pada daftar di atas dapat juga ditampilkan menggunakan perintah SHOW. Namun, perintah SHOW tidak dapat yang sudah pernah diberikan. Pilihan ON atau OFF dapat diberikan
Simple Report 159
Politeknik Telkom
untuk mengaktifkan ayau menonaktifkan TIITLE atau BTIITLE tanpa harus menghapus definisi yang sudah diberikan. Jika perintah TIITLE atau BTIITLE digunakan tanpa klausa apapun, perintah tersebut ditujukan untuk menampilkan definisi dari TIITLE atau BTIITLE yang sedang berlaku.
Jika pilihan PAGE disertakan, halaman baru akan dibuat setelah report header ditampilkan atau sebelum report footer ditampilkan. Pilihan-pilihan lainnya sama fungsinya dengan fungsi pilihan pada perintah TTITLE atau BTITLE. Tidak seperti judul halaman, report header dan report footer hanya satu kali dicetak untuk satu SELECT statement. Jika SELECT Statement menghasilkan banyak baris data sehingga membutuhkan tempat lebih dari satu halaman, judul halaman (TITILE dan BTITLE) akan dicetak sebanyak halaman yang ada. Sedangkan report header ditampilkan sebelum SELECT statement diproses dan report footer ditampilkan setelah SELECT statement diproses. Jadi, yang dianggap satu report adalah satu SELECT statement. Report header dan report footer digunakan bersama-sama dengan judul-atas dan judul-bawah halaman.
10.1.5
Menambahkan Tanggal
Untuk menambahkan konstanta tanggal, tentunya dapat digunakan perintah TTITLE. Namun, untuk menambahkan tanggal sesuai dengan tanggal script dijalankan, dibutuhkan kerjasama antara perintah COLUMN, SQL, statement, dan TTITLE/BTITLE (atau REPHEADER/REPFOOTER). Perintah
160 User, Privilege dan Role
Politeknik Telkom
COLUMN digunakan untuk menampung nilai user variable. SQL statement digunakan untuk menampung nilai SYSDATE ke dalam user variable. Perintah TTITLE digunakan untuk mencetaknya. Berikut ini diberikan sebuah contoh sederhana. Perintah COLUMN digunakan untuk membuat variable tg_skrg (NEW_VALUE) yag nilainya diambil dari kolom today. Kolom today dipilih pada SELECT statement dan nilainya adalah SYSDATE. Perintah TTITLE ditujukan untuk mencetak nilai dari variable tgl_skrg.
Pilihan OFF maupun OUT sama-sama bertujuan untuk mengakhiri spooling (semua keluaran dituliskan ke dalam file spool). Khusus untuk OUT, setelah penulisan ke file dilakukan, file tersebut dikirim ke default printer untuk dicetak sebagai hard copy. Hanya saja pada system operasi Windows, perintah SPOOL OUT tidak mendukung fungsi pencetakan tersebut. Pilihan OUT mempunyai efek yang sama dengan OFF. Berikut ini diberikan sebuah script laporan dengan melibatkan perintah SPOOL. Keluaran dari script tersebut disimpan di dalam file yang namanya dapat ditentukan oleh user. Keluaran tidak ditampilkan pada layer SQL*Plus (SET TERMOUT OFF).
Simple Report 161
Politeknik Telkom
--rpt_bayar_mahasiswa.sql -- Mengatur beberapa nilai system variable SET PAGESIZE 35 SET LINESIZE 60 SET HEADSEP ON SET RECSEP OFF SET FEEDBACK OFF -- Menghapus BREAKS, COMPUTES, dan COLUMNS CLEAR BREAKS CLEAR COMPUTES CLEAR COLUMNS -- Melakukan perhitungan jumlah pembayaran mahasiswa. BREAK ON prodi skip 2 COMPUTE avg max min of bayar on prodi --Mengatur format kolom COLUMN today NOPRINT NEW_VALUE v_today COLUMN nim FORMAT A10 WORD_WRAPPED COLUMN nama FORMAT A20 WORD_WRAPPED COLUMN prodi FORMAT A10 WORD_WRAPPED HEADING "PRODI|JUR" COLUMN bayar FORMAT 99G999G999D99 --Mengakifkan RepHeader dan RepFooter REPHEADER "--START OF REPORT--" REPFOOTER "--END OF REPORT--" --Memberi Judul TTITLE CENTER "DAFTAR MAHASISWA" SKIP CENTER"===============================================" SKIP 2 LEFT "User : " SQL.USER SKIP RIGHT "Halaman :" FORMAT 99 SQL.PNO SKIP LEFT "Tanggal :" FORMAT A20 v_today SKIP LEFT "========================================================== ===" BTITLE LEFT "---------------------------------------------------------------------------------------------"SKIP 2 --Mengaktifkan SPOOL. Nama file dapat diinput oleh user SET DEFINE ON ACCEPT file_name PROMPT "File penampung hasil report: " SPOOL &file_name
162
Politeknik Telkom
-- Query untuk menampilkan data-data mahasiswa select TO_CHAR(SYSDATE,'DD-MON-YYYY')today, nim, nama, prodi, bayar from mahasiswa ORDER BY 1,2; --Menghentikan Spool SPOOL OFF --Mengembalikan beberapa nilai system variable ke default SET FEEDBACK ON SET RECSEP WRAPPED SET TERMOUT ON
Apabila script diatas dijalankan, yang ditampilkan hanya teks untuk meminta user memasukkan nama file (dan direktori) tempat penampungan hasil laporan seperti yang ditunjukkan berikut ini. SQL> @ C:\rpt_bayar_mahasiswa.sql File penampung hasil report : C:\BelajarSQL\rpt_hasil.txt Anda dapat melihat isi file laporan yang baru saja dibuat menggunakan perintah GET atau membukanya dengan sembarang text editor. Apabila Anda meliaht isi file tersebut dengan menggunakan perintah GET, baris-baris kosong tidak akan dimunculkan. Isi file laporan tersebut adalah seperti berikut ini.
DAFTAR MAHASISWA =============================================== User : DEDY Halaman : 1 Tanggal :09-AGT-2008 -----------------------------------------------------------START OF REPORT-PRODI
Simple Report 163
Politeknik Telkom
NAMA JUR BAYAR -------------------- ---------- -------------ANGGI NOVEMBRA MI 2.000.000,00 WIDO KESUMA 2.000.000,00 MURDIJAT ARIF 15.000.000,00 PRABOWO ********** -------------avg 6.333.333,33 minimum 2.000.000,00 maximum 15.000.000,00 ANUGRAH DWI ARDIANTO TK 8.000.000,00 ANDRE ADRIAN 2.000.000,00 ANDI HAKIM ARIF 4.000.000,00 ********** -------------avg 4.666.666,67 minimum 2.000.000,00 maximum 8.000.000,00 SWANDY EFRAIM MANALU KA SITI NURFAUZIYAH 10.000.000,00 3.500.000,00
30307008 30307009 -
DAFTAR MAHASISWA =============================================== User : DEDY Halaman : 2 Tanggal :09-AGT-2008 ---------------------------------------------------------PRODI NIM NAMA JUR BAYAR ---------- -------------------- ---------- -------------********** -------------avg 6.750.000,00 minimum 3.500.000,00 maximum 10.000.000,00 --END OF REPORT--
164
Politeknik Telkom
--rpt_bayar_mahasiswa_html.sql --menjalankan terhadap output Set markup html on spool on --menentukan file dengan ekstension htm atau html Spool file_name.html --Query Select * from table_name; --mengakhiri file html Spool off --mengatur kembali ke output normal Set markup html off spool off output dalam html dan melakukan spool
Kemudian perintah diatas dieksekusi sbb: SQL> @ C:\rpt_bayar_mahasiswa_html.sql File penampung hasil report : C:\BelajarSQL\rpt_hasil.html
Simple Report
165
Politeknik Telkom
Berikut ini contohnya jika report yang telah dibuat sebelumnya dijadikan file HTML:
--Menjalankan output dalam html SET MARKUP HTML ON SPOOL ON -- Mengatur beberapa nilai system variable SET PAGESIZE 35 SET LINESIZE 60 SET HEADSEP ON SET RECSEP OFF SET FEEDBACK OFF -- Menghapus BREAKS, COMPUTES, dan COLUMNS CLEAR BREAKS CLEAR COMPUTES CLEAR COLUMNS -- Melakukan perhitungan jumlah penerimaan pegawai pertahun. BREAK ON prodi skip 2 COMPUTE avg max min of bayar on prodi --Mengatur format kolom COLUMN today NOPRINT NEW_VALUE v_today COLUMN nim FORMAT A10 WORD_WRAPPED COLUMN nama FORMAT A20 WORD_WRAPPED COLUMN prodi FORMAT A10 WORD_WRAPPED HEADING "PRODI|JUR" COLUMN bayar FORMAT 99G999G999D99 --Menonakifkan RepHeader dan RepFooter REPHEADER "--START OF REPORT--" REPFOOTER "--END OF REPORT--" --Memberi Judul TTITLE CENTER "DAFTAR MAHASISWA" SKIP CENTER"===============================================" SKIP 2 LEFT "User : " SQL.USER SKIP RIGHT "Halaman :" FORMAT 99 SQL.PNO SKIP LEFT "Tanggal :" FORMAT A20 v_today SKIP LEFT "========================================================= ====" BTITLE LEFT "--------------------------------------------------------------------------------------------"SKIP 2
166 User, Privilege dan Role
Politeknik Telkom
--Mengaktifkan SPOOL. Nama file dapat diinput oleh user SET DEFINE ON ACCEPT file_name PROMPT "File penampung hasil report: " SPOOL &file_name --Menonaktifkan pencetakan keluaran ke SQL* PLUS SET TERMOUT OFF -- Query untuk menampilkan data-data pegawai select TO_CHAR(SYSDATE,'DD-MON-YYYY')today, nim, nama, prodi, bayar from mahasiswa ORDER BY 1,2; --Menghentikan Spool SPOOL OFF --Mengembalikan beberapa nilai system variable ke default SET FEEDBACK ON SET RECSEP WRAPPED SET TERMOUT ON SET MARKUP HTML OFF SPOOL OFF;
User :
Simple Report
167
Politeknik Telkom
NIM
NAMA MI
PRODI JUR
30107001 ANGGI NOVEMBRA 30107003 WIDO KESUMA MURDIJAT ARIF 30107004 PRABOWO
********** ------------avg minimum maximum ANUGRAH DWI 30207005 ARDIANTO 30207006 ANDRE ADRIAN 30207007 ANDI HAKIM ARIF avg minimum maximum SWANDY EFRAIM 30307008 MANALU 30307009 SITI NURFAUZIYAH avg minimum maximum KA TK 6.333.333,33 2.000.000,00 15.000.000,00 8.000.000,00 2.000.000,00 4.000.000,00 ********** ------------4.666.666,67 2.000.000,00 8.000.000,00 10.000.000,00 3.500.000,00 ********** ------------6.750.000,00 3.500.000,00 10.000.000,00
168
Politeknik Telkom
10.4 JURNAL
1. 2. Berdasarkan contoh-contoh yang ada buatlah report untuk transaksi-transaksi yang terjadi dalam proses jual beli buku yang ada di modul 1 (format report harus sejelas dan selengkap mungkin)! Dari report yang ada di nomor 1 buatlah output HTML!
Simple Report
169
Politeknik Telkom
11
Overview
DBA (Database Administrator) perlu mengendalikan hak-hak dan akses pemakai untuk keperluan penjagaan terhadap penyalahgunaan hak-hak. Pada bab ini akan dibahas pembuatan, pembuangan dan pengubahanpengubahan pemakai.
Tujuan
1. 2. 3. 4. 5. 6. 7. 8.
Mampu membuat user pada oracle Mampu memonitor user. Mampu melakukan manipulasi pada user. Mampu mengenal obyek dan system privilages. Mampu untuk memberikan privilages kepada user. Mampu mengerti tentang roles dan menggunakannya. Mampu membuat dan memodifikasi roles. Mampu melakukan controlling dan removing pada roles.
170
Politeknik Telkom
11.1.2
Literatur oracle sering sekali mamakai kata schema, dan kata ini dipakai secara kurang hati-hati. Oracle memiliki operasi CREATE SCHEMA, namun tidak ada operasi DROP SCHEMA dan ALTER SCHEMA. Schema didefinisikan sebagai kumpulan objek-objek yang dimiliki pemakai/user. Kumpulan objek yang dimiliki pemakai SYSTEM membentuk schema SYSTEM. Kumpulan objek yang dimiliki SCOTT membentuk schema SCOTT. Anda dapat melihat bahwa kadang ada literature atau piranti yang menyebutkan CREATE SCHEMA namun tidak membuat objek sama sekali. Dalam hal tersebut, lebih tepat jika piranti meyatakan CREATE USER. Pemakain schema lebih tepat diterapkan pada topic data warehouse, saat membicarakan star schema. Selain itu dengan adanya schema semakin memperbanyak tree dalam beberapa piranti (termasuk oracle enterprise manager).
11.1.3
Ada suatu istilah lagi yang terkait dengan user yaitu account. Istilah ini kelihatannya tidak begitu tepat dalam konteks pemakai database. Saat kita menyatakan LOCK atau UNLOCK suatu account pada dasarnya kita melakukan LOCK USER atau UNLOCK USER.
11.1.4
CREATE USER
Hanya dengan hak DBA saja yang bisa melakukan CREATE USER. Pertama anda connect sebagai pemakai dengan hak DBA untuk melakukan langkah-langkah berikut ini. Kita mulai dengan sintaks sederhana operasi CREATE USER.
User, Privilege dan Role 171
Politeknik Telkom
CREATE USER user_name IDENTIFIED EXTERNALLY | {by password} [ DEFAULT TABLESPACE tablespace_name ] [ TEMPORARY TABLESPACE tablespace_name ] [ ACCOUNT {LOCK|UNLOCK}];
Contoh :
CREATE USER scott2 IDENTIFIED BY tiger DEFAULT TABLESPACE mahasiswa TEMPORARY TABLESPACE temp_ mahasiswa;
Pilihan diatas adalah pembuatan pemakai yang diautentifikasi oleh password. Misalkan kita ingin membuat user scott3 yang diidentifikasi secara external oleh OS. Sintaks yang lengkap dapat dilihat dibuku manual ORACLE.
CREATE USER scott3 IDENTIFIED EXTERNALLY DEFAULT TABLESPACE praktikum TEMPORARY TABLESPACE temp_praktikum;
Sangat sulit mengecek effektifitas dan konsekuensi autentikasi lewat cara ini.
11.1.5
ALTER USER
Mengubah pemakai dilakukan dengan operasi ALTER USER. Perubahan yang perlu biasanya mencakup perubahan password, default tablespace, temporary tablespace, profile, quota, dan status penguncian. Contoh berikut menyangkut pengubahan pemakai, memaksa pemakai untuk mengubah passwordnya.
ALTER USER scott2 IDENTIFIED BY peterpan PASSWORD EXPIRE;
172 User, Privilege dan Role
Politeknik Telkom
Pemanggilan operasi berikut merubah quota pemakai scott2 sehingga tidak bisa membuat objek di tablespace praktikum. Perhatikan bahwa tidak ada penyebutan tipe TABLESPACE .
ALTER USER scott2 QUOTA 0 MON MAHASISWA;
11.1.6
DROP USER
Aturannya sebagai berikut : Jika pemakai tidak memiliki objek maka penyebutan CASCADE tidak perlu dilakukan. Sekalipun CASCADE dispesifikasikan, pembuangan pemakai bisa gagal yang disebabkan oleh : i. Mencoba membuang pemakai/user SYS dan SYSTEM. Hal ini disebakan karena kedua user ini tidak bisa dibuang. ii. Mencoba membuang user yang masih connect ke service. Perhatikan bahwa tidak ada operasi untuk hanya membuang obyek-obyek seorang pemakai tanpa membuang pemakai tersebut. DBA harus menulis program khusus untuk hal itu.
11.1.7
MONITORING USER
Berikut metadata views untuk memantau pemakai ; iii. DBA_users : berisi informasi seluruh user yang dimiliki oleh DBA iv. DBA_TS_Quotas : berisi informasi tentang tablespace quota bagi setiap pemakai. v. V$session : untuk melihat user yang sedang connect ke system Coba lakukan perintah selectin berikut :
SELECT * FROM DBA_users;
173
Politeknik Telkom
Perintah diatas digunakan untuk menampilkan semua informasi users yang dimiliki DBA
SELECT * FROM DBA_TS_Quotas;
Perintah diatas digunakan untuk menampilkan semua informasi tablespace masing-masing user
SELECT * FROM V$session;
quota
Perintah diatas digunakan untuk menampilkan semua user yang connect ke system
11.2 PRIVILEGES
Salah satu model keamanan dalam penggunaan DBMS kita adalah adanya privilege(hak). Model keamanan ini biasa diapakai di OS(operating system) maupun server lainnya.
11.2.1
Operasi-operasi
Operasi-operasi untuk privilege terbatas pada GRANT dan REVOKE. Operasi GRANT memberikan hak akses kepada satu atau lebih pemakai, sebaliknya operasi REVOKE membuang hak akses dari satu atau lebih pemakai. Apa saja hak-hak yang diperoleh seorang pemakai/user apabila DBA memberi grant role connect dan resource, kita bisa memberikan jawabannya dengan melihat metadata view berikut. 1. connectlah sebagai DBA 2. jalankan perintah
DESCRIBE DBA_sys_privs;
SQL> set line 10; SQL> desc dba_sys_privs; Name -----------------------GRANTEE PRIVILEGE ADMIN_OPTION
174
Type
Politeknik Telkom
Scott berhak merubah session, membuat cluster, database link, type, sequence, session, synonym, view, cluster, indextype, operator, procedure, sequence, table, dan trigger. Privilage terbagi menjadi dua jenis yaitu system-level dan object-level. Kita akan pelajari keduanya. Sebelum itu mari kita buat seorang user lagi.
CREATE USER scotti IDENTIFIED BY tiger DEFAULT TABLESPACE mahasiswa TEMPORARY TABLESPACE temp_ mahasiswa; GRANT conncet, resource to scotti;
175
Politeknik Telkom
11.2.1.1
System-level privileges
System level privilege tidak terkait dengan object tertentu secara spesifik. Semua (15) privilege yang kita lihat diatas adalah system level, tak terkait dengan suatu object tertntu secara spesifik. Ada lebih dari 80 system level privilege dalam oracle RDBMS. DBA berhak untuk men-drop user dan backup tables.
11.2.1.2
Object-level privileges
Privilege ini terkait dengan object tertentu secara spesifik. Misal user bernama scott9 memiliki dua object (bertipe sama maupun bukan). Jika scott9 hanya memberi object level privilege kepada scotti, maka scotti tak otomatis memiliki object level privilege terhadap object yang satu lagi. Mari kita lihat contoh dibawah
SQL> connect scott9 Enter password: ***** Connected. SQL> create table satu( a number, b varchar(9)); Table created. SQL> insert into satu values(1,'x'); 1 row created. SQL> create table dua( c number, d varchar(9)); Table created. SQL> insert into dua values(1,'x'); 1 row created. SQL> GRANT SELECT ON satu TO scotti; Grant succeeded.
176 User, Privilege dan Role
Politeknik Telkom
SQL> connect scotti@basdat/tiger; Connected. SQL> select * from scott9.satu; A B --------- --------1 x 2 y SQL> select * from scott9.dua; select * from scott9.dua * ERROR at line 1: ORA-00942: table or view does not exist
Scotti dapat mengakses table satu milik scott9 tetapi tidak bisa mengakses table dua milik scott9, karena scotti tidak diberi akses oleh scott9 untuk mengakses table dua.
11.2.2
REVOKE PRIVILEGES
Sekarang kita akan mencoba mnghapus hak akses scotti terhadap table satu. Ikuti langkah berikut : 1. masuk sebagai user scott9 2. jalankan perintah berikut SQL> revoke select on satu from scotti; Revoke succeeded. 3. 4. masuk sebagai user scotti jalankan selection terhadap table satu milik scott9
SQL> select * from scott9.satu; select * from scott9.satu * ERROR at line 1: ORA-00942: table or view does not exist Terlihat bahwa revoke telah menghilangkan hak akses terhadap suatu object. Revoke hanya dapat dilakukan oleh pemberi hak akses.
User, Privilege dan Role 177
Politeknik Telkom
11.2.3
Sekarang kita akan melihat model keamanan yang melibatkan privilege dan role. Untuk memudahkan pemahaman mari kita lihat gambar berikut
PRIVILEGE Granted to
ROLE Granted to
USER
Keterangan : satu atau lebih privilege bisa di grant ke role satu atau lebih role bisa digrant ke role satu atau lebih role bisa di grant ke user satu atau lebih privilege bisa di grant ke user.
11.3 ROLES
Role adalah sekumpulan named set of privilege. Operasi-operasi yang terdapat pada role adalah CREATE, ALTER, dan DROP, satu operasi SET untuk pengaktifan ditambah dengan dua operasi GRANT dan REVOKE (seperti untuk privilege). Role dibuat untuk mempermudah pengelolaan privilege.
178
Politeknik Telkom
11.3.1
Role CONNECT RESOURCE DBA
EXP_FULL_DATABASE IMP_FULL_DATABASE
11.3.2
Creating Roles
Membuat role dialakukan dengan operasi CREATE ROLE. Ada syarat agar seorang pemakai dapat menggunakan hak ini(membuat role), yaitu harus memiliki hak akses untuk membuat role(CREATE ROLE). Secara default hak ini tidak diberikan ke pemakai jadi DBA harus memberikan hak ini secara explicit. 1. masukklan sebagai user anda 2. jalankan perintah berikut
SQL> CREATE ROLE mahasiswa; Role created.
11.3.3
Operasi GRANT
Operasi GRANT dipakai untuk meng-assign privilege atau role kepada role. Pertama kita akan memberikan sebuah privilege kepada role mhs_role berupa kemampuan untuk selection kepada table mahasiswa.
SQL> grant select on mahasiswa to mhs_role; Grant succeeded.
179
Politeknik Telkom
Kita akan memberikan role yang telah kita buat kepada pemakai kita yaitu scotti. Jalankan perintah SQL berikut
SQL> GRANT mhs_role to scotti; Grant succeeded.
11.3.4
Memakai Roles
Untuk menggunakan role mhs_role tadi oleh scotti maka scotti harus melakaukan SET terhadap role tersebut
SQL> set role mhs_role; Role set. SQL> select * from scott9.mhs; NIM NAMA ----------- -------------------30108001 paijo 30108002 paimen
11.3.5
Removing Roles
Operasi yang digunakan adalah REVOKE 1. masukklah sebagai scott9 2. jalankan SQL berikut SQL> REVOKE mahasiswa from scotti; Revoke succeeded. 3. masuklah sebagai scotti jalankan perintah berikut
180
Politeknik Telkom
SQL> select * from scott9.mhs; select * from scott9.mhs * ERROR at line 1: ORA-00942: table or view does not exist
11.3.6
Mengubah Roles
Operasi ALTER ROLE diapakai untuk mengubah tingkat kerahasiaan. Sintaks : ALTER : ROLE name {NOT IDENTIFIED | IDENTIFIED {BY Contoh ALTER ROLE mhs_role NOT IDENTIFIED; password | EXTERNALLY }; ALTER ROLE mhs_role IDENTIFIED BY SCOTT9; ALTER ROLE mhs_role IDENTIFIED EXTERNALLY;
11.3.7
Membuang Roles
Sama seperti membuang table, index, type dan yang lainnya, yaitu menggunakan operasi DROP. SQL> connect scott9@basdat/tiger Connected. SQL> drop role mahasiswa; Role dropped. Perhatikan efeknya, hak hak yang diperoleh dalam role tersebut akan hilang SQL> connect scotti@basdat/tiger Connected. SQL> select * from scott9.mhs; select * from scott9.mhs *
User, Privilege dan Role 181
Politeknik Telkom
ERROR at line 1: ORA-00942: table or view does not exist Untuk melihat role yang dimiliki anda bis amenjalankan perintah SQL berikut
SQL > select * from role_sys_privs PRIVILEGE ------------------------------------- -------ALTER SESSION CREATE CLUSTER CREATE DATABASE LINK CREATE SEQUENCE CREATE SESSION CREATE SYNONYM CREATE TABLE CREATE VIEW CREATE CLUSTER CREATE INDEXTYPE CREATE OPERATOR CREATE PROCEDURE CREATE SEQUENCE CREATE TABLE CREATE TRIGGER CREATE TYPE AD NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
ROLE -----------------CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT RESOURCE RESOURCE RESOURCE RESOURCE RESOURCE RESOURCE RESOURCE RESOURCE 16 rows selected.
Untuk melihat role yang sedang digunakan SQL > select * from session_roles; ROLE -----------------------------CONNECT RESOURCE
182
Politeknik Telkom
11.4 JURNAL
Dari studi kasus di modul yang pertama buatlah skema user privileges dan role sebagai berikut: 1. Terdapat user biasa (pengunjung) yang dapat melihat dan mencari katalog buku melalui aplikasi yang disediakan (hanya dapat melakukan operasi select). Terdapat user kasir yang otoritasnya hanya dapat melihat data buku dan mengolah/memanipulasi data-data transaksi. 2. Terdapat user administrasi logistik yang memiliki otoritas penuh terhadap semua tabel kecuali tabel-tabel transaksi. 3. Terdapat user manager yang hanya dapat melakukan view ke semua tabel. 4. Terdapat user administrator yang memiliki akses penuh ke semua tabel dan schema dan dapat memberikan akses yang dimilikinya ke user yang lain.
183
Politeknik Telkom
12
Overview
Tujuan dari seorang administrator database ialah untuk memastikan suatu database dapat digunakan dan tersedia pada saat user membutuhkan. Sebagai support dari tujuan tersebut, database administrator membutuhkan Backup dan Recovery untuk menjaga available data
Tujuan
1. 2. 3.
Mahasiswa memahami konsep dan terminologi Backup / Recovery. Mahasiswa dapat mengimplementasikan Backup / Recovery. Mahasiswa dapat meyelesaikan berbagai persoalan yang terkait dengan Backup and Recovery.
184
Politeknik Telkom
Issue dari Backup dan Recovery bagi administrator database yaitu: mengantisipasi terjadinya suatu failure pada database meningkatkan mean time between failure mengurangi mean time to recover dan mengurangi terjadinya loss data Backup berarti suatu kegiatan untuk menyimpan database dalam bentuk datafile, control file dan archieve log ke dalam media penyimpanan lain seperti disk atau tape. Sedangkan Recovery merupakan suatu proses untuk mengupdate database dengan file Backup yang telah disimpan terakhir kalinya. Ada dua cara untuk melakukan Backup dan Recovery, yaitu : 1. 2. Physical Backup Contohnya : RMAN Backup dan Restore Logical Backup Contohnya : Export dan Import, Flashback
Dalam melakukan backup dan Recovery pada oracle 10g, disediakan tampilan web ( Enterprise Manager ) sehingga memudahkan admin database untuk melakukan administrasi. Berikut beberapa hal yang perlu dilakukan apabila akan melakukan backup dan Recovery pada Enterprise Manager : 1. 2. 3. 4. 5. 6. 7. 8. Konfigurasi setting backup dan kebijakan ( policy ) Menentukan DBID dan DB_UNIQUE_NAME Melakukan backup seluruh database Melakukan backup database dengan Strategi Oracle-suggested Melakukan restoring dan recovery database dengan menggunakan strategi oracle-suggested Flashback table Flashback Drop Mengatur backup
185
Politeknik Telkom
2. 3.
Pilih Backup Setting di bagian Backup/Recovery Settings. Arahkan ke host credential di halaman Backup Setting. Kemudian masukkan username dan password system operasi kita. Kemudian arahkan ke bagian disk setting.
186
Politeknik Telkom
4.
Terima nilai 1 di kolom parallelism di bagian disk setting pada halaman device. Kolom lokasi disk Backup diset kosong jadi untuk backup akan digunakan flash Recovery area. Pilih backup set untuk tipe disk backup. Kemudian klik test disk Backup.
5. 6. 7. 8.
Akan ada tampilan pesan bahwa test disk setting untuk backup telah sukses. Sekarang kita akan mengkonfigurasi settingan kebijakan untuk backup. Klik policy untuk mengakses halaman policy. Pilih Automatically Backup untuk control file dan server parameter file (spfile) dengan pengubahan struktur database dan backup database. Pilih optimize seluruh database dengan melewatkan file yang sudah di backup.
187
Politeknik Telkom
9.
10. Masukkan nama untuk block change tracking file. Kemudian arahkan ke bagian retention policy. 11. Pilih Retain Backup that are necessary for a Recovery to any time within the asecified number of days (point-in-time Recovery) dan terima jumlah harinya yaitu 31 hari.
Politeknik Telkom
189
Politeknik Telkom
3.
Halaman berikutnya akan tampil hasil eksekusi diatas yang menunjukkan db_unique_name di kolom nama dan db_unique_name value yaitu orcl di kolom value
Berikut langkah-langkah untuk menentukan DBID : 1. 2. Klik controlfiles di bagian storage pada halaman administration. Halaman control files muncul. Pilih property advanced.
190
Politeknik Telkom
3.
191
Politeknik Telkom
192
Politeknik Telkom
4.
Halaman Schedule Customized Backup : Options muncul. Pilih Full Backup di bagian Backup Type. Kemudian pilih Online Backup di bagian Backup Mode. Pilih Back up all archieved logs on disk di bagian Advanced. Klik Next.
5.
Halaman Schedule Customized Backup : Settings muncul. Pilih Disk atau Tape, terserah kita akan membackup data dimana ( pada contoh ini kita menggunakan disk sebagai tempat beackup ). Klik Next.
193
Politeknik Telkom
6.
Halaman Schedule Customized Backup : Schedule muncul. Kita dapat mengubah atau membiarkan Job Name dan Job Description. Pilih Immediately untuk mengeksekusi tugas tersebut secepat mungkin atau memasukkan waktu untuk mengeksekusi waktu pada waktu tertentu. Kemudian Klik Next.
194
Politeknik Telkom
7.
8.
Kemudian akan tampil pesan bahwa permintaan untuk Submit telah sukses. Klik OK
Note : kita hanya bisa melakukan backup secara online jika database kita berada pada mode archive
195
Politeknik Telkom
196
Politeknik Telkom
3.
Pilih disk sebagai tujuan dari tempat backup yang akan kita coba. Kemudian klik Next.
4.
Halaman Schedule Backup : Setup muncul. Baca kembali informasinya klik Next
197
Politeknik Telkom
5.
Halaman Schedule Backup : Schedule muncul. Baca kembali informasinya dan sesuaikan tanggal dan waktu sesuai keperluan kita. Kemudian Klik Next
198
Politeknik Telkom
6.
Halaman Schedule Backup : Review muncul. Baca kembali informasinya dan klik Submit Job.
Halaman Status akan muncul dengan sebuah pesan yang menunjukkan bahwa job telah didaftarkan dengan sukses. Kita dapat klik View Job untuk mengakses halaman status job atau klik OK untuk melengkapi operasi tersebut. Note : backup dengan strategi Oracle-suggested dilakukan secara incremental.
7.
199
Politeknik Telkom
200
Politeknik Telkom
4.
Halaman Recovery Wizard kemudian muncul dan memberitahu jika instance akan di matikan (shutdown ) dan dihidupkan kembali (restarted). Klik Refresh untuk lanjut menggunakan Recovery Wizard.
5.
Kita kembali ke halaman Maintenance. klik Perform Recovery. masukkan host credentials. klik Perform Whole Database Recovery untuk merecovery database.
201
Politeknik Telkom
6.
Halaman Perform Recovery : Point-in-time muncul. Pilih Recover to the current time. Klik Next.
7.
Halaman Perform Recovery : Rename muncul. Pilih No. Restore the files to the default location jika itu pilihan kita atau pilih Yes. Restore the file to a new, commen location dan kemudian masukkan lokasinya. Klik Next.
202
Politeknik Telkom
8.
Halaman Perform Recovery : Review kemudian muncul. Baca kembali informasi dan klik Submit.
9.
Kemudian akan muncul pesan Operation succeeded. Klik Ok. Note : proses ini hanya dapat dilakukan jika spfile dan controlfile tidak hilang atau rusak.
203
Politeknik Telkom
12.6.1
Enable Row Movement dilakukan pada tabel-tabel tertentu, misalnya kita memiliki tabel HR.REGIONS. 1. 2. Klik Administration di halaman Oracle Database Home. Halaman property Administration kemudian muncul. Pilih Tables di bagian Schema.
3.
Halaman Tables kemudian muncul. Masukkan HR di bagian Schema dan Regions di kolom Object Name. klik Go.
204
Politeknik Telkom
4.
5.
205
Politeknik Telkom
6.
Pilih Yes dari menu drop-down Enable Row Movement. Klik Apply.
206
Politeknik Telkom
7.
Kemudian kita akan menerima sebuah pesan yang menyatakan bahwa tabel telah dengan sukses di modifikasi. Kemudian pilih Tables.
12.6.2
Sekarang kita akan mensimulasikan error yang disebabkan karena perubahan data di tabel regions. 1. Lihat data di tabel regions dengan membuka sql plus dan mengeksekusi perintah berikut
3.
12.6.3
Berikut langkah-langkah untuk melakukan flashback pada tabel : 1. Pastikan bahwa REGIONS masih terpilih di daftar tabel. Pilih Flashback Table dari menu drop-down. Klik Go.
207
Politeknik Telkom
2.
Halaman Perform Recovery : Point-in-time kemudian muncul. Pilih Flashback to a timestamp dan masukkan tanggal dan waktu beberapa menit yang lalu. Klik Next.
208
Politeknik Telkom
3.
Halaman Perform Recovery : Flashback Tables muncul. Baca kembali informasi di halaman tersebut kemudian klik Next.
209
Politeknik Telkom
4.
Halaman Perform Recovery : Review muncul. Baca kembali informasnya dan kemudian klik Submit.
5. 6.
Kita akan menerima konfirmasi bahwa tabel telah di flashback. Klik Ok. Sekarang pindah ke sesi sql*plus dan eksekusi perintah untuk melihat operasi flashback tabel yang telah kita lakukan : Select * from regions;
210
Politeknik Telkom
12.6.4
Flashback Drop
Pada bagian ini kita akan menggunakan fitur flashback drop untuk mengembalikan sebuah tabel yang telah di drop. Sebagai latihan, akita akan membuat sebuah tabel, menghapus tabel, kemudian mengembalikannya dengna menggunakan flashback drop. Berikut langkah-langkah untuk membuat tabel baru dan kemudian kita hapus tabel tersebut : 1. Masukkan HR di kolom Schema dan REGIONS di kolom Object Name atau sebagian dari nama di kolom Object Name dan klik Go.
211
Politeknik Telkom
2.
Pilih Create Like dari menu drop down actions. Klik Go.
3.
Halaman untuk membuat tabel kemudian muncul. Masukkan REG_HIST di kolom nama. Jangan klik Not Null pada kolom REGION_ID. Klik Constraints.
212
Politeknik Telkom
4.
Halaman Constraints kemudian muncul. Hapus constraint pada tabel dengan memilihnya satu-satu kemudian klik delete.
5.
213
Politeknik Telkom
6.
Kita akan menerima pesan yang menyatakan bahwa tabel telah dibuat. Kemudian masukkan REG_HIST ke dalam kolom Object Name dan klik Go.
7.
Halaman Tables kemudian ditampilkan dengan tabel REG_HIST di bagian Results. Klik Delete untuk menghapus tabel REG_HIST.
214
Politeknik Telkom
8.
9.
Kemudian dikeluarkan pesan yang menandakan bahwa proses penghapusan tabel telah dieksekusi. Klik Go untuk mencari tabel. 10. Tidak ada yang akan ditampilkan di bagian Result Displayed in the results section. Untuk mengembalikan tabel yang telah terhapus, kita dapat melakukan flashback drop. Berikut langkah-langkahnya :
Backup and Recovery 215
Politeknik Telkom
1. Pilih Recycle Bin 2. Inputkan HR di kolom nama Schema dan klik Go.
3.
216
Politeknik Telkom
4.
5.
Halaman Perform Recovery : Rview kemudian muncul. Baca kembali informasi tersebut kemudian klik Submit.
217
Politeknik Telkom
6. 7. 8.
Kemudian akan muncul pesan konfirmasi. Klik Ok Tabel tersebut tidak lagi berada di Recycle Bin. Klik Tables. Sekarang tabel REG_HIST telah ada di daftar tabel.
Menggunakan halaman untuk mem backup database yang ada pada waktu ini Backup crosschecking Menghapus backup yang sudah expired Menghapus backup yang Obsolete Menkitakan backup menjadi tidak ada (unavailable) Membuat catalog untuk backup
Politeknik Telkom
12.7.1 Menggunakan halaman untuk membackup database yang ada pada waktu sekarang
1. Klik Manage Current Backups pada bagian Maintenance > Backup/Recovery.
219
Politeknik Telkom
2.
Halaman Manage Current Backups muncul. Halaman Backup Sets akan menunjukkan backup yang ada di RMAN repository. Klik link di kolom Contents untuk melihat detail informasi mengenai isi dari backup.
3.
Halaman Contents kemudian muncul. Klik Manage Currents Backups untuk kembali.
220
Politeknik Telkom
4.
5.
Halaman Image Copies kemudian memperlihatkan jika image copies yang telah disimpan di RMAN repository.
12.7.2
Backup Crosschecking
Saat kita melakukan crosschecking sebuah backup, RMAN akan memverifikasi bahwa informasi yang disimpan di repository sesuai dengan yang ada di backup secara fisik. Jika tidak sesuai, repository akan di update sesuai dengan status yang ada sekarang. Kita dapat melakukan crosscheck seluruh database kita dengan langkah-langkah berikut : 1. 2. Klik Manage Backups di bagian Backup/Recovery Halaman Manage Current Backups kemudian muncul. Klik Crosscheck All dibagian kanan atas untuk melakukan crosscheck semua file yang ada di RMAN repository.
221
Politeknik Telkom
3.
Halaman Crosscheck All : Specify Job Parameters muncul. Kita dapat menerima nama job standard untuk nama job, deskripsi job, waktu mulai, dan ulangi spesifikasinya atau masukkan nilai yang kita inginkan. Klik Submit Job untuk memasukkan job untuk crosscheck.
4.
Sebuah pesan bahwa permintaan job telah sukses kemudian ditampilkan. Kemudian klik View Job untuk melihat status dari job tersebut.
222
Politeknik Telkom
5.
223
Politeknik Telkom
12.7.3
1. 2.
Klik Manage Current Backups pada bagian Backup/Recovery di halaman Maintenance. Halaman Manage Current Backups muncul. Klik Delete All Expired di atas halaman untuk menghapus RMAN repository semua backup yang terdeteksi sebagai backup yang usang.
3.
Halaman Delete All Expired: Specify Job Parameters kemudian muncul. Kita bisa membiarkan standar untuk nama Job, deskripsi job, waktu mulai, dan spesifikasi yang berulang atau memasukkan nilai tertentu. Pilih Perform the operation Crosscheck All before Delete All Expired. Jika kita tidak melakukan operasi crosscheck. Kli k Submit Job untuk memasukkan job tersebut.
224
Politeknik Telkom
4.
Kemudian pesan yang mengatakan jika Job Submission sukses ditampilkan. Kita dapat memilih View Job untuk melihat status dari Job.
5.
225
Politeknik Telkom
3.
Halaman Delete All Obsolete: Specify Job parameters kemudian muncul. Kita dapat menerima standar untuk nama Job, deskripsi Job, waktu mulai dan spesifikasi yang diulang-ulang atau masukkan nilainya sendiri. Klik Submit Job untuk mendaftar job tersebut.
226
Politeknik Telkom
4.
Kemudian akan muncul pesan konfirmasi bahwa pendaftaran job telah sukses didaftarkan dan kemudian ditampilkan pada halaman Manage Current Backups. Kita dapat memilih View job untuk melihat status dari job.
5.
227
Politeknik Telkom
6.
Kembali ke halaman Image Copies atau Backup Sets untuk memastikan bahwa Backup yang usang telah dihapus.
3. 4.
228
Sebuah halaman akan ditampilkan. Klik Yes untuk melanjutkan operasi. Halaman permintaan sedang dalam keadaan progress ditampilkan.
Politeknik Telkom
12.7.6
Kita dapat mengklasifikasikan backup dengan perintah system operasi sehingga RMAN dapat menggunakan mereka dalam sebuah operasi Recovery. Sebagai contoh, disini kita akan melakukan backup datafile yang termasuk ke dalam contoh table space dengan menggunakan perintah system operasi. Kemudian kita bisa mengklarifikasikan file backup di RMAN repository dengan menggunakan Enterprise Manager. Berikut langkah-langkahnya : 1. Buka SQL*Plus dan login sebagi user dengan hak akses sebagai SYSDBA. Disini kita diberikan pilihan untuk melakukan backup online pada sebuah tablespace. Missal dilakukan backup pada tablespace example.
2.
Kembali ke promt system operasi dan buatlah sebuah salinan system dan membuat salinan dari datafile yang termasuk ke dalam directory baru yaitu backup. Kita dapat menggunakan directory lain terserah keinginan.
229
Politeknik Telkom
3.
Ambil contoh table space yang akan melakukan online backup dengan mengunakan perintah di bawah ini :
4.
5.
Sekarang kita lakukan catalog backup di RMAN repository dengan menggunakan Database Control Enterprise Manager. Klik Manage Current Backups di bagian Backup/Recovery pada halaman Maintenance. Pilih Catalog Additional Files pada bagian kanan atas halaman
230
Politeknik Telkom
6.
Pilih Catalog files in the specified disk location into the Recovery Manager repository dan masukkan lokasi dan nama dari backup file. Klik Ok.
7. 8.
Halaman progress untuk permintaan ditampilkan. Sebuah pesan konfirmasi menyatakan jika file telah dikatalog-kan.
12.8 JURNAL
1. Buatlah sebuah database dengan nama sesuai nim anda, kemudian bikin tabel dan diisi sesuai studi kasus pada bab sebelumnya . lakukan strategi fullbackup terhadap database anda. Dari database yang telah anda bikin, lakukan operasi flashback tabel. Recover seluruh database anda mengunakan strategi full recovery. Cari cara bagaimana melakukan backup dan recovery menggunakan perintah RMAN (console based)?
2. 3. 4.
231
Politeknik Telkom
13
Overview
Memungkinkannya transaksi dapat dilakukan secara konkuren menimbulkan suatu permasalahan tentang pengaturan resource. Dalam pengaturan resource dibutuhkan suatu lock agar si pengakses data tidak mengalami interupt dari transaksi lain.
Tujuan
1. 2. 3.
Mahasiswa memahami konsep Locking pada Oracle. Mahasiswa memahami cara mendeteksi lock conflicts. Mahasiswa mampu mengatasi deadlock.
232
Politeknik Telkom
13.1 Locks
Istilah lock pada database berarti suatu kunci atau penguncian. Lock digunakan pada saat terjadi pengaksesan database oleh user secara bersamaan. Hal ini ditujukan untuk menjaga data agar tidak corrupt / hilang atau data yang tidak valid pada saat banyak user mengakses database secara bersamaan / konkuren. Sebelum database mengijinkan suatu sesi user untuk memodifikasi data, pertama-tama sesi me-lock data yang akan dimodifikasi. Lock memberikan exclusive control terhadap suatu data pada sebuah sesi sehingga tidak akan ada transaksi lain yang dapat memodifikasi data yang ter-lock sampai lock terhadap data tersebut telah di lepas. Transaksi dapat melakukan lock pada sebuah row data dari suatu tabel, multiple row data dari suatu tabel, atau satu tabel itu sendiri yang di lock. Oracle 10g memiliki mekanisme lock secara manual dan otomatis. Ada dua mekanisme untuk melakukan locking data pada database yaitu : 1. Pessimistic Locking Proses locking yang terjadi pada saat lock di request maka record atau table akan di lock secara immediate / langsung. 2. Optimistic Locking Proses locking yang terjadi pada saat suatu record / data pada database dilakukan suatu perubahan / update.
LockHandling
233
Politeknik Telkom
MODE;
Politeknik Telkom
antrian sampai transaksi yang mempunyai lock pada tabel tersebut telah selesai ( commit ). Sesi 1 : locking table karyawan in exclusive mode
LockHandling
235
Politeknik Telkom
Sesi 1 : commit ( transaksi telah berakhir dan locking terhadap tabel karyawan di release )
236
Politeknik Telkom
EXCLUSIVE lock adalah lock yang paling tinggi derajatnya. Berikut ini beberapa lock mode yang ada pada Oracle : 1. ROW SHARE Mengijinkan konkuren akses / akses secara bersama-sama pada tabel yang di lock, tetapi user yang lain tidak dapat member lock exclusive pada tabel yang diberi share lock sampai share lock di lepas. user yang tidak melakukan lock pada tabel, masih dapat mengakses data. ROW EXCLUSIVE Sama dengan ROW SHARE, tetapi tidak diperbolehkan user lain untuk memberi SHARE mode sebelum lock sudah di lepas.Terjadi secara otomatis pada saat terjadi updating, inserting, atau deleting suatu data. SHARE Mengijinkan proses query yang konkuren / bersama-sama tetapi tidak diperbolehkan untuk mengubah mode lock tabel. SHARE lock dibutuhkan ( dan secara otomatis diminta ) untuk membuat index pada tabel. SHARE ROW EXCLUSIVE Digunakan untuk melakukan query pada keseluruhan data pada tabel dan memberi akses kepada sesi user lain untuk melakukan query pada tabel tetapi tidak diperbolehkan sesi user yang lain untuk memberi lock pada tabel serta tidak diperbolehkan untuk mengupdate data pada tabel. EXCLUSIVE Mengijinkan sesi user yang lain untuk melakukan query pada tabel yang di lock tetapi tidak diperbolehkan melakukan suatu aktivitas yang lain selain query pada tabel tersebut. Exclusive lock dibutuhkan pada saat proses drop suatu tabel.
2.
3.
4.
5.
Seperti beberapa permintaan untuk lock, eksekusi statement lock secara manual terdapat antrian sampai sesi statement yang lain telah memiliki lock, atau telah melepas lock. perintah LOCK dapat menerima special argument untuk mengontrol proses menunggu yaitu menggunakan NOWAIT.
LockHandling
237
Politeknik Telkom
238
Politeknik Telkom
2.
Politeknik Telkom
sesi lock dan kembali ke antrian. Sebagai contohnya, misalkan terdapat sebuah sesi yang memegang mode shared lock pada suatu tabel. Sesi tersebut dapat merubah dari shared lock ke exclusive lock, selama tidak ada sesi lain yang sedang memiliki exclusive lock atau share lock pada tabel tersebut. Maka sesi yang memegang shared lock akan di beri grant / hak akses untuk mendapatkan exclusive lock tanpa harus menunggu di antrian terlebih dahulu.
240
Politeknik Telkom
Transaction 1 UPDATE hr.employees SET salary=salary+100 WHERE employee_id=100 ; 1 row updated. UPDATE hr.employees SET COMMISION_P CT=2 WHERE employee_id=101 ; Sesi menunggu karena terjadi lock konflik. Sesi masih menunggu di antrian!!
Time 9:00:00
Transaction 2 UPDATE hr.employees SET salary=salary+100 WHERE employee_id=101; 1 row updated. SELECT sum(salary) FROM hr.employees; SUM(SALARY) --------------------895463
9:00:05
16:30:00
1 row updated.
16:30:01
Terjadi transaksi yang banyak dalam waktu 7.5 jam, tetapi belum ada commit atau rollback Commit;
pada kasus diatas, transaksi 2 mendapatkan lock single row pada jam 9:00:00 dan tidak melakukan commit. Di sisi lain transaksi 1 menunggu untuk proses update pada tabel, tetapi transaksi 2 pada saat itu membutuhkan lock pada semua data. Sehingga transaksi 1 di block oleh transaksi 2 sampai transaksi 2 commit pada jam 16:30:01. Untuk hal ini user yang mengeksekusi transaksi 1 menghubungi administrator untuk mengatasi permasalahan ini.
LockHandling
241
Politeknik Telkom
242
Politeknik Telkom
1. 2.
Pada Enterprise Manager buka halaman Performance Klik Blocking pada bagian kiri bawah halaman.
LockHandling
243
Politeknik Telkom
3.
Halaman Blocking Sessions muncul. Terdapat tiga sesi user yang sedang mengalami konflik.
244
Politeknik Telkom
6.
Pada sisi user yang di-terminate akan muncul pesan your session has been killed dan transaksi secara otomatis mengalami rollback.
LockHandling
245
Politeknik Telkom
13.9 Deadlocks
Deadlock merupakan contoh lock konflik yang sangat special. Deadlock terjadi pada saat terdapat dua atau lebih sesi yang sedang saling menunggu antar satu sama lain untuk mendapatkan hak atas lock. dikarenakan sesi antar satu dengan yang lain saling menunggu dan tidak dapat menyelesaikan transaksi masing-masing maka akan terdeteksi sebagai deadlock. Transaksi 1 UPDATE karyawan SET nama = paijo WHERE employee_id = 400; UPDATE karyawan SET nama = paul WHERE employee_id = 300; Time 9:00 Transaksi 2 UPDATE karyawan SET nama = paimin WHERE employee_id = 300; UPDATE karyawan SET nama = gilbert WHERE employee_id = 400;
9:15
Oracle secara otomatis mendeteksi dan menyelesaikan deadlock dengan cara me-rollback semua transaksi yang sedang mengalami deadlock
246
Politeknik Telkom
13.10 JURNAL
1. 2. 3. 4. Coba buat suatu kasus yang menunjukkan suatu kondisi deadlock Bagaimana tahap-tahap penyelesaian lock konflik Buatlah suatu kasus yang menunjukkan lock terjadi hanya pada suatu row Buatlah suatu kasus yang menunjukkan lock terjadi hanya pada suatu tabel
LockHandling
247
Politeknik Telkom
14 TUNING
Overview
Dalam penggunaan oracle, selain dibutuhkan keakuratan data, performansi dari system database itu sendiri juga sangatlah penting. Salah satu hal yang mampu mendukung performansi system yang baik adalah dengan teknik Tuning. Khusus pada oracle 10g, bab ini akan memaparkan sedikit banyak mengenai pengertian tuning dan bagaimana tuning dioperasikan menggunakan methodology dengan memanfaatkan design yang sudah disediakan oleh oracle tersebut.
Tujuan
4. 5. 6.
Mengenal Tuning pada Oracle 10g Memahami Instance Tuning Memahami SQL Tuning
248
Politeknik Telkom
Tujuan
Tujuan dari tuning sistem adalah untuk mengurangi waktu respon sistem terhadap end user, atau untuk mengurangi resource yang digunakan untuk memproses pekerjaan yang sama. Kita dapat memenuhi kedua tujuan ini dalam beberapa cara: Mengurangi Beban Kerja (Reduce the Workload) Menyeimbangkan Beban Kerja (Balance the Workload) Memparalelkan Beban Kerja (Parallelize the Workload) a. Mengurangi Beban Kerja (Reduce the Workload) SQL Tuning secara umum melibatkan pencarian cara yang lebih efisien untuk memproses beban kerja yang sama. SQL tuning memungkinkan untuk mengubah rencana eksekusi dari suatu statement tanpa mengubah fungsionalitas untuk mengurangi pemakaian resource.Dua contoh bagaimana penggunaan resource dapat dikurangi: 1. Jika suatu query yang biasa dieksekusi perlu untuk mengakses suatu persentase kecil dari data dalam tabel, maka query tersebut dapat dieksekusi dengan lebih efisien dengan menggunakan indeks. Dengan membuat indeks, kita dapat mengurangi jumlah pemakaian resource.
249
Tuning
Politeknik Telkom
2.
Jika seorang user mencari dua puluh baris pertama dari 10000 baris yang diberikan oleh perintah pengurutan yang spesifik, dan jika query (dan perintah pengurutan) dapat dipenuhi oleh indeks, maka user tidak perlu untuk mengakses dan mengurutkan 10000 baris untuk melihat dua puluh baris.
b. Menyeimbangkan Beban Kerja (Balance the Workload) Sistem cenderung memiliki penggunaan penuh pada siang hari ketika user yang sebenarnya terhubung ke sistem dan penggunaan yang sedikit di malam hari. Jika noncritical report dan batch job dapat dijadwalkan untuk berjalan pada malam hari dan penggunaan sistem pada siang hari dikurangi, maka hal tersebut dapat membebaskan resource agar dapat digunakan pada programprogram yang lebih penting pada siang hari. c. Memparalelkan Beban Kerja (Parallelize the Workload) Query-query yang mengakses sejumlah besar data (typical data warehouse queries) sering dapat diparalelkan. Hal ini sangat berguna untuk mengurangi waktu respon dalam data warehouse yang rendah konkurensinya. Akan tetapi, untuk lingkungan OLTP, yang cenderung tingggi konkurensinya, hal ini dapat merugikan user-user lain dengan meningkatkan penggunaan resource secara keseluruhan pada program.
250
Politeknik Telkom
14.3 ANALYZE
Selalu jalankan command ANALYZE pada table anda untuk memberikan kepastian kalau optimizer akan memperoleh informasi tentang data tersebut. Anda dapat melakukan ANALYZE sebuah table, index, dan bahkan cluster. Ketika anda melakukan analyze suatu table maka oracle akan mengambil informasi berupa data dari obyek tersebut dan informasi untuk memferifikasi blok. Ini adalah perintah yang sangat berguna bukan Cuma untuk memproteksi data, tetapi juga untuk meningkatkan performansi. SINTAKS ANALYZE
ANALYZE (INDEX | TABLE | CLUSTER) [USER.] (INDEX [PARTITION (PARTITION NAME) ] | TABLE [PARTITION (PARTITION NAME)] | CLUSTER ) ( COMPUTE STATISTIC [ FOR CLAUSE] | ESTIMATE STATISTIC [FOR CLAUSE] [SAMPLE INTEGER (ROWS PERCENT)] | DELETE STATISTIC | VALIDATE REF UPDATE | VALIDATE STRUCTURE [CASCADE] | LIST CHAINED ROWS [INTO [USER.] TABLE] )
CONTOH ANALYZE Berikut contoh aplikasi analyze : Pertama buat table emp
SQL> create table emp( a number, b varchar(10)); Table created.
Lakukan ANALYZE, eksekusi analyze dibawah adalah untuk melakukan validasi terhadap structure table emp.
SQL> analyze table emp validate structure cascade
Tuning
251
Politeknik Telkom
Politeknik Telkom
number Rem achaudhr 07/23/95 PTI: Add columns partition_{start, stop, id} Rem glumpkin 08/25/94 - new optimizer fields Rem jcohen 11/05/93 - merge changes from branch 1.1.710.1 - 9/24 Rem jcohen 09/24/93 #163783 add optimizer column Rem glumpkin 10/25/92 - Renamed from XPLAINPL.SQL Rem jcohen 05/22/92 - #79645 - set node width to 128 (M_XDBI in gendef) Rem rlim 04/29/91 - change char to varchar2 Rem Peeler 10/19/88 - Creation Rem Rem This is the format for the table that is used by the EXPLAIN PLAN Rem statement. The explain statement requires the presence of this Rem table in order to store the descriptions of the row sources. create table PLAN_TABLE ( statement_id plan_id timestamp remarks operation options object_node object_owner object_name object_alias object_instance object_type optimizer search_columns id parent_id depth position cost cardinality bytes other_tag partition_start
Tuning
varchar2(30), number, date, varchar2(4000), varchar2(30), varchar2(255), varchar2(128), varchar2(30), varchar2(30), varchar2(65), numeric, varchar2(30), varchar2(255), number, numeric, numeric, numeric, numeric, numeric, numeric, numeric, varchar2(255), varchar2(255),
253
Politeknik Telkom
partition_stop partition_id other distribution cpu_cost io_cost temp_space access_predicates filter_predicates projection time qblock_name other_xml );
varchar2(255), numeric, long, varchar2(30), numeric, numeric, numeric, varchar2(4000), varchar2(4000), varchar2(4000), numeric, varchar2(30), clob
14.5 OPERASI
Sekali plan_table telah terbentuk anda bisa melakukan explain plan terhadap query yang kita lakukan. Lihat langkah berikut : Buat plan.sql
SQL> set serveroutput on; SQL> @plan; SP2-0310: unable to open file "plan.sql" SQL> column query_plan format a80 SQL> select lpad(' ',2*level)|| operation|| ':'|| options|| ':'|| object_name query_plan from plan_table connect by prior id=parent_id start with id=0; QUERY_PLAN ---------------------------------------------SELECT STATEMENT:: TABLE ACCESS:FULL:EMP
254
Politeknik Telkom
Perintah plan.sql menghasilkan proses yang dilakukan oleh oracle untuk operasi query kita. Operasi table acces full emp mendeskripsikan kalo operasi yang dilakukan adalah proses membaca record secara keseluruhan. Untuk opsi lain lihat explain plan berikut :
SQL> select * from emp; A B --------- ---------1 hallo SQL> insert into emp values(2,'nama saya'); 1 row created. SQL> explain plan for 2 select * from emp where a=2; Explained. SQL> @plan; QUERY_PLAN --------------------------------------------------------SELECT STATEMENT:: TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP
Tuning 255
Politeknik Telkom
SELECT STATEMENT:: TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP SELECT STATEMENT:: TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP TABLE ACCESS:FULL:EMP 12 rows selected. SQL> Alter table emp add constraint pk_emp primary key(a); Table altered. SQL> commit; Commit complete. SQL> select * from emp where a=2; A B --------- ---------2 nama saya
SQL> explain plan for select * from emp where a=2; Explained. SQL> @plan; QUERY_PLAN ------------------------------------------SELECT STATEMENT:: TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:BY INDEX ROWID:EMP INDEX:UNIQUE SCAN:PK_EMP SELECT STATEMENT:: TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:BY INDEX ROWID:EMP
256
Politeknik Telkom
INDEX:UNIQUE SCAN:PK_EMP SELECT STATEMENT:: TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP QUERY_PLAN ------------------------------------------TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:BY INDEX ROWID:EMP INDEX:UNIQUE SCAN:PK_EMP SELECT STATEMENT:: TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:FULL:EMP INDEX:UNIQUE SCAN:PK_EMP TABLE ACCESS:BY INDEX ROWID:EMP INDEX:UNIQUE SCAN:PK_EMP 36 rows selected.
Dari perintah diatas terlihat perbedaan antara penggunaan primary key dengan tidak. Anda jangan terkecoh dengan panjangnya hasil dari explain plan hasil selection setelah pemberian primary key. Tapi pemberian primary key tersebut merupakan sebuah peningkatan performansi pada hasil query kita (terutama jika data besar).
Politeknik Telkom
harus merefleksikan, ketika memungkinkan, mengarah filter terbaik yang belum terpakai). Metode join sesuai dengan jumlah baris yang dikembalikan. Sebagai contoh, loop bersarang bergabung melalui indeks mungkin tidak optimal ketika banyak baris dikembalikan. View digunakan secara efisien. Lihat pada urutan SELECT untuk melihat apakah pengaksesan ke view penting. Ada beberapa produk Cartesian yang tidak penting (bahkan dengan tabel kecil). Setiap tabel diakses secara efisien: Pertimbangkan predikat-predikat pada SQL statement dan jumlah baris pada tabel. Lihat pada aktivitas yang mencurigakan, seperti scan tabel secara penuh dengan sejumlah besar baris, yang memiliki predikat pada klausa where. Tentukan mengapa sebuah indeks tidak digunakan untuk predikat selektif. Sebuah scan tabel secara penuh tidak berarti tidak efisien. Hal tersebut mungkin efisien untuk melakukan scan tabel penuh pada tabel kecil, atau untuk melakukan scan tabel penuh untuk membuat metode join yang lebih baik (misalnya, hash join) untuk sejumlah baris yang dikembalikan. Jika ada dari kondisi-kondisi ini yang tidak optimal, maka pertimbangkan untuk merestrukturisasi SQL statement atau indeks-indeks yang tersedia pada tabel. Rekstruturisasi SQL Statement Seringkali, menulis ulang SQL statement yang tidak efisien lebih mudah daripada dimodifikasi. Jika Anda mengerti tujuan dari statement yang diberikan, mungkin Anda akan dapat dengan cepat dan mudah menulis sebuah statement baru yang memenuhi kebutuhan. Membuat Predikat Menggunakan AND dan = Untuk meningkatkan efisiensi SQL, gunakan equijoin kapanpun memungkinkan. Statement yang menggunakan equijoin pada nilai kolom yang belum ditransformasi adalah yang termudah untuk di-tune. Hindari Kolom yang Telah Bertransformasi pada klausa WHERE Gunakan nilai kolom yang belum bertransformasi. Misalnya, gunakan: WHERE a.order_no = b.order_no
258
Politeknik Telkom
daripada:
WHERE TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1)) = TO_NUMBER (SUBSTR(a.order_no, INSTR(b.order_no, '.') - 1)) Jangan menggunakan fungsi SQL pada klausa predikat atau klausa WHERE. Ekspresi-ekspresi yang menggunakan kolom, seperti fungsi menyatakan kolom tersebut sebagai argumen, menyebabkan optimizer mengabaikan kemungkinan menggunakan sebuah indeks pada kolom tersebut, bahkan indeks yang unik, hingga terdapat fungsi yang berdasarkan indeks yang dapat terdefinisi yang dapat digunakan. Hindari ekspresi-ekspresi mixed-mode, dan hati-hati terhadap tipe konversi yang implisit. Ketika Anda ingin menggunakan sebuah indeks pada VARCHAR2 kolom charcol, tapi klausa WHERE seperti berikut: AND charcol = numexpr di mana numexpr adalah sebuah ekspresi dari tipe angka (misalnya, 1, USERENV('SESSIONID'), numcol, numcol+0,...), Oracle menerjemahkan ekspresi tersebut ke: AND TO_NUMBER(charcol) = numexpr Hindari jenis ekspresi yang kompleks seperti berikut: col1 = NVL (:b1,col1) NVL (col1,-999) = . TO_DATE(), TO_NUMBER(), and so on Ekspresi ini mencegah optimizer dari menandai kardinalitas valid atau estimasi selektif dan dapat mempengaruhi rencana dan metode join secara keseluruhan. Tambahkan predikat yang berlawanan menggunakan teknik NVL().
Tuning
259
Politeknik Telkom
Misalnya: SELECT employee_num, full_name Name, employee_id FROM mtl_employees_current_view WHERE (employee_num = NVL (:b1,employee_num)) (organization_id=:1) ORDER BY employee_num;
AND
Juga: SELECT employee_num, full_name Name, employee_id FROM mtl_employees_current_view WHERE (employee_num = :b1) AND (organization_id=:1) ORDER BY employee_num;
Ketika Anda perlu menggunakan fungsi SQL pada filter atau predikat join, jangan menggunakannya pada kolom di mana Anda ingin memiliki sebuah indeks; lebih baik gunakan pada sisi berlawanan predikat, seperti pada statement berikut: TO_CHAR(numcol) = varcol
260
Politeknik Telkom
14.7 JURNAL
Terdapat empat query yang menghasilkan row yang sama sebagai berikut:
select a.*,b.nama,c.kategori from buku a where exists (select 1 from supplier b where a.id_supplier=b.id_supplier) and exists (select 1 from jenis c where a.id_jenis=c.id_jenis) select a.*,b.nama,c.kategori from buku a where a.id_supplier in (select b.id_supplier from supplier b) and a.id_jenis in (select c.id_jenis from jenis c) select a.*,(select b.nama from supplier a.id_supplier=b.supplier), (select c.kategori from jenis c a.id_jenis=c.id_jenis) from buku a; b where where
select a.*,b.nama,c.kategori from buku a, supplier b, jenis c where a.id_supplier = b.id_supplier and a.id_jenis = c.id_jenis;
Dengan menggunakan explain plan dan melihat isi dari plan_table dengan query sebagai berikut:
select plan_id, operation, object_name, object_type, position, cost, cpu_cost from plan_table order by plan_id desc;
Lakukanlah analisis query manakah yang memiliki cost paling rendah dan paling tinggi (uraikan alasannya)!
Tuning
261