Modul Praktikum BDR
Modul Praktikum BDR
Daftar Isi
Lembar Pengesahan ............................................................................................................
Daftar Isi
........................................................................................................................
ii
I-1
I-3
I-8
I-10
Modul IV
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
Modul V
5.1
5.2
5.3
5.4
5.5
5.6
5.7
V-1
V-1
V-3
V-4
V-4
V-5
V-7
V-8
Modul VI
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
: PL/SQL ........................................................................................................
Definisi PL/SQL ...............................................................................................
Struktur Blok PL/SQL ......................................................................................
Pendeklarasian Variabel .................................................................................
Type data pada PL/SQL ...................................................................................
Statement SELECT dalam PL/SQL ...................................................................
PL/SQL Record ................................................................................................
PL/SQL Table (Array).......................................................................................
Percabangan (IF-THEN-ELSE) ..........................................................................
VI-1
VI-1
VI-1
VI-3
VI-4
VI-5
VI-6
VI-7
VI-7
III-1
III-1
III-3
III-3
III-5
III-6
III-9
DAFTAR ISI
6.9
6.10
6.11
6.12
Modul VII
7.1
7.2
7.3
7.4
7.5
: Cursor ...........................................................................................................
Definisi ............................................................................................................
Macam-macam Cursor ...................................................................................
Memanipulasi Cursor dengan Struktur FOR-LOOP ........................................
Tahapan Penggunaan Cursor..........................................................................
Latihan ............................................................................................................
VII-1
VII-1
VII-2
VII-3
VII-4
VII-5
Modul VIII
8.1
8.2
8.3
8.4
8.5
VIII-1
VIII-1
VIII-4
VIII-6
VIII-6
VIII-9
Modul IX
9.1
9.2
: Package ........................................................................................................
Package ...........................................................................................................
Latihan ............................................................................................................
IX-1
IX-1
IX-7
Modul X
: Trigger .......................................................................................................... X-1
10.1 Definisi ............................................................................................................ X-1
10.2 Fungsi dan Kelebihan...................................................................................... X-1
10.3 Komponen Trigger .......................................................................................... X-2
10.4 Jenis Trigger .................................................................................................... X-3
10.5 Batasan ........................................................................................................... X-4
10.6 Studi Kasus 1................................................................................................... X-4
10.7 Studi Kasus 2................................................................................................... X-7
10.8 Cascading Trigger ........................................................................................... X-9
10.9 Contoh Lain Penggunaan Trigger ................................................................... X-10
10.10 Mengubah Status Trigger ............................................................................... X-10
10.11 Latihan ............................................................................................................ X-10
MODUL I
BASIS DATA RELASIONAL
MODUL 1
BASIS DATA RELASIONAL
Tujuan Praktikum :
1.
Mengetahui, memahami serta mampu merancang dan membuat Basis Data Relasional
I- 1
MODUL I
BASIS DATA RELASIONAL
m
R
o
n
R
atau
1
R
o
atau
Id_customer
Nama Atribut
nama
alamat
Kardinalitas
Masa_berlaku
Jenis_member
No_telp
No_kartu
1
CUSTOMER
memiliki
KARTU_MEMBER
diskon
Nama entitas
Relasi
KARTU_MEMBER
PK
NO_KARTU
masa_berlaku
jenis_member
diskon
PK
ID_CUSTOMER
FK1
nama
alamat
no_telp
NO_KARTU
Dari tabel diatas, berikut contoh Super Key,CandidateKey, Primary Key, dan Foreign Key pada tabel
KARTU_MEMBER:
Super Key
:
id_customer, alamat, no_telp
Candidate Key
:
id_customer, no_telp
Primary Key
:
id_customer
Foreign Key
:
no_kartu
Agregasi
Agregasi merupakan suatu kasus yang menunjukkan adanya relasi yang secara kronologis
mensyaratkan adanya relasi dengan suatu himpunan relasi[2]. Agregasi digunakan ketika kita akan
memodelkan sebuah hubungan relasi yang melibatkan kumpulan relasi. Agregasi memperlakukan
suatu himpunan relasi tersebut sebagai sebuah entity. Contohnya adalah sebagai berikut:
I- 2
MODUL I
BASIS DATA RELASIONAL
Id_barang
Nama_barang
harga
Id_beli
Tgl_beli
Id_customer
nama
Jml_stock
alamat
No_telp
BARANG
membeli
CUSTOMER
direkap
Tgl_rekap
PEGAWAI
dicatat
REKAPPENJUALAN
Id_rekap
Id_pegawai
No_telp
nama
alamat
Pada contoh di atas, relasi antara entitas Barang dan entitas Customer diasumsikan sebagai
sebuah entitas baru, yaitu entitas membeli (nama relasi dijadikan nama entitas baru tersebut).
Kemudian, terbentuk sebuah relasi antara membeli dengan Rekappenjualan dengan relasi direkap.
PK 1
ATRIBUT
NON PK1
1
ENTITAS 1
PK 2
1
RELASI
ENTITAS 2
ATRIBUT
NON PK 2
I- 3
MODUL I
BASIS DATA RELASIONAL
ENTITAS 1
PK
PK 1
FK1
PK 2
ATRIBUT RELASI
NON PK 1
ENTITAS 2
PK
PK 2
NON PK 2
Tabel bentukan dari Entitas 2 yang terdiri atas kolom PK2, Atribut Non PK2 ( dan PK1, serta
Atribut Relasi, jika Entitas 2 dianggap lebih kuat daripada Entitas 1:
ENTITAS 2
ENTITAS 1
PK
PK 1
NON PK 1
PK
PK 2
FK1
PK 1
ATRIBUT RELASI
NON PK 2
Contoh :
Id_customer
nama
alamat
Masa_berlaku
Jenis_member
No_telp
No_kartu
CUSTOMER
memiliki
KARTU_MEMBER
diskon
NO_KARTU
FK1
masa_berlaku
jenis_member
diskon
ID_CUSTOMER
CUSTOMER
PK
CUSTOMER
KARTU_MEMBER
ID_CUSTOMER
PK
nama
alamat
no_telp
NO_KARTU
masa_berlaku
jenis_member
diskon
Atau:
2. Entitas dengan kardinalitas satu ke banyak (1 ke N)
ATRIBUT
RELASI
PK 1
ATRIBUT
NON PK1
ID_CUSTOMER
FK1
nama
alamat
no_telp
NO_KARTU
PK 2
1
ENTITAS 1
PK
N
RELASI
ENTITAS 2
ATRIBUT
NON PK 2
ENTITAS 1
PK
PK 1
NON PK 1
PK
PK 2
FK1
PK 1
NON PK 2
I- 4
MODUL I
BASIS DATA RELASIONAL
Contoh:
Tgl_rekap
PEGAWAI
dicatat
REKAPPENJUALAN
Id_rekap
Id_pegawai
No_telp
nama
alamat
PEGAWAI
REKAPPENJUALAN
ID_PEGAWAI
PK
ID_REKAP
nama
alamat
no_telp
FK1
tgl_rekap
ID_PEGAWAI
PK 1
PK 2
ATRIBUT
NON PK1
ENTITAS 1
RELASI
ATRIBUT
NON PK 2
ENTITAS 2
ENTITAS 1
PK
PK,FK1
PK,FK2
PK 1
NON PK 1
ENTITAS 2
PK 1
PK 2
PK
ATRIBUT RELASI
PK 2
NON PK 2
KET :
Jika dilihat, tabel entitas 1 memiliki baris dengan tulisan PK yang artinya atribut tersebut
adalah primary key, pada tabel relasi PK1 dan PK2 adalah foreign key dari tabel entitas 1 dan
entitas 2, tetapi pada tabel t_relasi kedua foreign key tersebut dijadikan primary key.
Contoh:
Id_barang
Nama_barang
harga
Tgl_beli
Id_customer
nama
Jml_stock
alamat
No_telp
BARANG
membeli
CUSTOMER
I- 5
MODUL I
BASIS DATA RELASIONAL
CUSTOMER
MEMBELI
PK
ID_BARANG
PK,FK1
PK,FK2
nama_barang
harga
jml_stok
PK
ID_BARANG
ID_CUSTOMER
ID_CUSTOMER
nama
alamat
no_telp
tgl_beli
PK_B
N
A
R1
R2
PK_C
Maka tabel yang terbentuk ada 5 (jika kardinalitas antara C dan agregasi bukan banyak ke
banyak maka hanya ada 4 tabel) yaitu:
Tabel bentukan dari Entitas A yang terdiri atas atribut PK_A.
Tabel bentukan dari Entitas B yang terdiri atas atribut PK_B.
Tabel bentukan dari Entitas C yang terdiri atas atribut PK_C .
Tabel bentukan dari Relasi R1 yang terdiri atas atribut PK_R1 dan PK_A, dan PK_B.
Tabel bentukan dari Relasi R2 yang terdiri atas atribut PK_R2 dan PK_R1, dan PK_C (jika
kardinalitas C dengan Agregasi adalah banyak ke banyak, jika tidak, tabel R2 tidak ada).
R1
A
PK
PK_A
PK
PK_R1
FK1
FK2
PK_A
PK_B
B
PK
PK_B
R2
PK
PK_R2
FK1
FK2
PK_R1
PK_C
C
PK
PK_C
I- 6
MODUL I
BASIS DATA RELASIONAL
Contoh:
Id_barang
Nama_barang
harga
Tgl_beli
Id_customer
nama
Jml_stock
alamat
No_telp
BARANG
membeli
CUSTOMER
direkap
Tgl_rekap
PEGAWAI
dicatat
REKAPPENJUALAN
Id_rekap
Id_pegawai
No_telp
nama
alamat
CUSTOMER
MEMBELI
PK
ID_BARANG
nama_barang
harga
jml_stok
PEGAWAI
PK
ID_PEGAWAI
nama
alamat
no_telp
PK,FK1
PK,FK2
ID_BARANG
ID_CUSTOMER
tgl_beli
PK
ID_CUSTOMER
nama
alamat
no_telp
REKAPPENJUALAN
PK
ID_REKAP
FK1
FK2
FK2
tgl_rekap
ID_PEGAWAI
ID_BARANG
ID_CUSTOMER
I- 7
MODUL I
BASIS DATA RELASIONAL
III. LATIHAN
Studi Kasus Transaksi Penjualan pada Mini Market
Id_barang
Nama_barang
harga
Id_beli
Tgl_beli
Id_customer
nama
Jml_stock
No_telp
BARANG
membeli
CUSTOMER
direkap
memiliki
Tgl_rekap
PEGAWAI
dicatat
REKAPPENJUALAN
No_kartu
KARTU_MEMBER
Id_rekap
Id_pegawai
No_telp
nama
alamat
diskon
Masa_berlaku
Jenis_member
alamat
1) Buat tabel relasional dari diagram ER diatas (lengkap dengan primary key dan foreign key)!
2) Jelaskan mengenai super key, candidate key, dan primary key pada tabel Pegawai !
I- 8
MODUL II
DDL
MODUL 2
DDL (DATA DEFINITION LANGUAGE)
Tujuan Praktikum :
1.
2.
II- 1
MODUL II
DDL
2. SQL*PLUS
Menggunakan SQL*Plus hampir sama saja seperti Command prompt dimana sintaks SQL
yang akan di running harus diketikkan manual, hanya saja SQL*Plus ini tools bawaan dari
oracle. Untuk mengaksesnya pilih Start All Program Oracle - OraDb10g_home1
Application Development SQL Plus.
Pada SQL*plus ini harus dimasukkan username dan password yang telah dibuat pada saat
instalasi oracle(atau saat membuat database). Untuk penggunaan PC standalone (yang tidak
terhubung jaringan) tidak perlu memasukkan host string.
3. Browser
Sqlplus juga dapat diakses melalui browser, tidak jauh berbeda dengan 2 cara sebelumnya,
dengan menggunakan browser, tampilan iSql*plus akan memberikan sebuah textarea untuk
menuliskan sintaks SQL. Untuk mengakses browser oracle harus diketahui alamat port
dimana oracle bisa dijalankan. Daftar alamat port bisa dilihat pada :
ORACLE_BASE\ORACLE_HOME\install\portlist.ini
Contoh :
F:\oracle\product\10.1.0\db_1\install\portlist.ini
iSQL*Plus HTTP port number =5560
Enterprise Manager Console HTTP Port (nama_database) = 1158
Enterprise Manager Agent Port (nama_database) = 3938
II- 2
MODUL II
DDL
Pada layar iSQL* Plus, ada beberapa objek penting antara lain:
- execute : untuk menjalankan perintah SQL yang diketikkan pada jendela workspace
- load script : untuk mengaktifkan perintah SQL yang telah tersimpan sebelumnya
- save script : untuk menyimpan script(perintah SQL) di harddisk untuk digunakan lagi
pada waktu yang akan datang
- cancel : untuk membatalkan perintah SQL
- preferences : untuk melakukan pengaturan iSQL* Plus, misalnya melakukan pengaturan
workspace, memformat hasil, dsb.
- help : untuk memunculkan layar bantuan
history : untuk menyimpan perintah SQL yang dikirimkan pada sesi saat ini. Jika sesi
berakhir,maka isi tab history akan dihapus.
Char (i): String dengan panjang karakter tetap sebesar ukuran i. Tipe data ini mempunyai
kemampuan yang hampir sama yakni menyimpan karakter, hanya saja maksimum size yang
disimpan hanya sebesar 2000 bytes.
Varchar2 (i): String yang memiliki panjang karakter variable dengan panjang maximal sebesar
i. Tipe data ini memperbolehkan penyimpanan semua karakter yang dapat dimasukkan
melalui keyboard. Maksimum size yang dapat disimpan sebesar 4000 bytes(karakter). Tipe
data ini juga memungkinkan untuk menyimpan data numerik. Biasanya space akan langsung
dielimansi jika menggunakan tipe data ini.
Contoh : Informaticslab (dengan 3 spasi di akhir) dimasukkan ke dalam kolom yang
didefinisikan dengan tipe data varchar2, maka akan menjadi Informaticslab (tidak
ada spasi)
Number(p,s): tipe data number memiliki presisi p dan s digit dibelakang koma Jika kita abaikan
p dan s berarti dianggap sebagai tipe number floating point. Tipe data ini menyimpan
bilangan integer sampai maksimum dari digit integer tersebut. Bagian kiri menunjukkan presisi
dan bagian kanan menunjukkan skala. Contoh:
Number specification
(4,2)
(7,4)
(15,11)
Column Length
Decimal Digits
4
7
15
2
4
11
Jumlah integer yang disajikan adalah merupakan selisih antara kedua angka tersebut.
Misalnya untuk spesifikasi (7,4) artinya 3 digit sebelum koma dan 4 digit dibelakang koma.
Jika jumlah digit di belakang koma melebihi daripada yang sudah didefinisikan maka akan
langsung dibulatkan.
Long: Data karakter dengan ukuran panjang bervariasi, hingga mencapai 2 GigaBytes. (tipe
data ini tidak dapat digunakan sebagai key).
Raw(size): Tipe data berupa binary data dengan ukuran maksimal 255 bytes
Long Raw: Tipe data berupa binary data dengan ukuran maksimal 2 GigaBytes tidak dikonversi
oleh oracle (data mentah apa adanya, spasi dihitung 1 karakter).
Date: Tipe data ini meyimpan waktu dan tanggal dari sebuah informasi, dengan komponen
waktu yang dibulatkan ke detik terdekat. Untuk menampilkannya menjadi sebuah text, harus
menggunakan fungsi to_char.
II- 3
MODUL II
DDL
Timestamp: Tipe data ini mirip dengan tipe data date. Di dalam tipe data ini terdapat
komponen waktu yang dapat langsung ditampilkan tanpa harus mengubahnya terlebih dahulu
dengan fungsi to_char.
Clob: Tipa data ini memperbolehkan penyimpanan objek dengan ukuran yang sangat besar
sekitar 4 GB. Clob mirip sekali dengan varchar2 hanya saja tipe data ini mempunyai kapasistas
maksimum yang lebih besar.
Blob: Tipe data ini memperbolehkan penyimpanan objek binary yang besar dan tidak
terstruktur. Contoh dari tipe data blob adalah suara dan video.
A. CREATE
1. CREATE TABLE
Perintah Create Table digunakan untuk membuat/mendefinisikan sebuah tabel baru.
Sintaks:
CREATE TABLE nama_tabel (
Nama_atribut1 tipe_data CONSTRAINT_pk_nama_tabel PRIMARY KEY,
Nama_atribut2
tipe_data
[unique] [notnull/null] [default] <nilai default>
[check],
............
);
CREATE TABLE PEGAWAI(
Contoh1:
id_pegawai char(4),
nama varchar2(30),
alamat varchar2(30),
no_telp varchar2(13),
CONSTRAINT pk_pegawai PRIMARY KEY(id_pegawai)
);
Ket:
II- 4
MODUL II
DDL
Subquery akan kita pelajari pada modul III. Pada Sintaks pembentukan View terdapat beberapa
kata kunci seperti berikut:
OR REPLACE, digunakan apabila pada saat pembentukan view, ternyata view sudah ada,
maka view didefinisikan kembali.
NOFORCE, View hanya akan dibuat bila tabel sumbernya sudah ada.
With Check Option, View akan memeriksa data yang diinsert ataupun diupdate pada view.
READ ONLY, dengan perintah ini maka operasi penambahan, pembaharuan, dan
penghapusan melalui view tersebut tidak diperbolehkan.
Pada sintak pembentukan sequence terdapat beberapa kata kunci seperti berikut:
MAXVALUE, untuk menyatakan nilai tertinggi sequence. NOMAXVALUE berarti nilai tertinggi
yang dihasilkan tidak dibatasi. MAXVALUE dan NOMAXVALUE bersifat optional.
MINVALUE, untuk menyatakan nilai terendah yang dihasilkan sequence. MINVALUE berarti
nilai terendah yang dihasilkan tidak dibatasi. MINVALUE dan NOMINVALUE bersifat optional.
CYCLE, untuk menyatakan sequence akan kembali ke nilai terendah yang ditetapkan.
NOCYCLE adalah kebalikan dari CYCLE.
CACHE, untuk menentukan berapa banyak nilai dari sequence yang akan dialokasikan ke
memori. NOCACHE berarti tidak ada nilai sequence yang dialokasikan ke memori.
ORDER atau NOORDER berfungsi untuk menjamin atau tidak, nilai yang digenerate adalah
berurut berdasarkan permintaan pada server paralel. Default dari klausa ini adalah
NOORDER.
II- 5
MODUL II
DDL
Ket:
Agar user baru ini dapat log on, maka setelah di create lakukan GRANT CONNECT
sebagai berikut:
Sintaks: GRANT CONNECT, RESOURCE TO nama_user;
B. DROP
1. DROP TABLE
Perintah ini digunakan untuk menghapus definisi tabel pada ORACLE yaitu semua data dan
indeks yang dimiliki tabel.
Sintaks:
DROP TABLE nama_table [CASCADE CONSTRAINT];
DROP TABLE pegawai CASCADE CONSTRAINT;
Contoh:
Ket : Option CASCADE CONSTRAINT akan menghapus pula constrain referensi
integrity yang terhubung(silakan baca sub-bab V).
2. DROP VIEW
Perintah ini digunakan untuk menghapus view tertentu yang ada di basisdata.
MODUL PRAKTIKUM BASIS DATA RELASIONAL
II- 6
MODUL II
DDL
C. ALTER
1. ALTER TABLE
Perintah ini digunakan untuk mengubah struktur tabel dan constraintnya. Pada sebuah tabel
ada tiga macam alter yang dapat digunakan secara terpisah ataupun digunakan bersamaan.
Ketiga perintah alter tersebut yaitu:
ADD: Digunakan untuk menambah kolom(atribut) atau constraint pada suatu tabel.
Sintaks:
ALTER TABLE nama_tabel
ADD nama_atribut_yang_hendak_ditambah tipe_data constraint);
Contoh1: ALTER TABLE pegawai ADD tgl_lahir date;
Contoh2: ALTER TABLE membeli ADD (
Id_barang char(4),
Constraint fk1_beli Foreign Key (id_barang) references barang on delete cascade) ;
MODIFY: Digunakan untuk mengubah definisi (tipe data, constraint, atau ukuran size dari
suatu tipe data) suatu kolom.
Sintaks: ALTER TABLE nama_tabel
MODIFY nama_atribut_yang_hendak_diubah tipe_data constraint;
Contoh: Suatu tabel Pegawai mempunyai sebuah kolom no_telp yang tipe datanya
awalnya char(7), ingin diubah menjadi tipe data varchar2(15). Sintaksnya:
ALTER TABLE Pegawai MODIFY no_telp varchar2(15);
DROP: Digunakan untuk menghapus kolom(atribut) atau constraint pada suatu tabel.
Sintaks:
ALTER TABLE nama_tabel
DROP [COLUMN|CONSTRAINT] nama_atribut_yang_hendak_dihapus
constraint;
Contoh1: ALTER TABLE Customer
DROP COLUMN no_telp;
menghapus kolom email
II- 7
MODUL II
DDL
ALTER TABLE Membeli
3. ALTER SEQUENCE
Perintah ini digunakan untuk memodifikasi karaktersitik sequence baik itu nilai increment, nilai
minimum, nilai maksimum, dan lain- lain.
Sintaks: ALTER SEQUENCE nama-sequence
[INCREMENT BY integer]
[MAXVALUE integer | NOMAXVALUE]
[MINVALUE integer | NOMINVALUE]
[CYCLE | NO CYCLE];
Contoh: ALTER SEQUENCE seq_pembelian
Ket:
Increment by 2
Maxvalue 1000
Minvalue 0
cycle;
Statement START WITH tidak dapat di-alter. Untuk statement CYCLE harus ada
inisialisasi MAXVALUE
4. ALTER INDEX
Perintah ini digunakan untuk memodifikasi alokasi penyimpanan dalam indeks.
Sintaks: ALTER INDEX nama_indeks
[INITRANS integer]
[MAXTRANS integer]
[STORAGE storage_clause];
Contoh: ALTER INDEX alamat
MAXTRANS 50;
5. ALTER USER
II- 8
MODUL II
DDL
D. RENAME
Perintah ini digunakan untuk mengubah nama tabel, view, sequence dan synonym.
Sintaks: RENAME nama_lama TO nama_baru;
Contoh: RENAME pegawai TO petugas;
E. TRUNCATE
Oracle menyediakan TRUNCATE statement untuk menghapus seluruh data dari suatu tabel
tanpa menghapus tabel yang ada (yang dihapus isi tabelnya saja, tabel menjadi kosong). Berikut
adalah perintah Truncate:
Sintaks:
TRUNCATE TABLE [schema.] nama_table;
TRUNCATE TABLE membeli;
Contoh:
F. COMMENT
User dapat menambahkan komentar terhadap tabel/ view. Berikut adalah perintah comment:
Sintaks:
COMMENT ON TABLE [schema.] nama_table IS isi komentar
Contoh:
V. CONSTRAINT
Jika diperhatikan dengan seksama, pada pendefenisian nama atribut terdapat kata kunci
constraint. Constraint adalah pemaksaan aturan yang dilakukan pada level tabel. Terdapat
beberapa constraint yang dapat digunakan yaitu:
Primary key
Secara Implisit Primary key membentuk keunikan. Hanya ada satu primary key yang
diperbolehkan untuk setiap tabel. Secara implisit Primary key adalah NOT NULL. Primary
key dapat dikatakan juga sebagai constraint Unique yang bernilai NOT NULL. Pada sebuah
Primary Key tidak boleh diberikan constraint Unique tetapi diperbolehkan menggunakan
NOT NULL.
CREATE TABLE PEGAWAI(
Contoh1:
Contoh2:
CONSTRAINT
Foreign Key
Digunakan sebagai hubungan antar primary atau unique key lain. Biasanya sebuah foreign
key pada suatu tabel merupakan primary key tabel yang lain. Contraint ini bertujuan untuk
menetapkan suatu kolom atau kombinasi dari beberapa kolom menjadi foreign key dari
sebuah tabel. Foreign key sering disebut sebagai referential integrity constraint. Kolom atau
kombinasi kolom yang menjadi Foreign Key pada tabel anak mengacu ke kolom atau
kombinasi kolom yang menjadi Primary key atau Unique key pada tabel induk.
II- 9
MODUL II
DDL
Contoh:
Ket:
Unique
Merupakan constraint yang memiliki sifat yang hampir sama dengan primary key, yaitu
harus memiliki nilai yang berbeda untuk setiap baris pada satu kolom yang sama. Hanya
saja, constraint unique mengijinkan adanya nilai NULL(kosong).
Contoh: CREATE TABLE CUSTOMER(
id_customer char(4),
nama varchar2(30),
alamat varchar2(30),
no_telp varchar2(13),
no_kartu char(4),
CONSTRAINT pk_customer PRIMARY KEY(id_customer),
CONSTRAINT uk_customer UNIQUE(no_telp)
);
Check
Constraint Check digunakan untuk memeriksa nilai suatu kolom apakah memenuhi suatu
kriteria yang diinginkan. Kriteria-kriteria tersebut dapat berupa Perbandingan, range, NULL,
LIKE, EXISTS.
Constraint check tidak dapat digunakan pada:
o Acuan pseudo-columns seperti SYSDATE, UID, dan lain lain.
o Query yang mengacu pada nilai pada kolom lain.
Contoh: CREATE TABLE BARANG(
id_barang char(4),
nama varchar2(30),
harga number,
jml_stock number,
CONSTRAINT pk_barang PRIMARY KEY(id_barang),
CONSTRAINT ck_barang CHECK(jml_stock<50)
);
II- 10
MODUL II
DDL
VI. LATIHAN
1) Buatlah struktur DDL (berisi tabel-tabel yang saling terhubung) Studi Kasus Transaksi Penjualan
pada Mini Market yang terdapat pada modul 1 halaman 12, dengan ketentuan sebagai berikut :
Atribut
Tipe data
Semua atribut yang menjadi primary key
CHAR, dengan panjang maksimal 4.
Atribut berupa Nomor telepon
VARCHAR2, dengan panjang maksimal 15
Atribut berupa tanggal
DATE
Atribut berupa angka
NUMBER
Atribut berupa string
VARCHAR2, dengan panjang maksimal 30
2) Ubahlah struktur tabel Pegawai dengan ketentuan sebagai berikut :
a) Tambahkan atribut email yang memiliki tipe data varchar2 dengan panjang maksimal 25
dan memiliki constraint unique.
b) Ubah panjang maksimal atribut email menjadi 50.
c) Hapus atribut email dari tabel pegawai.
3) Buatlah View_Rekap yang menampilkan id_rekap, tanggal rekap dan nama pegawai yang
melakukan rekap tersebut, dimana memiliki id_rekap R002 (ingat bahwa tabel rekappenjualan
dengan tabel pegawai berelasi. Asumsi tabel sumber sudah ada dan selalu memeriksa data yang
di-insert maupun di-update)!
II- 11
MODUL III
DML DAN QUERY DASAR I
MODUL 3
DML (DATA MANIPULATION LANGUAGE)
DAN QUERY DASAR I
Tujuan Praktikum :
1.
2.
3.
4.
5.
6.
7.
BARANG
PK
ID_BARANG
nama_barang
harga
jml_stok
PEGAWAI
PK
PK
ID_BELI
FK1
FK2
FK3
tgl_beli
ID_BARANG
ID_CUSTOMER
ID_REKAP
REKAPPENJUALAN
ID_PEGAWAI
PK
ID_REKAP
nama
alamat
no_telp
FK1
tgl_rekap
ID_PEGAWAI
CUSTOMER
PK
ID_CUSTOMER
FK1
nama
alamat
no_telp
NO_KARTU
KARTU_MEMBER
PK
NO_KARTU
masa_berlaku
jenis_member
diskon
III- 1
MODUL III
DML DAN QUERY DASAR I
UPDATE
Berfungsi untuk memodifikasi nilai pada baris tabel.
Sintaks:
UPDATE <nama_tabel>
Set <nama_kolom1>=<nilai_ekspresi1>, <nama_kolom2>=<nilai_ekspresi2> , .
{Where <kondisi>};
UPDATE barang
Contoh:
Set harga=5000
Where id_barang='B005';
DELETE
Berfungsi untuk menghapus baris tunggal atau lebih dari satu baris berdasarkan kondisi
tertentu.
Sintaks:
DELETE FROM <nama_tabel>
{WHERE <kondisi>};
DELETE FROM barang
Contoh:
WHERE id_barang=B005;
Jika klausa where tidak digunakan maka semua data pada tabel akan terhapus. Sebagai
sintaks alternatif untuk menghapus semua data pada table digunakan perintah TRUNCATE.
Sintaks:
TRUNCATE TABLE <table> [reusage storage];
MERGE
Berfungsi untuk melakukan update maupun insert ke suatu tabel tertentu berdasarkan
kondisi dari tabel lain. Dengan perintah merge ini, data akan diinsertkan apabila data
tersebut tidak ada di tabel tujuan dan akan diupdatekan apabila data tersebut telah ada di
tabel tujuan.
Sintaks:
MERGE INTO <nama_tabel> <nama_alias_tabel>
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET [(column1=column_val1),
(column2=column_val2),]
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);
Contoh:
Penjelasan :
Query di atas akan melakukan proses update ke tabel copy_rekappenjualan apabila
id_rekapnya ada yang sama dengan id_rekap di tabel rekappenjualan, sedangkan apabila
id_rekap pada tabel rekappenjualan tidak ada di tabel copy_rekappenjualan maka akan
dilakukan proses insert ke tabel copy_rekappenjualan sesuai dengan nilai yang terdapat
pada tabel rekappenjualan.
III- 2
MODUL III
DML DAN QUERY DASAR I
Keterangan :
SELECT : Untuk menspesifikasikan nama-nama kolom yang akan ditampilkan. Nama-nama
kolomnya dituliskan setelah klausa ini.
DISTINCT: Untuk menampilkan record-record hasil query yang nilai atau valuesnya berbeda.
Tujuan penggunaan klausa ini untuk menghilangkan redundancy hasil query.
ALL: Untuk menampilkan seluruh record meskipun ada beberapa record yang nilainya sama.
Secara default setiap statement SELECT menggunakan klausa ALL di dalamnya.
FROM: mendefinisikan nama tabel yang mengandung kolom yang terdaftar dalam SELECT
WHERE: Untuk mendefinisikan kondisi atau kriteria untuk menyaring data yang diambil dari
tabel sumber. Terdiri dari 3 elemen, yaitu nama kolom, kondisi perbandingan dan nama
konstanta atau daftar nilai.
Contoh :
Menampilkan semua data (gunakan tanda *) dari tabel pemesan
SELECT * FROM customer;
III- 3
MODUL III
DML DAN QUERY DASAR I
Keterangan :
a. Jika pengkondisian bertipe data string atau date maka gunakan tanda petik satu (_)
SELECT id_rekap, id_pegawai
FROM rekappenjualan
WHERE tgl_rekap = '1-Sep-2012';
Menampilkan semua nama barang dan harga terurut secara DESCENDING berdasarkan
harga (penggunaan klausa ORDER BY), default dari order by adalah ASCENDING, jadi klausa
ascending boleh ditulis atau tidak .
SELECT nama,harga
FROM barang
ORDER BY harga DESC;
Beberapa hal yang perlu diperhatikan dalam penulisan statement dalam SQL :
a. SQL statement tidak case sensitive
b. SQL statement dapat dibuat dalam satu baris atau lebih
c. Keyword tidak dapat disingkat
d. Klausa biasanya ditempatkan di baris yang terpisah
e. Spasi digunakan untuk mempermudah
Untuk menyimpan sintaks query yang baru dieksekusi, maka digunakan perintah SAVE, contoh :
SQL> SELECT *
FROM rekappenjualan
SQL> SAVE data_rekap;
dan untuk memanggil sintaks query tersebut dapat dengan perintah START atau tanda @, contoh :
SQL> START data_rekap ;
Atau
SQL> @data_rekap;
Ada kemungkinan untuk menyisipkan item lain pada klausa SELECT yaitu :
1. Ekspresi Aritmatik
Terdiri atas : * ; / ; + ; Contoh :
MODUL PRAKTIKUM BASIS DATA RELASIONAL
III- 4
MODUL III
DML DAN QUERY DASAR I
SELECT nama, jml_stock+2
FROM barang
WHERE id_barang='B001';
Keterangan :
a. Perkalian dan pembagian didahulukan daripada penjumlahan dan pengurangan
b. Operator dengan prioritas yang sama (misal perkalian dan pembagian) akan dieksekusi dari
operator yang paling kiri (pertama ditulis)
c. Tanda kurung () digunakan untuk menandakan bahwa statement di dalamnya harus
dieksekusi terlebih dahulu.
2. Kolom Alias
Digunakan untuk mengganti heading dari hasil query atau nama tabel. Kolom alias ditulis
setelah klausa SELECT. Secara default, alias ditampilkan dengan huruf capital dan tidak ada
spasi. Dibutuhkan tanda kutip dua (_) jika nama alias mengandung spasi atau karakter khusus
atau jika kasusnya sensitive. Dapat juga menggunakan keyword AS. [3]
Contoh :
SELECT nama Nama, alamat AS alamat, no_telp nomor telepon
FROM pegawai
WHERE id_pegawai=P002;
3. Kolom Konkat
Operator konkat (||) atau penggabungan digunakan untuk menghubungkan suatu kolom
dengan kolom lain, ekspresi aritmatik atau nilai konstan untuk membentuk ekspresi karakter.
Contoh 3:
SELECT nama || || alamat Data Pegawai
FROM pegawai ;
4. Literal
Merupakan karakter, ekspresi atau bilangan yang terdapat pada klausa SELECT namun bukan
merupakan salah satu field atau kolom pada tabel yang digunakan (tabel setelah klausa FROM)
dan ingin ditampilkan pada setiap baris hasil query.
Contoh 4:
SELECT nama, memiliki alamat di,alamat
FROM pegawai ;
Blind Variabel
Variabel yang dideklarasikan pada blok PL/SQL dan disimpan nilainya yang bias di-assign dan
dibaca pada saat runtime. Variabel ini hanya berlaku pada blok PL/SQL itu saja, dan blok-blok
yang menjadi subbloknya. Jadi, variabel ini tidak bisa diakses langsung oleh blok lain. Namun,
SQL*Plus menyediakan fitur agar sebuah variabel dapat diakses dari mana saja dalam satu
session SQL*Plus selama variabel tersebut tidak dihapus. Penjelasan selanjutnya akan dibahas
pada modul PL/SQL.
Substitution Variabel
Di dalam SQL*Plus sebuah variabel yang bisa didefinisikan oleh user dan nilainya harus diberikan
saat runtime. Tanda ampersand (&) dan double ampersand (&&) dapat digunakan untuk
substitution variabel.
1. Single Ampersand (&)
Tipe variabel ini bisa digunakan sebagai tambahan untuk kondisi Where, klausa Order By,
ekspresi kolom, nama tabel, dan pernyataan Select. Setiap kali runtime, sistem akan selalu
III- 5
MODUL III
DML DAN QUERY DASAR I
meminta inputan user, karena variabel ini tidak didefinisikan sehingga tidak disimpan
nilainya.
Contoh: menampilkan nama dari tabel customer dimana id_customer dari input user.
SELECT nama FROM custome
WHERE id_customer=&vidcstmr;
Saat runtime inputan user untuk variabel id_customer
Enter valur for vidcstmr: C003
Hasil setelah dieksekusi :
old 3: WHERE id_style=& vidcstmr
new 3: WHERE id_style=C003
2. Double Ampersand (&&)
Perbedaannya dengan single ampersand substitution variabel adalah bahwa variabel jenis ini
akan menyimpan nilai yang di-assignkan oleh user. Tanda double ampersand ini dapat
digunakan jika sejumlah substitution variabel dengan nama yang sama dimaksudkan
mempunyai nilai yang sama pula. Nilai yang dimasukan akan terus disimpan selama session
SQL berlangsung.
Contoh: menampilkan alamat pegawai dimana nama-nya diinputkan oleh user dan nilai
tersimpan dalam variabel.
SELECT alamat FROM pegawai
WHERE nama =&&vnama;
Saat runtime minta inputan user untuk variabel vnama, misal diinputkan Peter.
Enter value for vnama : Peter
Jika kita menjalankan lagi query di atas, maka sistem akan langsung menampilkan hasilnya,
tidak meminta inputan user, karena variabel substitution vnama sudah didefinisikan
sebelumnya dan sudah menyimpan suatu nilai.
Note.
III- 6
MODUL III
DML DAN QUERY DASAR I
Operator Pembanding
1. Operator dengan Lambang Aritmatik
Operator
=
>
<
Definisi
Sama dengan
Lebih besar dari
>=
Lebih besar atau sama dengan
<=
Lebih kecil atau sama dengan
<> atau !=
Tidak sama dengan
Contoh : Menampilkan nama barang yang jumlah stocknya kurang dari 100.
SELECT nama FROM barang WHERE jml_stock < 100;
2. IN dan NOT IN
Operator IN dan NOT IN digunakan untuk membandingkan sebuah nilai terhadap nilai di
dalam (IN) atau di luar (NOT IN) sebuah list. Bentuk umumnya adalah :
WHERE nama_kolom IN (nilai1,nilai2,nilai3,)
WHERE nama_kolom NOT IN (nilai1,nilai2,nilai3,)
Contoh : menampilan nama barang yang jumlah stocknya selain 25 dan 75.
SELECT nama FROM barang WHERE jml_stock NOT IN (25,75);
Selain untuk yang bernilai integer atau bilangan bisa juga dengan membandingkan tipe
string.
Contoh : menampilkan besar diskon yang jenis membernya selain platinum dan gold.
SELECT diskon FROM kartu_member
WHERE jenis_member NOT IN (Platinum,Gold);
Data NULL tidak dapat digunakan secara langsung dalam perhitungan karena nilai NULL
bukan berarti nol, melainkan tidak diketahui atau tidak ada. Oleh karena itu data NULL tidak
bisa dibandingkan terhadap suatu nilai yang actual. Operator IS NULL digunakan untuk
mengenali data NULL. Bentuk umumnya :
WHERE nama_kolom IS NULL
WHERE nama_kolom IS NOT NULL
Contoh : menampilkan semua data pegawai dari tabel pegawai dari field yang
alamatnya NULL
SELECT * FROM pegawai
WHERE alamat IS NULL;
III- 7
MODUL III
DML DAN QUERY DASAR I
Bagaimana jika string yang ingin dibandingkan mengandung karakter % atau _ ? untuk
mengatasi itu, oracle menyediakan kata kunci ESCAPE sehingga kedua wildcard tersebut
tetap digunakan debagai karakter pembanding. Dalam penggunaannya, ESCAPE diikuti
oleh sebuah karakter tunggal sembarang yang menjadi escape character. Tanda % dan
_ yang mengikuti escape character tersebut akan dianggap sebagai karakter
pembanding, bukan sebagai wildcard.[3]
Contoh: menampilkan nama meeting room yang namanya diawali huruf C dan terdapat
karakter _
SELECT nama FROM customer
WHERE nama LIKE C%\_% ESCAPE \;
KET : Escape karakter \ pada C%\_% di atas berfungsi untuk membuat karakter _ di
belakangnya menjadi karakter pembanding, bukan sebagai wildcard. Sembarang
karakter-pun boleh menjadi escape character.
Derajat Operator
Derajat
Operator
1
2
3
NOT
+ - (Unary Operator)
4
5
6
7
+ - ||
= <> != ^= < > <= >= LIKE BETWEEN IN IS NULL
AND
OR
*/
III- 8
MODUL III
DML DAN QUERY DASAR I
VI. Latihan
1)
3) Buatlah sebuah query untuk menampilkan nama pegawai dan tanggal rekap yang bertugas
mendata rekappenjualan dimana id_rekap=R001 (buat tampilan semirip mungkin dengan
contoh dibawah).
III- 9
MODUL IV
QUERY DASAR II
MODUL 4
QUERY DASAR II
Tujuan Praktikum :
1.
2.
Mengetahui dan memahami fungsi-fungsi karakter, numerik, tanggal, konversi, dan fungsi agregasi pada
SQL*Plus
Mengetahui dan memahami data yang bersumber dari beberapa tabel dan penggunaan JOIN.
I. Fungsi-fungsi
CONCAT (column1/expression1,
column2/expression2)
LENGTH (column/expression)
SUBSTR (column/expression,m,[n])
LPAD(column/expression,n,[string2])
RPAD(column/expression,n,[string2])
LTRIM(column/expression,[string2])
RTRIM(column/expression,[string2])
INSTR(column/expression,string2,[m][,
n])
REPLACE(text,search_string,[replaceme
nt_string])
TRANSLATE(Str1,Str2,[Str3])
IV - 1
MODUL IV
QUERY DASAR II
Misal terdapat string how do you do dengan posisi karakter sebagai berikut :
H
O
W
D
O
Y
O
U
1
2
3
4
5
6
7
8
9
10
11
SQL> SELECT INSTR (how do you do,do) ini1,
FROM List_Barang
WHERE jenis = 'MAKANAN'
MINUMAN;
O
13
D
12
OR jenis =
translate
IV - 2
MODUL IV
QUERY DASAR II
HH
HH24
MI
SS
ADD_MONTHS (d,n)
SYSDATE
LAST_DAY (d)
NEXT_DAY (d,day_name)
MONTHS_BETWEEN (d1,d2)
IV - 3
MODUL IV
QUERY DASAR II
Fungsi Konversi
TO_NUMBER (char)
TO_CHAR (date)
TO_CHAR (number)
TO_DATE (char)
AS output
FROM null_test_tab ORDER BY id;
AS output
FROM null_test_tab ORDER BY id;
Fungsi Umum
NVL(ex1,ex2)
NVL2(ex1,ex2,ex3)
NULLIF(ex1,ex2)
COALESCE(ex1,ex2, exN)
IV - 4
MODUL IV
QUERY DASAR II
SQL > Select nama_pemesan, alamat_pemesan, nvl(no_telp,tidak punya nomor telepon) telepon from
pemesan;
(Query ini akan menghasilkan string tdk pny nmr telp jika kolom telp bernilai NULL)
SQL > Select nama_pemesan, alamat_pemesan, nvl2(no_telp,punya telepon,tidak punya nomor telepon)
telepon from pemesan;
(Query ini akan menghasilkan string tdk pny nmr telp jika kolom telp bernilai NULL dan
menghasilkan string pny nmr telp jika bernilai NOT NULL)
Contoh :
SELECT nama_pemesan
CASE jns_kelamin
WHEN L THEN Pria
WHEN P THEN Wanita
ELSE Salah Input
END
FROM pemesan;
(Query di atas akan mengecek nilai pada kolom jns_kelamin, apabila ditemukan L, maka
akan diubah menjadi Pria, dan apabila ditemukan P, akan diubah menjadi Wanita,
sedangkan apabila ditemukan selain P atau L, maka akan diisi dengan salah input).
DECODE Function
Fungsi DECODE memiliki fungsionalitas yang sama dengan CASE Expression, yaitu
memfasilitasi kebutuhan kondisional dengan mengerjakan pekerjaan yang ada dalam fungsi
CASE atau statement IF-THEN-ELSE.
Bentuk umumnya adalah :
DECODE (col| expression, search1, result1
[, search2, result2 ,, ]
[, default])
Contoh :
SELECT nama_pemesan,
DECODE (jns_kelamin,L,Pria,P,Wanita,salah input)
FROM pemesan;
(Query di atas cara kerjanya sama dengan contoh CASE sebelumnya, yang akan
menghasilkan Pria jika ditemukan L dan akan menghasilkan Wanita jika ditemukan P,
sedangkan jika ditemukan selain P atau L, akan menghasilkan salah input).
IV - 5
MODUL IV
QUERY DASAR II
Contoh :
SELECT AVG(harga_fasilitas), MAX(harga_fasilitas),
MIN(harga_fasilitas),
SUM(harga_fasilitas), STDDEV(harga_fasilitas),
VARIANCE(harga_fasilitas), COUNT(harga_fasilitas)
FROM fasilitas ;
Yang ditampilkan adalah yang kondisi dalam klausa where nya terpenuhi kedua-duanya.
Oracle akan mendahulukan AND dibanding OR dan untuk query yang membutuhkan kondisi
kompleks, pengunaan ( ) sangat membantu untuk memilah-milah urutan proses.
Contoh :
SELECT nama_fasilitas, count(nama_fasilitas)
FROM fasilitas
WHERE harga_fasilitas > 10000 AND jum_max_fasilitas < 10 OR jum_max_fasilitas > 20 AND nama_fasilitas LIKE K% OR
nama_fasilitas LIKE A%;
IV - 6
MODUL IV
QUERY DASAR II
V. KLAUSA ORDER BY
Klausa ORDER BY digunakan untuk mengurutkan hasil query berdasarkan kolom tertentu.
Klausa yang mengikutinya adalah ASC untuk terurut ASCENDING (dari kecil ke besar), dan DESC
untuk terurut DESCENDING (dari besar ke kecil). Secara default, klausa ORDER BY menggunakan
ASC. Klausa ini bisa dijalankan setelah klausa FROM . Jika terdapat klausa WHERE, maka ORDER BY
ditempatkan setelah WHERE (biasanya ORDER BY ditempatkan di paling akhir suatu query). [3]
Bentuk umumnya adalah :
SELECT [ALL|DISTINCT] {*|nama_kolom1, nama_kolom2, }
FROM {nama_tabel_sumber1, nama_tabel_sumber2, ...}
[WHERE kondisi]
[ORDER BY nama_kolom [ASC|DESC]]
Contoh :
Menampilkan id_reservasi dan tgl_reservasi yang jumlah orangnya lebih besar dari 50, dan terurut
secara descending berdasarkan tgl_reservasi dan id_reservasi.
SELECT id_reservasi
FROM reservasi
WHERE jum_org > 50
ORDER BY tgl_reservasi DESC;
Pada klausa ORDER BY ini, kita juga bisa megurutkan berdasarkan beberapa kolom tertentu. Untuk
pengurutan dengan banyak kolom, maka ditambahkan koma setelah nama kolom.
Contoh :
SELECT id_reservasi, tgl_reservasi
FROM reservasi
WHERE jum_org > 50
ORDER BY tgl_reservasi, id_reservasi DESC;
Klausa HAVING digunakan untuk mendefinisikan kondisi dari record yang akan ditampilkan
dari kelompok group yang dibuat dengan klausa GROUP BY. Penggunaan klausa HAVING dipakai
sebagai pengganti klausa WHERE yang tidak dapat untuk menyaring data dalam hubungannya
dengan penggunaan GROUP BY. Klausa HAVING dapat digunakan jika terdapat klausa GROUP BY.
IV - 7
MODUL IV
QUERY DASAR II
JOIN
SQL juga menyediakan operasi yang dapat digunakan untuk memperoleh data hasil Query yang
didapat dari dua tabel atau lebih. Operasi tersebut dikenal dengan istilah join. Penggabungan
tabel-tabel tersebut harus melibatkan suatu kondisi yang dapat membentuk hubungan antara
satu tabel dengan tabel lainnya. Kondisi penggabungan tersebut dikenal dengan istilah join
condition (Join yang dipakai mengacu pada SQL 1999). Selain Join yang terdapat pada SQL 1999,
pada Oracle juga terdapat 4 buah join yang digunakan pada versi 8i, yaitu EquiJoin, NonEquijoin, Outer Join, dan Self Join [3]. Join pada SQL 1999 terdiri dari 3 jenis utama, yaitu :
1. CROSS JOIN
Cross Join bisa diartikan sebagai cross-product pada dua tabel (Cartesian Product).
Cartesian product adalah penggabungan dua tabel atau lebih tanpa join condition yang harus
dipenuhi. Jumlah baris data yang dihasilkan adalah jumlah baris data tabel kiri dikali jumlah
baris data tabel kanan.
Contoh selanjutnya digunakan tabel berikut :
Contoh :
SELECT tgl_reservasi, nama_petugas
FROM petugas
CROSS JOIN reservasi;
Untuk memudahkan dalam memahami hasil dari CROSS JOIN dapat dilihat contoh berikut :
IV - 8
MODUL IV
QUERY DASAR II
2. NATURAL JOIN
Sebuah NATURAL JOIN akan mengambil baris dari tabel-tabel yang mempunyai kesamaan
pada semua nama kolom. Jika ada sebuh kolom mempunyai nama yang sama akan tetapi
tipe datanya berbeda, maka Oracle akan mengembalikan error message. Contoh :
Asumsi tabel petugas dan reservasi mempunyai satu kolom yang sama, yaitu kolom
id_petugas.
SELECT id_petugas, nama_petugas, tgl_reservasi
FROM petugas
NATURAL JOIN reservasi ;
Query di atas sama dengan query EquiJoin yang terdapat pada Oracle 8i :
SELECT petugas.id_petugas, petugas.nama_petugas, reservasi.tgl_reservasi
FROM petugas, reservasi
WHERE petugas.id_petugas = reservasi.id_reservasi ;
JOIN USING
Jika sebagian kolom mempunyai nama yang sama, akan tetapi semua atau ada beberapa tipe
data yang tidak sama, maka pada natural join ini kita bisa saja memodifikasi menjadi sebuah join
dengan menggunakan klausa USING. Kolom pada klausa USING haruslah tidak mempunyai
sebuah qualifier atau alias pada SQL statement (tidak boleh ada prefix).
Contoh :
SELECT id_petugas, nama_petugas, tgl_reservasi
FROM petugas
JOIN reservasi
USING (id_petugas) ;
IV - 9
MODUL IV
QUERY DASAR II
JOIN ON
Klausa ON digunakan untuk menspesifikasikan kolom yang digunakan pada join. Klausa ini juga
dapat digunakan untuk menspesifikasikan sebuah join pada kolom yang mempunyai nama yang
berbeda.
Contoh :
Contoh ini mempunyai menggunakan asumsi yang sama dengan contoh sebelumnya.
SELECT petugas.id_petugas, petugas.nama_petugas,
reservasi.tgl_reservasi
FROM petugas
JOIN reservasi
ON (petugas.id_petugas = reservasi.id_reservasi) ;
Join pada table dirinya sendiri atau pada Oracle 8i disebut dengan Self Join.
SELECT p.nama_petugas, t.nama_manager
FROM petugas p
JOIN petugas t
ON (p.id_petugas=t.id_petugas) ;
3. OUTER JOIN
Join dari dua tabel yang mengembalikan hanya row-row yang sama jumlahnya pada setiap
kolomnya disebut dengan INNER JOIN. Penggabungan dua buah table atau lebih yang
menghasilkan baris-baris data di mana kolom-kolom yang menjadi join condition merupakan
kolom yang harus memiliki nilai (tidak boleh null). Jika sebuah join antara dua buah tabel
tersebut mengembalikan row yang di antara kolomnya tidak sama pada kiri atau kanan
tabel, maka join tersebut disebut LEFT / RIGHT OUTER JOIN.
Ada tiga jenis OUTER JOIN, di antaranya adalah :
LEFT OUTER JOIN
Join antara dua buah tabel yang mengembalikan hasil dengan baris boleh NULL pada kiri
kolom tabel. Atau bisa dikatakan, join antara dua tabel yang menampilkan semua data di
tabel kiri, walaupun data di tabel sebelah kanannya bernilai NULL.
Contoh :
SELECT *
FROM reservasi
LEFT OUTER JOIN petugas
ON (reservasi.id_petugas = petugas.id_reservasi) ;
IV - 10
MODUL IV
QUERY DASAR II
IV - 11
MODUL IV
QUERY DASAR II
NON-EQUIJOIN
Non equijoin terdapat dalam Oracle 8i atau SQL 89. Non-Equijoin menghubungkan antara dua
buah tabel yang tidak harus sama kolom pembandingnya. Misalnya, kita akan menggabungkan
tabel Mahasiswa dengan tabel Grade_Nilai seperti berikut ini :
Contoh :
SELECT m. Nama, m.Nilai, g.Grade
FROM mahasiswa m, Grade_Nilai g
WHERE m.Nilai BETWEEN g.Batas_Bawah AND g.Batas_Atas ;
IV - 12
MODUL IV
QUERY DASAR II
VIII. LATIHAN
1.
b. Buatlah sintaks untuk menampilkan nim dan jumlah buku yang pernah dipinjam oleh nim
mahasiswa tersebut dimana hanya mahasiswa yang pernah meminjam 3 atau lebih buku yang
ditampilkan.
c. Jelaskan perbedaan penggunaan klausa HAVING dan WHERE dari pertanyaan 4.a dan 4.b.
3.
Karena kesalahan input, masih ada beberapa petugas yang tidak memasukkan nomer teleponya.
Maka dari itu ingin ditampilkan, id dan nama petugas yang tidak punya nomer telp, dengan
mengganti nomer teleponnya dengan tulisan ngga punya. Beserta berapa banyak barang yang
pernah petugas tersebut rekap.
IV - 13
MODUL V
QUERY LANJUT
MODUL V
QUERY LANJUT
Tujuan Praktikum :
1.
Mampu Memahami dan mengetahui perbedaan penggunaan Corelated Subquery dengan subquery.
2.
Mampu menggunakan DDL QUERY & DML QUERY untuk mensupport terjadinya proses pembuatan DDL
(Data Definition Language) maupun DML (Data Manipulation Language)
3.
Dapat memahami perbedaan serta mampu menggunakan CUBE, ROLLUP, dan GROUPING SETS untuk
menampilkan data dalam bentuk report.
4.
Dapat menggunakan fungsi-fungsi tambahan yang berhubungan dengan CUBE, ROLLUP, and GROUPING
SETS.
I. Subquery
Subquery diperlukan ketika kita akan melakukan query terhadap suatu tabel dan memerlukan
informasi dari tabel lain dengan melakukan query terhadap tabel tersebut. Subquery tersebut
biasanya dijalankan setelah klausa where atau having.
Ada dua tipe dari subquery, yaitu Single-row subquery dan Multiple-row subquery
1. Single-row Subquery
Subquery ini adalah subquery yang hanya menghasilkan satu baris data saja. Penggunaan
subquery ini biasanya melibatkan operator aritmatik seperti yang telah dipelajari di modul
dua. Untuk lebih jelasnya, perhatikan tabel Pegawai di bawah ini.
Id_pegawai
EMP001
EMP002
EMP003
EMP004
EMP005
EMP006
EMP007
EMP008
EMP009
EMP010
EMP011
EMP012
Nama
Dewo
Desca
Mariana
Nugi
Prima
Hisban
Tegar
Aziz
Faathir
Olfit
Iin
Nessia
Id_dept
Id_job
Gaji
1
1
2
2
3
3
4
4
5
6
6
7
A
B
B
D
C
D
A
B
E
C
F
A
5.000.000
1.000.000
1.000.000
3.000.000
4.000.000
3.000.000
5.000.000
1.000.000
10.000.000
4.000.000
500.000
5.000.000
Query diatas akan menampilkan Id_pegawai dan Nama dari tabel Pegawai yang mempunyai Gaji
tertinggi, dimana subquery diatas (SELECT MAX(Gaji) FROM Pegawai) hanya akan mengeluarkan satu
baris hasil yaitu 10.000.000.
V- 1
MODUL V
QUERY LANJUT
2. Multiple-row Subquery
Subquery ini adalah subquery yang dapat menghasilkan lebih dari satu baris data sekaligus.
Penggunaan subquery ini melibatkan operator pembanding seperti di bawah ini :
Operator
IN
NOT
ANY
SOME
ALL
Definisi
Merupakan perbandingan nilai inputan pada satu set nilai. Mengembalikan TRUE jika
nilai subjek sama dengan salah satu nilai di set. Mengembalikan FALSE jika subquery
tidak mengembalikan baris.
Digunakan dengan IN untuk mengembalikan hasilnya. Mengembalikan nilai TRUE jika
subquery tidak menghasilkan nilai pada satu baris.;
Digunakan saat kombinasi dengan perbandingan single row (seperti = atau >) berguna
untuk membandingkan nilai subjek dengan subquery Multirow. Pengembalikan TRUE
jika nilai subjek menemukan kecocokan yang konsisten dengan operator perbandingan
di salah satu baris yang dikembalikan oleh subquery. Mengeluarkan hasil FALSE jika
subquery tidak menghasilkan baris.
Digunakan saat kombinasi dengan perbandingan single row (seperti = atau >) berguna
untuk membandingkan nilai subjek dengan subquery Multirow. Pengembalikan TRUE
jika nilai subjek menemukan kecocokan yang konsisten dengan operator perbandingan
di salah satu baris yang dikembalikan oleh subquery. Mengeluarkan hasil FALSE jika
subquery tidak menghasilkan baris.
Digunakan saat membandingkan kombinasi dengan kondisi satu baris dibandingkan
dengan nilai subjek dengan subquery Multirow. Hasil bernilai TRUE jika nilai subjek
dengan subquery menemukan kecocokan konsisten dengan perbandingan operator di
seluruh baris yang dikembalikan oleh subquery. Hasil bernilai TRUE jika subquery tidak
menghasilkan
baris.
Contoh : cari semua produk dengan harga yang lebih besar dari semua produk dalam
kategori Mewah; SELECT * FROM PRODUCTS WHERE PRICE > ALL (SELECT PRICE FROM
PRODUCTS WHERE C TEGORY = Luxury )
Penggunaan ANY dan ALL sebelumnya diikuti oleh operator aritmatik (<,>). IN disini sama
artinya dengan = ANY
Kemudian jalankan query query di bawah ini:
Query A
SELECT Id_Pegawai,Nama
FROM Pegawai
WHERE Gaji < ANY
(SELECT Gaji
FROM Pegawai
WHERE Id_dept=4);
Query B
SELECT Id_Pegawai,Nama
FROM Pegawai
WHERE Gaji < ALL
(SELECT Gaji
FROM Pegawai
WHERE Id_dept=4);
Subquery diatas akan berisi Gaji pada Id_Job A dan B, sehingga Query A akan menampilkan
Id_pegawai dan Nama dengan Gaji dimana nilai Gaji tersebut lebih kecil dari Gaji dari
Id_job=A atau Id_job=B (Salah satu kondisi saja terpenuhi maka akan ditampilkan, dalam
hal ini Id_job=B juga akan ditampilkan).
Sedangkan query B menampilkan Id_pegawai dan Nama dengan Gaji dimana nilai
Gaji tersebut lebih kecil dari salary pada Id_job=A dan Id_job=B (Kedua kondisi harus
terpenuhi).
V- 2
MODUL V
QUERY LANJUT
Penggunaan subquery sebenarnya tidaklah harus pada klausa where dan having. Bisa saja
subquery ini dilakukan untuk meng-query nilai pada select statement. Kita bisa saja menggunakan
subquery dimana saja asalkan menghasilkan nilai yang single value.
Pada query di bawah ini, kita ingin mengetahui berapa banyak kolom dan index yang
berhubungan dengan tabel pada database berdasarkan pemilik table tertentu.
Contoh :
SELECT TABLE_NAME,
(SELECT COUNT(*) FROM ALL_TAB_COLUMNS C WHERE C.TABLE_NAME =
T.TABLE_NAME) Columns,
(SELECT COUNT(*) FROM ALL_INDEXES I WHERE I.TABLE_NAME = T.TABLE_NAME)
Indexes
FROM ALL_TABLES T WHERE OWNER = SH;
V- 3
MODUL V
QUERY LANJUT
Klausa WITH,
dibentuk di awal
rata2_gaji)
NAMA
Septian Ardyatana
Amalina
Edwin Adrianta
Kezia Oktiadiarti
Rico Aditya
Mary Elisabeth
Stephanie Leo
Herlia Kusumaningtyas
Taufan Dwiyana
Fauzi
Rosaria Tiara
Woe Novita
JABATAN
Panitia pusat
Panitia pusat
Panitia lokal
Panitia lokal
Panitialokal
Panitia pusat
Panitia pusat
Panitia lokal
Panitia lokal
Panitia pusat
Panitia pusat
Panitia lokal
JNS_KELAMIN
L
P
L
P
L
P
P
P
L
L
P
P
V- 4
MODUL V
QUERY LANJUT
JNS_KELAMIN
TOTAL
NULL
NULL
12
NULL
NULL
Panitia lokal
Panitia lokal
NULL
Panitia lokal
Panitia pusat
NULL
Panitia pusat
Panitia pusat
9 ROWS SELECTED
Untuk lebih mudah memahami hasil query di atas, maka data hasil menggunakan CUBE
dapat digambarkan sebagai berikut :
Panitia lokal
Panitia pusat
ALL
3
2
5
L
3
4
7
P
6
6
12
ALL
V- 5
MODUL V
QUERY LANJUT
JNS_KELAMIN
TOTAL
Panitia pusat
Panitia lokal
Panitia pusat
Panitia lokal
ROWS SELECTED
3. Rollup
Sementara itu, rollup pada oracle memiliki artian kurang lebih sama dengan cube,
namun tidak akan menampilkan kombinasinya melainkan menampilkan yang diminta pada
syarat GROUP BY saja yang akan ditampilkan atau istilah kerennya adalah not display its
combinations but just straight forward .
Syntaks bakunya adalah:
SELECT <grouping_columns>, <aggregate_functions>
FROM <table_list>
WHERE <where_condition>
GROUP BY ROLLUP (<column_set_1>, ... , <column_set_N>;
Contohnya adalah sebagai berikut :
JNS_KELAMIN
L
P
NULL
L
P
NULL
NULL
TOTAL
3
3
6
2
4
6
12
7 ROWS SELECTED
3. Grouping Sets
Sementara itu, ada satu lagi jenis GROUP BY yang akan kita bahas, yaitu GROUPING SETS.
Syntaks bakunya adalah:
SELECT <grouping_columns>, <aggregate_functions>
FROM <table_list>
WHERE <where_condition>
GROUP BY GROUPING SETS (<column_set_1>, ... , <column_set_N>;
GROUPING SETS ini merupakan salah satu jenis GROUP BY yang memiliki fungsi dimana
kolum" sets" bisa memiliki keluaran tidak sama sekali, satu ataupun banyak kolum yang telah
V- 6
MODUL V
QUERY LANJUT
digroupkan dari syntaks select, atau bisa dikatakan akan mengkalkulasi semua agregasi
(biasanya akan menghasilkan dua kali lipat dari hasi SELECT biasa, sesuai dengan jumlah kolom
yang akan di- GROUP BY- kan).
Sebagai contoh :
SELECT jabatan, jns_kelamin, COUNT(*) Total
FROM panitia
GROUP BY GROUPING SETS(jabatan, jns_kelamin);
Syntaks di atas akan mengeluarkan hasil seperti di bawah ini:
JABATAN
Panitia lokal
Panitia pusat
NULL
NULL
JNS_KELAMIN
NULL
NULL
P
L
TOTAL
6
6
7
5
4 ROWS SELECTED
Nama_Panitia
Septian Ardyatana Putra
Ananta Yudiarso
Edwin Adrianta Surijah
Kezia Oktiadiarti
Steffhany Kaunang
Jabatan
Panitia lokal
Panitia lokal
Panitia lokal
Panitia lokal
Panitia lokal
NAMA_PANITIA
Septian Ardyatana Putra
Ananta Yudiarso
Edwin Adrianta Surijah
Kezia Oktiadiarti
Steffhany Kaunang
COUNT(*)
1
1
1
1
1
1
1
1
1
1
5
Fungsi NVL akan mengganti nilal NULL pada field id_panitia (kode_panitia) dengan nilai Jumlah
Panitia.
V- 7
MODUL V
QUERY LANJUT
VII. LATIHAN
1.
C
V- 8
MODUL VI
PL/SQL
MODUL VI
PL / SQL
Tujuan Praktikum :
2.
3.
4.
5.
6.
7.
I. Definisi PL/SQL
PL/SQL (Procedural Languange/Structure Query Languange) merupakan sebuah bahasa
yang menggabungkan antara kekuatan dan fleksibilitas dari SQL / non prosedural dengan bentukbentuk prosedural (procedural construct).
Pada PL/SQL kamu dapat menuliskan perintah-perintah, seperti halnya pendeklarasian
variabel, statement kondisional (IF..Then..Else), pengulangan (LOOP), dsb. PL/SQL tidak
mendukung Data Definition Language(DDL) seperti CREATE TABLE, ALTER TABLE atau DROP
TABLE, selain itu juga tidak mendukung Data Control Language(DCL) seperti GRANT atau REVOKE.
Beberapa karakteristik dari PL/SQL[5], antara lain :
1. User friendly
2. Bahasa standard dan portabel dalam pengembangan Oracle
3. Merupakan bahasa bawaan dari Oracle yang berarti PL/SQL dapat dieksekusi di host
maupun di client
4. Integritas yang tinggi
Blok tersebut dapat berdiri sendiri atau berada dalam blok lain, yang disebut dengan subblok.
Seperti terlihat diatas, blok PL/SQL lengkap terdiri dari 3 bagian yaitu :
1. Declaration Section
Digunakan untuk mendefinisikan / mendeklarasikan variable, konstanta, cursor, dan
VI - 1
MODUL VI
PL/SQL
seluruh exception yang didefinisikan oleh user yang akan digunakan pada bagian eksekusi [7].
Penulisan blok ini dimulai dengan menulis DECLARE.
DECLARE
v_first_name VARCHAR2(35);
v_last_name VARCHAR2(35);
v_counter NUMBER := 0;
2. Executable Section
Digunakan untuk mengeksekusi / menjalankan blok perintah PL/SQL, seperti pengulangan,
percabangan, perintah SQL dan perintah CURSOR[7]. Berisi statement SQL untuk
memanipulasi data pada basis data, dan statement PL/SQL untuk memanipulasi data dalam
blok.
BEGIN
SELECT first_name, last_name
INTO v_first_name, v_last_name
FROM student
WHERE student_id = 123;
DBMS_OUTPUT.PUT_LINE ('Student name: '||v_first_name||' '||v_last_name);
END;
3. Exception Section
Merupakan bagian yang akan diaktifkan bila terjadi kesalahan atau pengecualian pada saat
menjalankan program PL/SQL (executable statement)[7]. Exception Section terdiri dari
predefined dan user-defined. Sebagai contoh exception predefined NO_DATA_FOUND akan
diaktifkan bila perintah DML SQL tidak menemukan data dalam clausa Where.
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('There is no student with '||'student id 123');
END;
Penggunaan PL/SQL :
Contoh 1
BEGIN
dbms_output.put_line('Hello World');
END;
/
Untuk menampilkan output dari blok PL/SQL, maka terlebih dahulu menset SERVEROUTPUT
menjadi ON. Hal ini cukup dilakukan sekali saja, saat membuka SQLplus.
SET SERVEROUTPUT ON;
Hasil Contoh 1:
Hello World
Blok PL/SQL selalu diawali dengan kata kunci BEGIN untuk memulai execution section
dan diakhiri dengan END, dimana keduanya bersifat wajib (executable section harus ada pada
sebuah blok). Sedangkan declare section dan exception section bersifat opsional. Contoh 1
merupakan contoh paling sederhana.
Berikut merupakan blok PL/SQL dengan DECLARATION, EXECUTABLE, dan EXCEPTION:
Contoh 2[7]
DECLARE
v_first_name VARCHAR2(35);
v_last_name VARCHAR2(35);
BEGIN
SELECT first_name, last_name
INTO v_first_name, v_last_name
VI - 2
MODUL VI
PL/SQL
FROM student
WHERE student_id = 123;
DBMS_OUTPUT.PUT_LINE ('Student name: '||v_first_name||' '||v_last_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('There is no student with '||'student id 123');
END;
/
Contoh 3[7]
DECLARE
v_name VARCHAR2(50);
v_total NUMBER;
BEGIN
SELECT i.first_name||' '||i.last_name, COUNT(*)
INTO v_name, v_total
FROM instructor i, section s
WHERE i.instructor_id = s.instructor_id AND i.instructor_id = 102
GROUP BY i.first_name||' '||i.last_name;
DBMS_OUTPUT.PUT_LINE('Instructor '||v_name||' teaches '||v_total||' courses');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('There is no such instructor');
END;
/
Bentuk lain dari Blok PL/SQL[7] :
Anonymous Block
Merupakan blok PL/SQL yang tidak bernama, tidak dapat disimpan dalam database dan
biasanya dibangun secara dinamik dan dieksekusi hanya sekali.
Named Block
Merupakan anonymous block dengan label yang diberi nama. Named blok dapat dibagi:
SubPrograms
Merupakan procedure, paket, dan fungsi-fungsi yang disimpan di database. Blok-blok
seperti ini dapat digunakan berulang kali dan dieksekusi secara explisit melalui call
(pemanggilan prosedur, paket atau fungsi tersebut).
Triggers
Merupakan named blocks yang juga disimpan di database. Blok ini dapat digunakan
berulang kali dan dieksekusi secara implisit dimanapun event trigger terjadi.
Identifier, merupakan nama untuk objek-objek PL/SQL seperti variabel, cursor , dsb
typedata merupakan tipe dari identifier tersebut, dan value merupakan nilai awal dari
identifier tersebut
NOT NULL, opsional untuk mendeklarasikan suatu identifier agar tidak boleh kosong
:= value, bisa merupakan literal, variabel yang lain atau sebuah ekspresi yang terdiri dari
operator dan fungsi. Jika nilai inisial tidak diberikan, maka suatu variabel akan diberikan nilai
Null untuk nilai inisialisasinya.
Keterangan
x adalah jumlah digit yang diinginkan (presisi), dan y menempatkan y desimal di
belakan koma (skala). Jika y tidak ada maka dibulatkan ke atas.
Contoh: v_kuantitas NUMBER(2,1);
VI - 3
MODUL VI
PL/SQL
Tipe Data
VARCHAR2(x)
CHAR(x)
DATE
BINARY_INTEGER
NATURAL
POSITIVE
%TYPE
%ROWTYPE
Keterangan
Dimana x adalah panjang karakter yang kita inginkan. Panjang defaultnya 1, dan
maksimal 32767. Contoh: v_nama_depan VARCHAR2(15);
Untuk string dengan panjang yang sudah pasti. Dengan panjang maksimal 255 untuk
PL/SQL versi 1 dan 32767 untuk PL/SQL versi 2.
Contoh: v_nim CHAR (9) := 113040000;
untuk data tanggal. Jangkanya dari 4712 sebelum Masehi sampai 4712 sesudah
Masehi. Contoh: Today DATE := SYSDATE;
Tipe variable ini digunakan untuk menyimpan nilai mulai dari -2.147.483.647 s/d
+2.147.483.647
Tipe variable ini merupakan bagian dari BINARY_INTEGER yang dapat menyimpan
mulai 0 s/d 2.147.483.647
Tipe variable ini merupakan bagian dari BINARY_INTEGER yang dapat menyimpan
mulai 0 s/d 2.147.483.647
Tipe variabel ini adalah sebuah atribut variabel untuk mendeklarasikan variabel
sesuai dengan type field di table. Contoh: V_MAHASISWA MAHASISWA.NIM %TYPE
Adalah atribut variabe yang digunakan untuk mendeklarasikan tipe data yang sesuai
degan semua baris pada satu kolom di tabel.
Contoh: R_MAHASISWA MAHASISWA %ROWTYPE
Contoh 4
DECLARE
v_jml_beri NUMBER NOT NULL := 12;
v_nama_depan VARCHAR2(15) := Tono;
v_nim CHAR(9) := 113010000;
Today DATE := SYSDATE;
phi CONSTANT Number (3,5) := 3.14286
BEGIN
Dbms_output.put_line(to_char(v_jml_beri));
Dbms_output.put_line(to_char(v_nama_depan));
Dbms_output.put_line(v_nim);
Dbms_output.put_line(to_char(today));
Dbms_output.put_line(to_char(phi));
END;/
VI - 4
MODUL VI
PL/SQL
dbms_output.put_line('NIM : '||var_nama);
dbms_output.put_line('Nama : '||var_nama);
dbms_output.put_line('Alamat : '||var_alamat);
dbms_output.put_line('Tgl lahir : '||var_tgl);
EXCEPTION
when no_data_found then
dbms_output.put_line('Data Mahasiswa tidak ditemukan');
END;/
%ROWTYPE dapat diartikan melakukan duplikasi pada salah satu tabel melalui suatu variabel,
dengan nilai/tipe yang serupa sesuai dengan tipe-tipe pada table.
Cara ini digunakan apabila :
Kita tidak ingin bersusah payah menspesifikkan semua atribut
Kita tidak mengetahui secara pasti semua atributnya
Kita membutuhkan operand, yakni sebuah objek bertipe TABEL.
Sintaks: [schema.]nama_tabel%ROWTYPE;
Contoh 6
DECLARE
rec_pemilih pemilih%rowtype;
BEGIN
select no_pemilih, nama, alamat
into rec_pemilih.no_pemilih, rec_pemilih.nama, rec_pemilih.alamat
from pemilih
where no_pemilih='&no_pemilih';
dbms_output.put_line('Nomor Pemilih : '||rec_pemilih.no_pemilih);
dbms_output.put_line('Nama Pemilih : '||rec_pemilih.nama);
dbms_output.put_line('Alamat Pemilih : '||rec_pemilih.alamat);
END;/
MHS-001
MHS-002
MHS-003
Budi
Slamet
Tarjo
VI - 5
MODUL VI
PL/SQL
Contoh 7
DECLARE
V_id mahasiswa.nim%TYPE;
V_nama mahasiswa.nama%TYPE;
BEGIN
select nim, nama into V_id, V_nama from mahasiswa
where id_mahasiswa LIKE %002;
dbms_output.put_line( V_id|| ||V_nama);
EXCEPTION
when no_data_found then
dbms_output.put_line(data tidak ditemukan);
END;
/
Contoh 8
DECLARE
Info_mahasiswa mahasiswa%ROWTYPE;
BEGIN
SELECT nim, nama, alamat INTO info_mahasiswa
FROM mahasiswa where nim LIKE %002;
dbms_output.put_line(info_mahasiswa.nim);
dbms_output.put_line(info_mahasiswa.nama||beralamat di||info_mahasiswa.alamat);
END;
/
Keterangan :
type_name merupakan nama dari tipe baru
Field-1 sampai Field-n merupakan nama dari field-field yang ada pada record
type-1 sampai type-n merupakan type data dari field tersebut.
Contoh 9
DECLARE
TYPE record_mahasiswa IS RECORD (
id mahasiswa.nim%TYPE,
nama mahasiswa.nama_ %TYPE,
alamat mahasiswa.alamat%TYPE);
info_mahasiswa record_mahasiswa ;
VI - 6
MODUL VI
PL/SQL
BEGIN
SELECT nim, nama, alamat INTO info_mahasiswa
FROM mahasiswa where nim LIKE %002;
dbms_output.put_line(info_mahasiswa.id);
dbms_output.put_line(info_mahasiswa.nama||beralamat di||info_mahasiswa.alamat);
END;
/
Selain dengan cara diatas, Record pada PL/SQL juga dapat dilakukan dengan %ROWTYPE.
Jika variabel yang digunakan pada record tersebut hanya berada pada satu tabel saja, maka cara
%ROWTYPE akan lebih mudah. Perhatikan perbedaan penggunaan keduanya pada contoh 7 dan 8.
Keterangan :
table_name : nama dari tipe baru yang akan didefinisikan
type : jenis tipe data yang digunakan
Jika ingin menggunakan PL/SQL Table, PL/SQL Table harus sudah didefinisikan terlebih dahulu.
Cara pemanggilannya :
Sintaks: nama_table(index)
Contoh 10
DECLARE
TYPE tabel_nomor IS
TABLE OF number
INDEX BY BINARY_INTEGER;
A tabel_nomor;
BEGIN
A(1) := 10;
A(2) := 20;
A(3) := 30;
Dbms_output.put_line(Nilai elemen ke-1|| = ||to_char(A(1)));
Dbms_output.put_line(Nilai elemen ke-2|| = ||to_char(A(2)));
Dbms_output.put_line(Nilai elemen ke-3|| = ||to_char(A(3)));
END;/
VI - 7
MODUL VI
PL/SQL
Contoh 11
DECLARE
equal Exception;
v_nilai1 number := &inputan_1;
v_nilai2 number := &inputan_2;
BEGIN
If v_nilai1 = v_nilai2 then
raise equal;
elsif v_nilai1 < v_nilai2
dbms_output.put_line(v_nilai1|| lebih kecil dari ||v_nilai2);
else
dbms_output.put_line(v_nilai1|| lebih besar dari ||v_nilai2);
end if;
EXCEPTION
when equal then
dbms_output.put_line(nilainya sama);
END; /
Contoh 12
DECLARE
V_counter number := 1;
BEGIN
LOOP
dbms_output.put_line(V_counter);
V_counter := V_counter + 1;
IF V_counter > 10 THEN
Exit;
END IF;
END LOOP;
END;/
Contoh 13 [3]
LOOP
balance_remaining := account_balance (account_id);
IF balance_remaining < 1000 THEN
EXIT;
ELSE
apply_balance(account_id, balance_remaining);
END IF;
END LOOP; /
VI - 8
MODUL VI
PL/SQL
2. WHILE-LOOP STATEMENT
Sintaks:
WHILE kondisi LOOP
Statement;
...
END LOOP;
Contoh 14
DECLARE
TYPE tabel IS TABLE OF varchar2(10) INDEX BY BINARY_INTEGER;
Data tabel;
vNoUrut number := 1;
BEGIN
WHILE vNoUrut <= 10 LOOP
Data(vNoUrut) := data ke- || to_char(vNoUrut);
dbms_output.put_line(Data(vNoUrut));
vNoUrut := vNoUrut + 1;
END LOOP;
END; /
3. FOR-LOOP STATEMENT
Sintaks:
FOR variabel-control IN [Reverse] nilai_rendah .. nilai_tinggi
LOOP
Statement;
...
END LOOP;
Keterangan :
REVERSE digunakan apabila kita ingin melakukan iterasi dari nilai tinggi ke rendah.
Sintaks : [3]
FOR loop_counter IN REVERSE 1 .. 10
LOOP
... executable statements ...
END LOOP;
Contoh 15
DECLARE
TYPE tabel IS TABLE OF varchar2(10) INDEX BY BINARY_INTEGER;
Data tabel;
vNoUrut number;
BEGIN
FOR vNoUrut IN 1..10
LOOP
Data(vNoUrut) := data ke- || to_char(vNoUrut);
dbms_output.put_line(Data(vNoUrut));
END LOOP;
END; /
X. LABEL dan GO TO
GOTO statement melakukan percabangan yang tidak memerlukan kondisi/ sesuai kebutuhan
programmer ke executable statement lain dalam bagian execution dari sebuah blok PL/SQL[7].
Sintaks penulisan label: <<nama_label>>
Sintaks pemrosesan label: GOTO nama_label;
VI - 9
MODUL VI
PL/SQL
Contoh 16 [1]
BEGIN
GOTO second_output;
DBMS_OUTPUT.PUT_LINE('This line will never execute.');
<<second_output>>
DBMS_OUPUT.PUT_LINE('We are here!);
END;/
XI. Penanganan Error (Exception)
Eksepsi merupakan sesuatu yang tidak diinginkan, harus diantisipasi dan ditangani dengan
baik. Ada beberapa macam eksepsi yang akan dipelajari :
1. Exception Dasar
Beberapa jenis kesalahan yang umum terjadi antara lain :
Jenis Error
Syntax Error
Logic Error
Compile Error
Run time Error
Keterangan
Kesalahan dalam penulisan sintaks. Misal kurang tanda ; dalam penulisan statement
Loop yang tanpa berhenti.
Penggunaan perintah yang salah dan baru diketahui pada saat di-compile
Error yang terjadi pada saat program dijalankan.
Adapun daftar nama eksepsi dalam Oracle (pre-defined exception) seperti di tabel berikut[6].
Nama Excpetion
CURSOR_ALREADY_OPEN
INVALID_CURSOR
NO_DATA_FOUND
TOO_MANY_ROWS
Error Code
ORA-6511
ORA-1001
ORA-1403
ORA-1422
ZERO_DEVIDE
ACCESS_INTO_NULL
COLLECTION_IS_NULL
ORA-1476
ORA-6530
ORA-6531
DUP_VAL_ON_INDEX
LOGIN_DENIED
NOT_LOGGED_ON
PROGRAM_ERROR
ROWTYPE_MISMATCH
ORA-1001
ORA-1722
ORA-1010
ORA-6501
ORA6504
STORAGE_ERROR
SUBSCRIPT_BEYOND_COUNT
ORA-6500
ORA-6533
SUBSCRIPT_OUTSIDE_LIMIT
ORA-6532
TIMEOUT_ON_RESOURCE
TRANSACTION_BACKED_OUT
VALUE_ERROR
ORA-0051
ORA-0061
ORA-6502
2.
Keterangan
Membuka cursor yang sudah dibuka
Menggunakan cursor yang tidak valid
Tidak ada baris yang dihasilkan oleh statement SELECT INTO
Baris yang dikembalikan oleh statement SELECT INTO lebih dari
satu baris
Pembagian dengan nol
Memberikan nilai ke atribut dari objek yang belum diinisialisasi
Dengan collection yang belum di inisialisasi, memberikan nilai ke
elemen, atau meminta collection method yang tidak ada
Melanggar constraint unique
Konversi dari string ke angka gagal
Melakukan operasi database pada saat tidak connect
Internal Error
Variabel host dan variabel cursor mempunyai tipe yang tidak
compatible
PL/SQL kekurangan memory
Mereferensi suatu collection dengan menggunakan angka index
yang lebih besar dari jumlah elemen di dalam collection
Mereferensi suatu collection dengan menggunakan angka index
yang lebih besar dari jumlah elemen di dalam collection
Waktu yang tersedia habis
Transaksi di Rollback karena deadlock
PL/SQL Operasi aritmatik, konversi, truncate, atau batas ukuran
yang salah
Exception Lanjut
Exception secara umum terjadi dalam dua cara :
1. Sebuah kesalahan ORACLE muncul apabila diasosiasikan dengan sebuah exception.
Exception ini muncul secara otomatis sebagai akibat dari kesalahan tersebut.
VI - 10
MODUL VI
PL/SQL
2. Sebuah Exception muncul secara explicit dengan menggunakan statement RAISE dalam
sebuah blok.
User Defined Exception[5]
Merupakan exception yang dibuat oleh user dan diaktifkan dengan perintah RAISE
Sintaks pendeklarasian exception: exception-identifier EXCEPTION;
Sintaks pemanggilan exception: RAISE exception-identifier;
VI - 11
MODUL VI
PL/SQL
When no_data_found then
RAISE_APPLICATION_ERROR(-20100, Mahasiswa tidak ditemukan);
END;
/
Contoh 20
BEGIN
Insert into mahasiswa(nim,nama) values(MHS-011,Carlos);
END;/
XII. LATIHAN
1. Jelaskan apa yang dimaksud dengan Declaration Section, Executable Section dan Exception
Section!
2. Buatlah contoh perulangan sederhalan yang menggunakan statement LOOP dan Exit!
3. a
VI - 12
MODUL VII
CURSOR
MODUL VII
CURSOR
Tujuan Praktikum :
8.
9.
10.
11.
I. Definisi
Blok PL/SQL tidak mengizinkan kita membuat query yang menghasilkan lebih dari satu baris untuk
ditampung dalam sebuah variabel. Untuk itu diperlukan sejenis variabel yang dapat menampung
lebih dari satu baris data. Variabel semacam ini dinamakan cursor. Cursor (dalam konteks database)
adalah sebuah area kerja dalam memory dimana ORACLE meletakkan current SQL statement. Cursor
merupakan variabel yang menunjuk baris data hasil sebuah query. Ketika blok PL/SQL melihat hasil
query, cursor digunakan untuk menunjuk setip baris yang dihasilkan.
Kegunaan
Kegunaan cursor, antara lain:
Untuk menerima hasil query yang jumlah barisnya lebih dari satu.
Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record.
Contoh implementasi cursor dalam SQL:
kasus1: buatlah sebuah blok PL/SQL dengan menggunakan cursor untuk mencari nama
mahasiswa dari table MAHASISWA yang mempunyai NIM=113060145. Sintaksnya:
DECLARE
nim_mhs VARCHAR2(9);
vnama_mhs Mahasiswa.nama%TYPE;
BEGIN
nim_mhs:=113060145;
SELECT nama INTO vnama_mhs FROM MAHASISWA
WHERE Nim=nim_mhs;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE(Data Mahasiswa tidak ditemukan);
ELSE
DBMS_OUTPUT.PUT_LINE(Nama Mahasiswa dengan NIM || nim_mhs ||
adalah: || vnama_mhs);
END IF;
END;/
kasus2: buatlah sebuah blok PL/SQL dengan menggunakan cursor untuk menampilkan nama
mahasiswa dari table MAHASISWA. Sintaks untuk menjawab kasus ini:
DECLARE
CURSOR c_nama IS
SELECT nama FROM MAHASISWA ORDER BY nama ASC;
Vnama_mhs MAHASISWA.nama%TYPE;
BEGIN
OPEN c_nama;
DBMS_OUTPUT.PUT_LINE(Daftar Nama Mahasiswa: );
LOOP
FETCH c_nama INTO vnama_mhs;
EXIT WHEN c_nama%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(c_nama%ROWCOUNT||. ||vnama_mhs);
END LOOP;
CLOSE c_nama;
END; /
VII- 1
MODUL VII
CURSOR
Kasus 3: buatlah sebuah blok PL/SQL dengan menggunakan cursor berparameter untuk
menampilkan nim mahasiswa dari table MAHASISWA yang memiliki nama yang sama.
Sintaks untuk menjawab kasus ini:
DECLARE
CURSOR c_nim (nama_mhs MAHASISWA.nama%TYPE) IS
SELECT Nim FROM MAHASISWA
WHERE nama=nama_mhs;
Vnim_mhs MAHASISWA.Nim%TYPE;
nama varchar2(20);
BEGIN
nama:=rahma;
OPEN c_nim(nama);
DBMS_OUTPUT.PUT_LINE(Daftar NIM Mahasiswa || yang memiliki nama
|| nama || : );
LOOP
FETCH c_nim INTO vnim_mhs;
EXIT WHEN c_nim%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(c_nim%ROWCOUNT||. ||vnim_mhs);
END LOOP;
CLOSE c_nim;
END; /
Keterangan
TRUE jika FETCH terakhir dari cursor menghasilkan sebuah baris dari active
set. Sebaliknya FALSE.
Kebalikan dari %FOUND
Jumlah baris yang telah diambil (FETCH).
Mengembalikan nilai TRUE jika cursor masih dalam keadaan terbuka (OPEN).
VII- 2
MODUL VII
CURSOR
Keterangan:
Action
Declare the cursor
Open the cursor (if not already open)
Fetch one or more rows from the cursor
Close the cursor
Line(s)
3
9, 11
15
18
Cursor Implisit
Cursor implisit merupakan cursor yang tidak perlu dideklarasikan terlebih dahulu pada declare
section sebelum digunakan. Cursor ini juga merupakan atribut yang berguna untuk mengetahui hasil
dari suatu perintah SQL dalam PL/SQL, akan tetapi tidak dapat digunakan dalam SQL.
Sebenarnya cursor implisit bukan merupakan cursor yang sebenarnya, karena pada
kenyatannya query yang dihasilkan hanya satu baris saja. Oracle menjalankan OPEN, FETCH, dan
CLOSE secara otomatis, dimana aksi ini berada diluar kontrol program[5].
Cursor implisit diasosiasikan dengan perintah SELECT, INSERT, DELETE, dan UPDATE. Atributatribut yang terdapat pada cursor implisit adalah:
Atribut
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
SQL%ISOPEN
Keterangan
TRUE jika FETCH terakhir dari cursor menghasilkan sebuah baris dari active
set. Sebaliknya FALSE.
Kebalikan dari %FOUND
Jumlah baris yang telah diambil (FETCH).
Mengembalikan nilai TRUE jika cursor masih dalam keadaan terbuka (OPEN).
Pada pernyataan UPDATE diatas, yang memberikan kenaikan gaji sebesar 10% kepada setiap orang
di perusahaan, PL/SQL menciptakan cursor implicit untuk mengidentifikasi kumpulan baris dalam
tabel yang dipengaruhi oleh UPDATE[5].
Untuk lebih memahami konsep mengenai materi ini, coba anda perhatikan baik-baik contoh blok
PL/SQL berikut ini:
VII- 3
MODUL VII
CURSOR
SET SERVEROUTPUT ON
DECLARE
CURSOR c_nama_pdd IS
SELECT nama_penduduk from PENDUDUK
WHERE GENDER= perempuan ORDER BY nama_penduduk ASC;
BEGIN
DBMS_OUTPUT.PUT_LINE (Daftar nama penduduk berjenis kelamin
perempuan adalah: );
FOR x IN c_nama_pdd
LOOP
DBMS_OUTPUT.PUT_LINE (c_nama_pdd%ROWCOUNT ||. ||
x.nama_penduduk);
END LOOP;
END;
CURSOR company_cur
RETURN company%ROWTYPE IS
SELECT * FROM company;
2. Open Cursor
Sintaks OPEN harus dilakukan sebelum mengambil baris (fetch rows) dari cursor. Isi cursor tidak
dapat dimanipulasi jika cursor belum dibuka.
Untuk membuka cursor (open), digunakan sintaks berikut:
OPEN nama_cursor [(argumen1 [,argumen2,dst...])];
Keterangan:
Cursor nama_cursor harus sudah dideklarasikan pada bagian DECLARE sebelumnya. Sedangkan
argumen dibutuhkan jika pendefinisian kursor menggunakan parameter.
Berikut contoh penggunaan sintaks OPEN untuk membuka cursor dengan nama company_cur:
OPEN company_cur;
VII- 4
MODUL VII
CURSOR
3. Fetch Rows
Sintaks FETCH digunakan untuk menyimpan isi dari baris (row) yang sedang ditunjuk cursor ke
variabel lokal, sehingga variabel harus dideklarasikan sebelumnya. Setiap fetch menyebabkan cursor
berpindah ke baris selanjutnya.
Untuk mengambil baris dari cursor (fetch), digunakan sintaks berikut:
FETCH nama_cursor INTO nama_variabel;
Keterangan:
Cursor nama_cursor harus sudah dideklarasikan dan dibuka sebelumnya. Tipe data dari
nama_variabel harus sama dengan tipe data dari baris (kolom tabel) yang diambil oleh cursor. Oleh
karena itu, untuk mengatasi kesalahan dapat digunakan atribut %TYPE atau %ROWTYPE yang dapat
mewakili tipe data dari kolom yang akan diambil (seperti yang telah dijelaskan pada modul
sebelumnya). Jika terjadi perubahan tipe data dari kolom yang diakses tersebut, tipe data variabel
pun akan ikut berubah sehingga dapat mencegah terjadinya kesalahan (error).
Berikut contoh penggunaan sintaks FETCH untuk mengambil / menyimpan baris dari cursor
company_cur ke dalam variabel var_company_id:
FETCH company_cur INTO var_company_id;
4. Close Cursor
Sintaks CLOSE digunakan untuk menutup cursor. Setelah semua baris (row) sudah diambil (fetch),
cursor harus ditutup untuk membebaskan memori / resource yang sebelumnya digunakan. Setelah
cursor ditutup, maka isi cursor sudah tidak dapat dimanipulasi lagi.
Untuk menutup cursor (close), digunakan sintaks berikut:
CLOSE nama_cursor;
IV. LATIHAN
1. Apa Tujuan utama pendeklarasian cursor?
2. DECLARE
i NUMBER(3);
hasil NUMBER(5);
BEGIN
i := 1;
WHILE i <= 3 LOOP
Hasil := i*3;
DBMS_OUTPUT.PUT_LINE(i || kali 3 = || hasil);
i := i + 1;
END LOOP;
END;
/
Apa yang akan dihasilkan bari baris program tersebut?
3. Apakah Fungsi dari atribut Cursor_name%ROWCOUNT?
4. Buatlah sebuah sintaks sederhana yang menggunakan FOR-LOOP!
5. Buatlah sebuah sintaks sederhana yang menggunakan LOOP biasa (OPEN-FETCH)!
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013
VII- 5
MODUL VIII
STORED PROGRAM
MODUL VIII
STORED PROGRAM
Tujuan Praktikum:
1.
2.
I. PROCEDURE
DEFINISI
sekumpulan blok PL/SQL yang tersimpan di suatu skema database (schema) dan dapat dieksekusi
berulang kali oleh user yang memiliki privilege untuk mengeksekusi procedure tersebut.[8]
KEGUNAAN PROCEDURE[8]
Dapat memproses dan meningkatkan performansi dari proses yang kompleks.
Dapat menggunakan perintah query yang tersimpan dalam procedure berulang kali karena
procedure tersimpan dalam skema database dan bersifat static.
VIII- 1
MODUL VIII
STORED PROGRAM
Keterangan :
Kata kunci CREATE digunakan untuk membuat sebuah procedure baru. Kata kunci OR
REPLACE bersifat optional dan ditambahkan setelah kata CREATE jika ingin membuat ulang
atau mengganti isi procedure yang telah ada. Kata kunci OR REPLACE dapat juga digunakan
untuk meng-compile ulang procedure.
Kata kunci schema. bersifat optional dan digunakan ketika mengakses procedure dari schema
database lain.
Kata kunci argument bersifat pilihan. Argument disini merupakan parameter dari procedure
tersebut. Ketika digunakan, maka tipe data dari argument tersebut wajib disertakan. Pada
argument dapat ditambahkan atribut IN, OUT, atau IN OUT. Bila argument tersebut tidak
menambahkan atribut IN, OUT, ataupun IN OUT, maka secara default argument tersebut
memiliki atribut IN. Atribut IN berfungsi untuk menandakan argument tersebut sebagai nilai
masukan sehingga ketika procedure dipanggil, argument yang diberikan harus berupa
representasi sebuah nilai. OUT berfungsi untuk menandakan bahwa nilai argument tersebut
dapat berubah di dalam procedure dan prosedur akan mengembalikan nilai melalui
argument tersebut. IN OUT merupakan gabungan IN dan OUT dimana nilai argument
tersebut harus ditentukan ketika prosedur ini dipanggil, dan prosedur tersebut akan
mengembalikan sebuah nilai melalui argument tersebut.
Kata kunci IS atau AS mengindikasikan dapat dimulainya PL/SQL sub program.
PL/SQL sub program blok merupakan isi dari prosedur tersebut. Blok ini berisi kode-kode
yang ditulis dengan PL/SQL dan dapat memuat pernyataan DML (DML Statement) apapun
dan tidak bisa memuat DDL Statement (contoh: create view).[8]
MENGEKSEKUSI PROCEDURE[9]
Setelah procedure sukses dibuat/created, untuk mengeksekuksinya dapat dilakukan :
Menggunakan sintaks :
EXECUTE nama_procedure(parameter_1,parameter_2,,parameter_n);
Melalui blok PL/SQL, procedure, function, atau trigger, procedure dapat dipanggil tanpa
menggunakan perintah EXECUTE.
MENGHAPUS PROCEDURE[9]
Untuk menghapus procedure yang telah ada, dapat menggunakan sintaks :
DROP PROCEDURE nama_procedure;
NESTED PROCEDURE
Merupakan procedure yang dibuat pada bagian DECLARATION SECTION pada suatu blok PL/SQL,
dengan demikian nested procedure ini hanya bisa dipanggil melalui blok PL/SQL tempat procedure
itu dibuat.
VIII- 2
MODUL VIII
STORED PROGRAM
OUTPUT :
Contoh diatas juga sekaligus menunjukkan pengeksekusian procedure melalui blok PL/SQL.
Untuk contoh-contoh penggunaan procedure berikutnya, buat dahulu tabel-tabel di bawah ini.
Keempat tabel saling berhubungan, sesuaikan sendiri primary key dan foreign keynya.
TABEL BUKU
JUDUL_BUKU (not null)
Oracle Complete Reference
Oracle Handbook
One Piece vol.43
TABEL PINJAMAN
ID_MEMBER (not null)
TGL_PINJAM
P002
19-JAN-10
P001
17-JAN-10
P003
17-JAN-10
TABEL MEMBER
NAMA (not null)
Rendra
Aziz
Yudi
TGL_KEMBALI
23-JAN-10
24-JAN-10
24-JAN-10
CABANG
ID_CABANG (not null)
L001
L002
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013
MODUL VIII
STORED PROGRAM
Procedure lihat_cabang bersifat statis, sehingga ketika dieksekusi akan selalu menghasilkan
output yang sama yaitu Cabang dari member bernama Yuri terletak di Sukabirus.
2. PROCEDURE BER-PARAMETER/ARGUMEN
Procedure yang memiliki outputan yang dinamis sesuai dengan nilai yang diassign ke
parameter/argument pada procedure tersebut.
Jenis-jenis parameter/argument dari Procedure ini adalah :
A. Parameter Masukan (Input/IN)
Ditandai dengan penggunaan argument yang disertai atribut IN, dimana parameter/
argument ini dianggap sebagai argument inputan oleh Oracle, sehingga saat procedure
dieksekusi, argument tersebut harus memiliki nilai sebagai inputan bagi procedure.
Contoh :
CREATE OR REPLACE PROCEDURE buku_dipinjam (id in buku.id_buku%type) is
jum number;
BEGIN
SELECT dipinjam into jum from buku where id_buku=id;
DBMS_OUTPUT.PUT_LINE('Buku dengan id = ' ||id||' dipinjam sebanyak '||jum||' buku');
END; /
OUTPUT :
VIII- 4
MODUL VIII
STORED PROGRAM
OUTPUT:
OUTPUT:
NOTE :
Procedure yang memiliki atribut OUT atau IN OUT hanya bisa dieksekusi melalui blok
PL/SQL lain. Sedangkan procedure tanpa parameter dan procedure yang hanya bisa
memiliki atribut IN, akan bisa dieksekusi dengan sintaks EXECUTE maupun melalui
blok PL/SQL lain.
Nama procedure yang dibuat nantinya akan menjadi objek dengan tipe procedure.
Non-nested procedure dapat dieksekusi berulang kali setelah berhasil dibuat.
VIII- 5
MODUL VIII
STORED PROGRAM
III. FUNCTION
DEFINISI
Function adalah suatu blok PL/SQL yang memiliki konsep sama dengan procedure, hanya saja
pada function terdapat pengembalian nilai (return value)[9]
Karena function dapat mengembalikan sebuah nilai, function dapat diakses seperti layaknya
sebuah variable biasa.[9]
SYNTAK UMUM
CREATE OR REPLACE FUNCTION nama_fungsi[(nama_variabel IN|OUT|IN OUT type_data)] RETURN
type_data [IS|AS]
[declaration block]
BEGIN
[PL/SQL block WITH RETURN statement]
[EXCEPTION
EXCEPTION block]
END;
/
MENGEKSEKUSI FUNCTION
Setelah function dibuat, maka function tersebut dapat dieksekusi.
Function dapat dipanggil secara langsung tetapi harus melalui :
Melalui sintaks SELECT
SELECT nama_function[(Parameter)] FROM nama_table;
NOTE :
function tidak dapat dieksekusi dengan perintah EXECUTE, karena perintah
EXECUTE hanya berlaku untuk pengeksekusian procedure.
NESTED FUNCTION
Memiliki pengertian yang kurang lebih sama dengan NESTED PROCEDURE, fungsi ini adalah fungsi
yang dideklarasikan dalam setiap blok PL/SQL, tidak tersimpan dalam basis data dan hanya bisa
dipanggil oleh blok dimana fungsi dideklarasikan.
VIII- 6
MODUL VIII
STORED PROGRAM
CREATE OR REPLACE FUNCTION nama_member
RETURN member.nama%type IS
v_nama member.nama%type;
BEGIN
Select nama into v_nama from member where id_member=P001;
RETURN v_nama;
END;
/
OUTPUT :
FUNCTION BER-PARAMETER
A. Parameter Masukan
Parameter IN digunakan hanya sebuah input. Sebuah parameter IN tidak dapat diubah
oleh program yang dipanggil.
ContohFunction :
Output :
B. Parameter Keluaran
Sebuah parameter OUT awalnya NULL. Program ini memberikan nilai parameter dan nilai
yang dikembalikan ke program panggilan.
Contoh :
CREATE OR REPLACE FUNCTION keterangan_buku(idb IN buku.id_buku%type, hrg OUT
buku.harga_sewa%type)
RETURN buku.judul_buku%type IS
v_jdl buku.judul_buku%type;
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013
VIII- 7
MODUL VIII
STORED PROGRAM
BEGIN
Select judul_buku,harga_sewa into v_jdl, hrg from buku where id_buku=idb;
RETURN v_jdl;
END;/
Output :
C. Parameter Masukan/Keluaran
Sebuah parameter IN OUT bisa memiliki nilai awal dan bisa juga tidak. Nilai awal
memungkinkan parameter dapat dimodifikasi oleh program yang dipanggil. Setiap
perubahan yang dibuat dengan parameter dikembalikan ke program pemanggil.
Contoh :
CREATE OR REPLACE FUNCTION update_harga_sewa(idb IN buku.id_buku%type, x IN OUT
buku.harga_sewa%type) RETURN buku.judul_buku%type IS
v_jdl buku.judul_buku%type;
v_hrg buku.harga_sewa%type;
BEGIN
Select judul_buku, harga_sewa into v_jdl, v_hrg from buku where id_buku=idb;
x := x*v_hrg;
Update buku SET harga_sewa= x WHERE id_buku=C001;
RETURN v_jdl;
END;/
Output :
VIII- 8
MODUL VIII
STORED PROGRAM
V. LATIHAN
1. Jelaskan pengertian Procedure dan Function!
2. Procedure apakah yang dibuat pada bagian DECLARATION SECTION pada suatu block PL/SQL,
sehingga hanya bisa dipanggil melalui block PL/SQL tempat procedure itu dibuat?
3. Buatlah sebuah function yang berguna untuk menghitung penambahan gaji sebesar 10% setiap
12 bulan kerja berdasarkan nama dari pegawai. Lakukan pembulatan pada perhitungan bulan
kerja!
4. Buatlah procedure untuk membentuk pola berikut. Output akan menghasilkan pola diamond
untuk inputan ganjil minimal 3.
VIII- 9
MODUL IX
PACKAGE
MODUL IX
PACKAGE
Tujuan Praktikum:
3.
4.
I. PACKAGE
Definisi
suatu objek skema di dalam oracle yang mengelola kumpulan objek skema didalam database
koleksi/kumpulan objek PL/SQL yang digroupkan dibawah satu nama package[5]
Jenis package [10]:
Built-in Package yaitu package bawaan dari oracle yang tersimpan di dalam database.
Pre-built Package yaitu package yang dikembangkan dan dibuat oleh third-party user dan
disebarkan baik free ataupun yang berbayar.
Built-Your-Own Package yaitu package yang kita tulis buat dan kembangkan sendiri.
Isi Package
- Function
- Variable
- Exception
- Procedure
- Konstanta
- Cursor
IX- 1
MODUL IX
PACKAGE
Saat pertama kali elemen suatu package dipanggil oleh aplikasi maka proses server akan
menempatkan seluruh isi package dalam shared pool memory lalu mengeksekusi elemen
yeng dipanggil tersebut.
Pada saat pertama kali pemanggilan secara logika memang cukup berat kerja yang dilakukan
untuk memindahkan semua elemen package ke dalam shared pool memory tetapi pada
pemanggilan elemen elemen berikutnya, pengeksekusiannya akan lebih cepat karena
server sudah tidak perlu lagi memanggil elemen package dari harddisk ke memory.
Menghindari hardcoding literal[5]
Yaitu menggunakan nilai langsung (contoh : IF kapasitas_ruang = 100 then ..)di dalam kode
program. Dengan menggunakan package kita dapat menghindari menggunakan nilai
langsung yang nantinya akan menyusahkan jika ada perbaikan program.Untuk menghindari
penggunaan hardcoding literal kita dapat membuat package yang hanya berisi constant
untuk kondisi-kondisi tertentu.
Mendukung overloading procedure dan fungsi(banyak fungsi memiliki nama yang sama
tetapi memiliki parameter yang berbeda -beda[5]
Struktur Package :
Package specification
Package body
Package specification
Semua deklarasi di package specification bersifat global, bisa diakses oleh blok pl/sql ataupun
package lain.
Dalam package specification tidak terdapat kode kode subprogram(procedure dan fungsi)
yang ada hanya headernya saja
Syntak :
Contoh :
Pada Contoh Diatas cursor c_buku hanya dideklarasikan bahwa cursor tersebut
mengembalikan hasil berupa nuku%ROWTYPE tetapi tidak dijelaskan bagaimana cara(query)
yang di jalankan untuk mendapatkan hasil tersebut.
Cursor c_member diatas berbeda dengan c_buku karena langsung dijelaskan pada bagian
deklarasi query yang dijalankan oleh cursor tersebut.
IX- 2
MODUL IX
PACKAGE
Package body
Semua elemen yang hanya dideklarasikan di package body tetapi tidak terdapat di package
specification bersifat private, yaitu hanya dapat diakses oleh subprogram yang berada di
dalam package tersebut.
Jika sebuah package hanya berisi variable global tanpa ada procedure dan fungsi maka tidak
di perlukan package body[5]
Aturan aturan penulisan package body :
Nama dari package di package body harus sama dengan nama package di package
specification
Nama cursor di package body harus sama dengan nama cursor yang dideklarasikan di
package specification[7]
Nama procedure dan fungsi di package body beserta parameternya harus sama
dengan yang dideklarasikan di package specification[7]
Variable, exception, type, atau constant yang di deklarasikan di package specification
tidak boleh dideklarasikan ulang di package body [7]
semua elemen yang dideklarasikan di package specification dapat dipakai di package
body[7]
Syntak :
Contoh :
Contoh berikut merupakan package body dari contoh package specification diatas
Package Initialization
kondisi awal atau perintah awal yang dijalankan ketika sebuah elemen dari package dipanggil
pertama kali
Kita dapat menambahkan package initialization pada sebuah package sehingga saat pertama
kali ada element dari package yang dipanggil maka secara otomatis package akan
menjalankan perintah tertentu
Letak package initialization adalah pada package body dibagian executable statement
Contoh :
IX- 3
MODUL IX
PACKAGE
Pada contoh diatas ketika kita memanggil elemen package untuk pertama kalinya, maka
sebelum elemen tersebut dieksekusi package akan mengeksekusi package initialization
Ketika pemanggilan elemen yang berikutnya package initialization tidak dieksekusi lagi.
Hasil Eksekusi :
IX- 4
MODUL IX
PACKAGE
Hasil :
Pada contoh diatas package cover berisi 2 procedure yang sebenarnya hanya mengambil elemen
elemen dari package forreal1 dan forreal2.
Overloading Package
CREATE OR REPLACE PACKAGE overload1
IS
FUNCTION cari(id_b IN buku.id_buku%TYPE)RETURN buku.judul_buku%TYPE;
FUNCTION cari(id_c IN cabang.id_cabang%TYPE) RETURN cabang.lokasi%TYPE;
END overload1;
/
CREATE OR REPLACE PACKAGE overload1
IS
FUNCTION cari(id_b IN buku.id_buku%TYPE)RETURN buku.judul_buku%TYPE IS
jud buku.judul_buku%TYPE;
BEGIN
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013
IX- 5
MODUL IX
PACKAGE
SELECT judul_buku into jud FROM buku WHERE id_buku = id_b;
RETURN jud;
END;
FUNCTION cari(id_c IN cabang.id_cabang%TYPE) RETURN cabang.lokasi%TYPE
IS
lok cabang.lokasi%TYPE;
BEGIN
SELECT lokasi into lok FROM cabang WHERE id_cabang like id_c;
RETURN lok;
END;
END overload1;
/
Pada contoh diatas package overload1 memiliki 2 function dengan nama yang sama yaitu cari, saat
function dieksekusi maka perintah yang dijalankan tergantung dari parameter yang dimasukkan.
Melihat Source Code Package
Untuk melihat source code yang telah kita tulis baik itu function, procedure maupun package kita
dapat menjalankan query dari data view berikut [8]:
USER_SOURCE : semua function,procedure,package yang dimiliki oleh user
ALL_SOURCE : semua function ,procedure ,package yang dimiliki oleh user ditambah function
procedure dan package yang dimiliki user melalui perintah granted.
DBA_SOURCE : semua function,procedure,package yang ada didalam database
Syntaknya adalah sebagai berikut :
SELECT TEXT FROM [USER_SOURCE|ALL_SOURCE|DBA_SOURCE]
WHERE NAME = nama_package AND TYPE = [PACKAGE|PROCEDURE|FUNCTION]
ORDER BY LINE;
Kompilasi Package
Oracle melakukan kompilasi ketika suatu procedural object
dibuat(function,procedure,package)[8]
Saat object yang dirujuk oleh procedural object berubah maka procedural object tersebut
tidak valid lagi dan memerlukan kompilasi ulang.[8]
Syntak untuk melihat kevalidan suatu package :
SELECT OBJECT NAME,OBJECT_TYPE,STATUS FROM DBA_OBJECT
WHERE OBJECT_NAME =nama_package AND OBJECT_TYPE LIKE PACKAGE%;
IX- 6
MODUL IX
PACKAGE
NOTE:
II. LATIHAN
1. Bagaimana sintaks untuk menghapus package body?
2. Atribut nama_cursor%FOUND akan mengembalikan nilai TRUE, jika?
3. Buatlah sebuah package yang terdiri dari dua procedure dan cara untuk mengeksekusinya untuk
menampilkan pola bentuk segitiga seperti yang terlihat pada gambar berikut.
Misal parameter bernilai 12 maka keluarannya:
IX- 7
MODUL X
TRIGGER
MODUL 10
TRIGGER
Tujuan :
5.
6.
7.
I. Definisi
Trigger adalah prosedur yang ditulis dalam blok PL/SQL yang dijalankan secara otomatis ketika
sebuah tabel atau view dimodifikasi atau pada saat terjadi aksi-aksi tertentu oleh user atau sistem
database. Dalam kata lain, kita dapat menggunakan trigger ketika salah satu dari operasi-operasi
dibawah ini terjadi:
1. DML statement, seperti INSERT, UPDATE, dan DELETE, pada tabel atau view tertentu.
2. DDL statement, biasanya CREATE atau ALTER, yang dilakukan oleh user.
3. Database event, seperti logon/logoff, error, startup/shutdown.
X-1
MODUL X
TRIGGER
Catatan:
- []
- {}
-|
= atau
Jika dilakukan suatu UPDATE pada tabel ruangan, seperti contoh di bawah ini:
UPDATE ruangan
SET kapasitas_ruang = 30
Triggering statement
WHERE kode_ruang=ru0001
maka akan keluar tampilan:
Kapasitas Baru: 30
Keterangan
Menunjukkan kapan trigger akan
dieksekusi relatif terhadap suatu
event.
Jenis manipulasi data pada tabel/view
yang menyebabkan trigger terpacu.
Trigger restriction
(optional)
Trigger type
Trigger body
Nama trigger sebaiknya dengan jelas mencerminkan table yang diaplikasikan (menyatakan
perintah DML trigger, status before/after, dan apakah row level atau statement level). Misalnya
pada contoh trigger sebelumnya adalah BEFORE UPDATE dengan row level pada kolom
kapasitas_ruang pada table RUANGAN dapat diberi nama bfr_upd_row_ruangan.
Triggering statement adalah statement/perintah yang menyebabkan trigger tereksekusi.
X-2
MODUL X
TRIGGER
Trigger dieksekusi beberapa kali sesuai jumlah baris dalam triggering statement.
Trigger dieksekusi satu kali berapapun jumlah baris dalam triggering statement.
Row-level trigger dieksekusi untuk setiap row yang dimanipulasi pada suatu transaksi.
Dengan kata lain, row-level trigger mengerjakan trigger action satu kali untuk setiap row
yang dimanipulasi. Penerapan trigger ini ditunjukkan oleh adanya klausa FOR EACH
ROW. Row-level trigger berguna jika kode dalam trigger body bergantung pada setiap
baris yang terpengaruh oleh triggering statement.
Statement-level trigger dieksekusi satu kali pada saat transaksi, tanpa memperhatikan
jumlah row yang terlibat. Misalnya, jika terdapat transaksi yang memasukkan 1000 baris
ke dalam tabel, maka statement-level trigger hanya dieksekusi sekali saja. Statementlevel trigger berguna jika kode dalam trigger body tidak bergantung pada baris yang
terpengaruh triggering statement. Default trigger adalah statement-level trigger.
B. Before and After Trigger
Dalam pembuatan trigger dapat ditentukan trigger timing yaitu apakah trigger body akan
dieksekusi sebelum atau sesudah triggering statement dieksekusi.
Before trigger menjalankan trigger body sebelum event/ triggering statement. Trigger ini
cocok digunakan untuk mendeteksi bagaimana event boleh dilanjutkan maupun tidak.
After trigger menjalankan trigger action setelah event terjadi.
Kita mungkin akan berhubungan dengan data lama (old) dan data baru (new) yang terjadi
dalam transaksi. Dalam trigger, dikenal istilah alias atau referensi, yaitu sejenis variabel
yang menyimpan nilai dari suatu kolom dalam tabel. Alias terbagi menjadi dua, yaitu:
:old
:new
Untuk statement INSERT, alias yang digunakan hanya :new saja, yaitu untuk menyimpan
nilai yang akan dimasukkan ke dalam tabel.
Untuk statement UPDATE, alias yang digunakan adalah :new dan :old.
Untuk statement DELETE, hanya alias :old saja, untuk menyimpan data yang dihapus.
Alias dituliskan di depan nama kolom yang bersangkutan. Penulisannya adalah seperti
:new.nama_kolom dan :old.nama_kolom.
Before dan After trigger tidak dapat diimplementasikan pada view.
C. Instead Of Trigger
Instead of trigger hanya akan dieksekusi bagi view dan diaktivasi jika terjadi perubahan
pada base table (tabel asli). Proses yang dilakukan oleh triggering statement digantikan
oleh aksi pada trigger body. Instead of trigger juga ada banyak macam event, antara lain:
instead of insert, instead of update dan instead of delete. Instead of trigger berguna jika
ada user yang ingin memanipulasi data secara langsung terhadap view yang telah dibuat.
D. System Event & User Event Trigger
Penggunaan trigger dapat dikelompokkan menurut event yang terjadi:
System events
Database startup & shutdown
Server error message events
User events
User logon and logoff
DDL statements (CREATE, ALTER, and DROP)
DML statements (INSERT, DELETE, UPDATE)
X-3
MODUL X
TRIGGER
Contoh trigger user events (logon) :
CREATE OR REPLACE TRIGGER trigger_logon
ON logon
OF user.schema
BEGIN
END;
/
V. Batasan
Batasan dalam penggunaaan trigger adalah sebagai berikut:
Tidak dapat menggunakan perintah, fungsi, dan prosedur dengan ROLLBACK dan COMMIT.
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.
NIM
FK1
Nama
Jns_Kelamin
Tgl_Lahir
Alamat
Jurusan
Angkatan
Email
Kode_team
Team
cabang_Pertandingan
PK
Kode_team
FK1
Nama
Jml_Anggota
Kode_Cabang
PK
Kode_Cabang
Nama_Cabang
Durasi_Pertandingan
Jml_Team
nama_cabang
Basket_3on3
Volly
Futsal
durasi_pertandingan
30
45
45
jml_team
0
0
0
X-4
MODUL X
TRIGGER
Seperti yang telah diketahui bahwa salah satu fungsi trigger adalah dapat menggenerate proses
update di dalam suatu tabel karena event yang dilakukan di tabel yang lain. Contoh trigger di atas
digunakan untuk mengupdate jumlah team dalam suatu cabang pertandingan. Jika di insert kan
team baru ke dalam tabel team, maka secara otomatis jumlah team pada kolom jml_team di tabel
cabang_pertandingan akan bertambah sesuai dengan kode_cabang yang di insertkan. Untuk
mencobanya, kita dapat melakukan percobaan sebagai berikut;
Contoh trigger di atas sama seperti contoh trigger sebelumnya, hanya trigger timing nya saat
suatu row di hapus. Jika suatu team dihapus dari dalam tabel team, maka secara otomatis jumlah
team pada kolom jml_team di tabel cabang_pertandingan akan berkurang sesuai dengan
kode_cabang yang di hapus. Untuk mencobanya, kita dapat melakukan percobaan sebagai
berikut;
X-5
MODUL X
TRIGGER
Trigger juga dapat digunakan sebagai sebuah validator, yaitu mengecek apakah data yang
diinputkan itu sudah valid atau belum. Contoh trigger di atas menangani kasus dimana jika akan di
insertkan peserta baru ke tabel peserta, dan peserta tersebut berjenis kelamin perempuan,
sedangkan team yang dia ikuti adalah team futsal, maka akan ditolak (ditampilkan pesan error).
Untuk mencobanya, kita dapat melakukan percobaan sebagai berikut
Contoh trigger di atas menangani kasus dimana jika akan di insertkan peserta baru ke tabel
peserta, dan team yang diikuti adalah basket_3on3 dengan jumlah peserta didalam team tersebut
telah mencapai 6 orang, maka akan ditolak (ditampilkan pesan error). Untuk mencobanya, kita
dapat melakukan percobaan sebagai berikut;
X-6
MODUL X
TRIGGER
::Prekondisi::
::Triggering Statement::
X-7
MODUL X
TRIGGER
Salah satu fungsi trigger adalah untuk menjamin validasi dari sebuah transaksi. Contoh trigger di
atas digunakan untuk memvalidasi apakah perintah insert pada tabel fight, yang menandakan
permulaan permainan, memenuhi syarat atau tidak. Dalam hal ini nilai current_health di awal
pertandingan haruslah sama dengan nilai max_health. Jika berbeda, maka perintah insert harus
dibatalkan. Untuk mencobanya, kita dapat melakukan percobaan sebagai berikut.
X-8
MODUL X
TRIGGER
Trigger ini akan mengeset winner pada tabel battle jika terjadi update pada kolom current_health
menjadi 0 pada tabel fight. Trigger ini otomatis menentukan pemenang dari sebuah pertandingan.
Jika terdapat aturan bisnis yang menyebutkan bahwa pemenang tiap pertandingan mendapatkan
tambahan experience_point sebanyak 100 point. Maka trigger pada contoh 3 dapat digunakan.
X-9
MODUL X
TRIGGER
Untuk menonaktifkan semua trigger yang diasosiasikan pada sebuah tabel dapat
menggunakan sintaks:
ALTER TABLE nama_tabel DISABLE ALL TRIGGER;
Untuk mengaktifkan semua trigger menggunakan sintaks:
ALTER TABLE nama_tabel ENABLE ALL TRIGGER;
XI. LATIHAN
1. Apa yang dimaksud dengan trigger dan cascading trigger?
2. Buatlah contoh program sederhana dengan menggunakan trigger!
3. Operasi operasi apa sajakah yang dapat menggunakan trigger?
X - 10