0% menganggap dokumen ini bermanfaat (0 suara)
165 tayangan94 halaman

Modul Praktikum BDR

Basis data relasional merupakan tempat penyimpanan data dalam bentuk tabel-tabel yang saling berelasi sesuai aturan tertentu. Diagram entitas digunakan untuk memodelkan basis data relasional ini dengan menggambarkan entitas dan relasi antar entitas tanpa membentuk siklus.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
165 tayangan94 halaman

Modul Praktikum BDR

Basis data relasional merupakan tempat penyimpanan data dalam bentuk tabel-tabel yang saling berelasi sesuai aturan tertentu. Diagram entitas digunakan untuk memodelkan basis data relasional ini dengan menggambarkan entitas dan relasi antar entitas tanpa membentuk siklus.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 94

DAFTAR ISI

Daftar Isi
Lembar Pengesahan ............................................................................................................
Daftar Isi
........................................................................................................................

ii

Modul I : Basis Data Relasional.......................................................................................


1.1 Basis Data Relasional ......................................................................................
1.2 Pemetaan Diagram Entitas ke dalam Tabel....................................................
1.3 Latihan ............................................................................................................

I-1
I-3
I-8
I-10

Modul II : DDL (DATA DEFINITION LANGUAGE) .............................................................. II-1


2.1 Pengenalan Oracle 10g ................................................................................... II-1
2.2 Menjalankan Oracle 10g (versi 10.2) .............................................................. II-1
2.3 Tipe Data Pada Oracle 10g ............................................................................. II-3
2.4 Data Definition Language (DDL) ..................................................................... II-4
2.5 Constraint ....................................................................................................... II-9
2.6 Latihan ................................................................................................. II-11
Modul III
3.1
3.2
3.3
3.4
3.5
3.6

: DML (Data manipulation Language) dan Query Dasar 1 ..............................


Data Manipulation Language (DML) ..............................................................
SQL, SQL*Plus dan PL/SQL ..............................................................................
Query Dasar ....................................................................................................
Variable dalam Oracle ....................................................................................
Operator-operator dalam Oracle ...................................................................
Latihan ......................................................................................................

Modul IV
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8

: Query Dasar III .............................................................................................. IV-1


Fungsi-fungsi................................................................................................... IV-1
Ekspresi Kondisional ....................................................................................... IV-5
Menggunakan Fungsi Agregasi (Aggregate Function) .................................... IV-6
Multiple Selection Conditions ........................................................................ IV-6
Klausa Order By .............................................................................................. IV-7
Klausa Group By ............................................................................................. IV-7
Multi-Table Access.......................................................................................... IV-8
Latihan ............................................................................................................ IV-13

Modul V
5.1
5.2
5.3
5.4
5.5
5.6
5.7

: Query Lanjut .................................................................................................


Subquery ........................................................................................................
Corelated Subquery ........................................................................................
Klausa With.....................................................................................................
DDL Query & DML Query................................................................................
Cube, Rollup, dan Grouping Sets ....................................................................
Null Values ......................................................................................................
Latihan ............................................................................................................

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL

III-1
III-1
III-3
III-3
III-5
III-6
III-9

DAFTAR ISI

6.9
6.10
6.11
6.12

Pengulangan (Looping) ................................................................................... VI-8


LABEL dan GO TO............................................................................................ VI-9
Penanganan Error (Exception)........................................................................ VI-10
Latihan ............................................................................................................ VI-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

: Stored Program ............................................................................................


Procedure .......................................................................................................
Jenis-jenis Procedure pada Oracle .................................................................
Function ..........................................................................................................
Jenis-jenis Function ........................................................................................
Latihan ............................................................................................................

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 PRAKTIKUM BASIS DATA RELASIONAL

MODUL I
BASIS DATA RELASIONAL

MODUL 1
BASIS DATA RELASIONAL

Tujuan Praktikum :
1.

Mengetahui, memahami serta mampu merancang dan membuat Basis Data Relasional

I. Basis Data Relasional


Basis data relasional merupakan tempat penyimpanan data (dalam hal ini tabel data) beserta
relasi-relasi antar tabel tersebut yang disusun menurut aturan tertentu[2]. Entity relationship diagram
merupakan diagram yang digunakan untuk memodelkan basis data relasional[2]. Dalam pembuatan
ER Diagram yang harus diperhatikan yaitu tidak boleh terbentuk diagram siklik.
Diagram Entitas atau Entity Relationship Diagram
Untuk mendesain sebuah basisdata relational digunakan diagram entitas. Diagram entitas adalah
diagram yang terdiri atas:
Entitas : merupakan suatu objek yang di dunia nyata dan dapat dibedakan dari objek
lainnya[3]. Entitas dapat dibedakan menjadi dua macam yaitu:
Entitas kuat, merupakan entitas yang memiliki primary key. Digambarkan
dengan rectangle yang bertuliskan nama entitas(lihat gambar 1.1.1).
Entitas lemah, merupakan entitas yang keberadaannya tergantung pada
keberadaan entitas kuat, biasanya tidak memiliki primary key. Digambarkan
dengan rectangle bertumpuk yang bertuliskan nama entitas seperti gambar 1.1.1
.
Atribut : merupakan deskripsi sifat/keterangan dari sebuah entitas[3]. Atribut dilambangkan
dengan ellips (lihat gambar 1.1.1).
- Super key merupakan semua atribut yang mengidentifikasikasikan secara unik
suatu entitas dalam satu entity set.
- Candidate key merupakan satu atau beberapa atribut yang mengidentifikasikan
secara unik suatu entitas dalam suatu entity set. Candidate key biasanya
minimal subset dari superkey.
- Primary key merupakan atribut yang pasti menjamin keunikan suatu entitas
dalam suatu entity set. Primary key dipilih dari beberapa candidate key. Atribut
yang merupakan primary key, diberi garis bawah (pada gambar 1.1.1 adalah
ID_CUSTOMER).
- Foreign key (biasa disingkat FK) adalah primary key sebuah tabel yang berada
pada tabel lain yang berhubungan dengan tabel pemilik primary key tersebut.
Contoh foreign key dapat dilihat pada pembahasan lebih lanjut di modul ini.
Relasi
: merupakan asosiasi antar satu entitas dengan entitas lainnya[3]. Dilambangkan
dengan diamond seperti pada gambar 1.1.1 .
Kardinalitas : menunjukan berapa jumlah entitas yang dapat berasosiasi dengan entitas
lainnya melalui sebuah relationship set[3].
Kardinalitas memiliki tiga kemungkinan yaitu:
MODUL PRAKTIKUM BASIS DATA RELASIONAL

I- 1

MODUL I
BASIS DATA RELASIONAL

Hubungan banyak ke banyak (m ke n)

m
R
o

n
R

atau

Hubungan satu ke banyak (1 ke n)

1
R
o

atau

Hubungan satu ke satu (1 ke 1)


atau

Berikut adalah contoh sebuah diagram entitas.


Primary Key

Id_customer

Nama Atribut

nama

alamat

Kardinalitas

Masa_berlaku

Jenis_member

No_telp

No_kartu

1
CUSTOMER

memiliki

KARTU_MEMBER
diskon

Nama entitas

Relasi

Gambar1.1.1 : Contoh ER-Diagram

Super Key, Kandidat Key, Primary Key dan Foreign Key


CUSTOMER

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:

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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

Gambar1.1.2 : Contoh Agregasi

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.

II. Pemetaan Diagram Entitas ke dalam Tabel


Berikut adalah konsep pemetaan dari diagram ER ke dalam bentuk tabel.
1. Entitas dengan kardinalitas satu ke satu (1 ke 1)
ATRIBUT
RELASI

PK 1

ATRIBUT
NON PK1

1
ENTITAS 1

PK 2

1
RELASI

ENTITAS 2

ATRIBUT
NON PK 2

Gambar1.2.1 : relasi satu ke satu

Maka terbentuk dua tabel yaitu:


Tabel bentukan dari Entitas 1 yang terdiri atas kolom PK1, Atribut Non PK1 ( dan PK2 serta
Atribut Relasi, jika Entitas 1 dianggap lebih kuat daripada Entitas 2:

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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

Gambar1.2.2 Contoh relasi satu ke satu

Tabel relationalnya menjadi:


KARTU_MEMBER
PK

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

Gambar1.2.3 : relasi satu ke banyak

Maka terbentuk dua tabel yaitu:


Tabel bentukan dari Entitas 1 yang terdiri atas kolom PK1 dan Atribut Non PK1.
Tabel bentukan dari Entitas 1, Entitas 2 dan Relasi yang terdiri atas kolom PK2, Atribut Non
PK2, PK1 dan Atribut Relasi.
ENTITAS 2

ENTITAS 1
PK

PK 1
NON PK 1

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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

Gambar1.2.4 : Contoh relasi satu ke banyak

Tabel relationalnya menjadi:


PK

PEGAWAI

REKAPPENJUALAN

ID_PEGAWAI

PK

ID_REKAP

nama
alamat
no_telp

FK1

tgl_rekap
ID_PEGAWAI

3. Entitas dengan kardinalitas banyak ke banyak (N ke M)


ATRIBUT
RELASI

PK 1

PK 2

ATRIBUT
NON PK1

ENTITAS 1

RELASI

ATRIBUT
NON PK 2

ENTITAS 2

Gambar1.2.5 : relasi banyak ke banyak

Maka table yang terbentuk ada tiga yaitu:


Tabel bentukan dari Entitas 1 yang terdiri atas kolom PK1 dan Atribut Non PK1.
Tabel bentukan dari Entitas 2 yang terdiri atas kolom PK2 dan Atribut Non PK2.
Tabel bentukan dari Relasi yang terdiri atas Atribut Relasi, PK1 dan PK2.
T_RELASI

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

Gambar1.2.6 : Contoh relasi banyak ke banyak

MODUL PRAKTIKUM BASIS DATA RELASIONAL

I- 5

MODUL I
BASIS DATA RELASIONAL

Tabel relationalnya menjadi:


BARANG

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

4. Entitas dengan kasus agregasi


PK_A

PK_B

N
A

R1

R2

PK_C

Gambar1.2.7 : contoh agregasi

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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

Gambar1.2.8 Contoh relasi agregasi

Tabel relationalnya menjadi:


BARANG

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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 !

MODUL PRAKTIKUM BASIS DATA RELASIONAL

I- 8

MODUL II
DDL

MODUL 2
DDL (DATA DEFINITION LANGUAGE)

Tujuan Praktikum :
1.
2.

Mengetahui konsep dasar oracle 10g


Mengetahui dan memahami operasi-operasi DDL (Data Definition Language)

I. Pengenalan Oracle 10g


Oracle Database merupakan produk yang dikembangkan oleh Oracle Corporation, pertama kali
dirilis pada tahun 1979. Oracle dikembangkan oleh Larry-Ellison bersama Bob Miner, dan Ed Oates
yang pada awalnya bekerja di Software Development Laboratories (SDL) pada tahun 1977[1].
SDL kemudian berhasil membuat versi prototype orisinil dari Oracle software, yaitu Oracle versi
1, yang ditulis dalam bahasa C dan mempunyai SQL interface. Nama Oracle berasal dari code-name
suatu proyek milik CIA dimana Larry-Ellison dulunya bekerja.
Oracle Relational Database Management System (Oracle RDBMS) atau sederhananya Oracle,
merupakan sebuah RDBMS yang mempunyai fungsi antara lain sebagai berikut
Data Storage pada area perancangan basis data
Access Data untuk aplikasi tertentu, dengan Teknik Optimisasi
Database Security dan pengaturan User Privilege tertentu
Consistency Data yang berfungsi untuk proteksi data, dan locking-mechanism
Integrity Data yang berfungsi pada implementasi basis data tersebar

II. Menjalankan Oracle 10g (versi 10.2)


Ada 3 cara menjalankan oracle pada PC,yaitu :
1. Command prompt
Untuk membuka command prompt klik start->Run ketik cmd. Setelah muncul, ketik:
SQLPLUS, masukkan username (defautnya adalah system), dan password (jika diminta) yang
dibuat saat membuat database, setelah itu masuk ke database oracle ditandai dengan
SQL>. Perintah SQL bisa dijalankan setelah tulisan SQL> muncul seperti pada gambar.

Gambar1.2.1 menggunakan command prompt

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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.

Gambar1.2.2 Tampilan Log On pada 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.

Gambar1.2.3 menggunakan SQL Plus

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

format URL : http://{ nama_komputer atau IP address}:Port number/isqlplus


contoh : http://localhost:5560/isqlplus/

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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.

III. Tipe Data Pada Oracle 10g

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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.

IV. Data Definition Language (DDL)


DDL merupakan bagian dari perintah SQL untuk membuat, memodifikasi atau menghapus
struktur basis data Oracle. Suatu DDL akan dieksekusi apabila sudah diakhiri dengan ; (titik koma).

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:

Fungsi dari CONSTRAINT akan di bahas pada sub-bab X.


Untuk melihat struktur sebuah table yang sudah dibuat dapat digunakan perintah
DESCRIBE nama_tabel; atau DESC nama_tabel;
2. CREATE VIEW
View merupakan sebuah tabel semu / tabel lojik, dimana datanya berasal dari satu/ lebih tabel
lain sebagai tabel sumber. View biasa dibuat untuk memudahkan user menampilkan data.
Sintaks: CREATE [OR REPLACE] [FORCE] [NOFORCE] VIEW nama_view
[(alias[,alias]...)] AS
Subquery [with <CHECK option>|<READ ONLY>];
Contoh:

CREATE OR REPLACE FORCE VIEW view_data_pembelian


(kode_pembelian, nama_customer, nama_barang, harga)
AS
select M.id_beli, C.nama, B.nama, B.harga
from membeli M, customer C, barang B
where M.id_beli='M001'
and M.id_customer=C.id_customer
and M.id_barang=B.id_barang
with check option;

MODUL PRAKTIKUM BASIS DATA RELASIONAL

Baris, 4-8 adalah


Subquery

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.

FORCE, View akan dibuat walaupun tabel sumber belum ada.

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.

3. CREATE SEQUENCE (MEMBUAT NOMOR UNIK SECARA OTOMATIS)


Sequence digunakan untuk mengenerate angka angka unik secara otomatis. Biasanya sequence
diaplikasikan untuk membentuk primary key secara otomatis.
Sintaks: CREATE SEQUENCE nama_sequence
[increment by integer]
[start with integer]
[maxvalue integer | nomaxvalue]
[minvalue integer | nominvalue]
[cycle | nocycle]
[cache integer | nocache]
[ order | noorder]
;
Contoh: CREATE SEQUENCE seq_pembelian
Increment by 1
Start with 1
Maxvalue 9999
Minvalue 0
Nocycle
Nocache
Order;

Pada sintak pembentukan sequence terdapat beberapa kata kunci seperti berikut:

INCREMENT BY, untuk menyatakan nilai penambahan/penurunan pada sequence.


START WITH, untuk menyatakan nilai awal yang dihasilkan sequence.

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL

II- 5

MODUL II
DDL

Untuk penggunaan sequence, dapat menggunakan :


sintaks : Nama_sequence.nextval
4. CREATE SYNONYM
Synonym digunakan untuk membuat nama alias bagi sebuah tabel, view atau sequence.
Synonym biasanya digunakan untuk menjaga keamanan struktur suatu tabel.
Sintaks: CREATE [PUBLIC] SYNONYM nama_synonim
For nama_tabel/view/sequence;
Contoh: CREATE SYNONYM brg FOR barang;
Tujuan penggunaan synonim adalah:
- Untuk mengganti atau menyingkat nama yang sulit diingat dari sebuah objek.
- User dapat mengakses data pada table yang berisi informasi yang sensitive dan private
melalui synonym tanpa harus mengetahui naina table aslinya sehingga kamu tidak dapat
melakukan perubahan pada struktur table.
5. CREATE USER
Create user digunakan untuk mendefinisikan user baru beserta passwordnya.
Sintaks: CREATE USER nama_user
IDENTIFIED BY password_user;
Contoh: CREATE USER praktikum
IDENTIFIED BY informaticslab;

Ket:

Agar user baru ini dapat log on, maka setelah di create lakukan GRANT CONNECT
sebagai berikut:
Sintaks: GRANT CONNECT, RESOURCE TO nama_user;

Contoh: GRANT CONNECT, RESOURCE TO praktikum;


6. CREATE INDEX
Index digunakan untuk mempercepat pengaksesan data pada suatu tabel. Index dapat diberikan
pada satu atau lebih kolom.
Sintaks: CREATE INDEX nama_index
On nama_table(nama_atribut-1, nama_atribut-2, nama_atribut-n);
Contoh: CREATE INDEX alamat
ON customer(alamat);

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

Sintaks: DROP VIEW nama_view;


Contoh: DROP VIEW view_data_pembelian;
3. DROP SEQUENCE
Perintah ini digunakan untuk menghapus sequence tertentu yang ada di basisdata.
Sintaks: DROP SEQUENCE nama_sequence;
Contoh: DROP SEQUENCE seq_ pembelian;
4. DROP SYNONYM
Perintah ini digunakan untuk menghapus synonym tertentu yang ada di basisdata.
Sintaks: DROP SYNONYM nama_synonym;
Contoh: DROP SYNONYM brg;
5. DROP INDEX
Perintah ini digunakan untuk menghapus index tertentu yang ada di basisdata.
Sintaks: DROP INDEX nama_index;
Contoh: DROP INDEX alamat;
6. DROP USER
Perintah ini digunakan untuk menghapus definisi user tertentu.
Sintaks: DROP USER nama_user;
Contoh: DROP USER praktikum;

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL

II- 7

MODUL II
DDL
ALTER TABLE Membeli

menghapus primary key


Contoh2: DROP CONSTRAINT pk_beli;
ENABLE/DISABLE
Digunakan untuk mengaktifkan/menonaktifkan constraint.
Sintaks:
ALTER TABLE nama_table ENABLE CONSTRAINT nama_constraint;
ALTER TABLE nama_table DISABLE CONSTRAINT nama_constraint [CASCADE];
Contoh1: ALTER TABLE pegawai ENABLE CONSTRAINT pk_pegawai;
Contoh2: ALTER TABLE pegawai DISABLE CONSTRAINT pk_pegawai CASCADE;
Ket : Perintah CASCADE digunakan untuk mendisable dependent integrity constraint.
2. ALTER VIEW
Perintah ini digunakan untuk mengkompilasi ulang sebuah view.
Sintaks: ALTER VIEW nama_view
COMPILE;
Contoh: ALTER VIEW view_data_pembelian
COMPILE;

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

Perintah ini digunakan untuk mengubah password seorang user.


Sintaks: ALTER USER nama-user
IDENTIFIED BY password;
Contoh: ALTER USER system
IDENTIFIED BY informaticslab;

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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:

COMMENT ON TABLE rekappenjualan IS merupakan informasi tentang data rekap


penjualan barang

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:

id_pegawai char(4) CONSTRAINT pk_pegawai PRIMARY KEY


nama varchar2(30),
alamat varchar2(30),
no_telp varchar2(13)
);
CREATE TABLE PEGAWAI(
id_pegawai char(4),
Penempatan
nama varchar2(30),
alamat varchar2(30),
no_telp varchar2(13),
CONSTRAINT pk_pegawai PRIMARY KEY(id_pegawai)
);

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL

II- 9

MODUL II
DDL

Contoh:

CREATE TABLE REKAPPENJUALAN(


id_rekap char(4),
tgl_rekap date,
id_pegawai char(4),
CONSTRAINT pk_rekap PRIMARY KEY(id_rekap),
CONSTRAINT fk_rekap FOREIGN KEY(id_pegawai) REFERENCES pegawai
ON DELETE CASCADE
);

Ket:

On Delete Cascade untuk membentuk keterkaitan antara tabel yang terhubung


(dalam kasus ini tabel rekappenjualan dan pegawai. Jika suatu baris pada tabel
pegawai dihapus, maka kolom rekappenjualan yang terhubung juga dihapus.
Null / Not Null
Jika sebuah kolom pada database tidak boleh kosong, maka constraint NOT NULL diberikan
pada kolom tersebut. Pada saat tabel diisi dengan data (misalnya melalui instruksi INSERT),
maka kolom tersebut harus diisi. Jika kolom tidak diisi, sistem akan menolaknya.
Constraint NULL berarti bahwa kolom dapat diisi dan dapat dikosongkan.
Contoh: CREATE TABLE barang2
(
id_barang char(4) CONSTRAINT pk_barang PRIMARY KEY,
harga char(1) NOT NULL
);

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)
);

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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)!

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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.

Mengetahui dan memahami operasi-operasi Data Manipulation Language (DML)


Memahami konsep dasar transaksi
Mengetahui dan memahami perintah-perintah pada transaksi
Mengetahui dan memahami definisi dan fungsi query
Mengetahui dan memahami klausa query dalam SQL * Plus dan penggunaannya
Mengetahui dan memahami jenis variable pada SQL * Plus dan penggunaannya
Mengetahui dan memahami beberapa jenis operator-operator sebagai filter dan penggunaannya

Studi Kasus Transaksi Penjualan pada Mini Market


MEMBELI

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

I. Data Manipulation Language (DML)


Data Manipulation Language merupakan bahasa yang memungkinkan pengguna untuk
mengakses dan mengubah data yang sesuai dengan model datanya selain itu DML juga merupakan
konsep yang menerangkan bagaimana menambah, mengubah dan menghapus baris tabel. [3]
Perintah-perintah DML [3]
INSERT
Berfungsi untuk menambahkan baris baru ke tabel
Sintaks:
INSERT INTO <nama_tabel> [(nama_kolom1, nama_kolom2, .)]
Values (nilai1, nilai2, );
INSERT INTO <nama_tabel> [(nama_kolom1, nama_kolom2,)] <query>;
INSERT INTO barang values ('B001','Sabun',2000,50);
Contoh 1:
INSERT INTO barang (id_barang,nama,harga,jml_stock) values ('B001','Sabun',2000,50);
Contoh 2:
INSERT INTO membeli
Contoh 3:
Select id_barang
From barang
Where id_barang=B005';

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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:

MERGE INTO copy_rekappenjualan cr


USING rekappenjualan r
ON cr.id_rekap=r.id_rekap
WHEN MATCHED THEN
UPDATE SET r.tgl_rekap=cr.tgl_rekap
WHEN NOT MATCHED THEN
INSERT VALUES (cr.tgl_rekap);

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL

III- 2

MODUL III
DML DAN QUERY DASAR I

II. SQL, SQL*Plus dan PL/SQL


Structured Query Language (SQL) adalah bahasa query non-prosedural level tinggi yang paling
sering digunakan. SQL merupakan bahasa yang digunakan untuk mengakses Basis Data Relasional
termasuk Oracle.
SQL *Plus merupakan produk Oracle yang menggunakan SQL dan PL/SQL yang ditambahkan
dengan sintaks bahasa tambahan untuk mengontrol kelakuan produk, dan format output dari SQL
Queries (secara sederhana dapat disebut sebagai editor untuk mengontrol kelakuan produk dan
format output dari SQL Queries).
PL/SQL merupakan bahasa procedural pada Oracle untuk menulis aplikasi lojik dan untuk
memanipulasi data diluar basis data.
Bentuk dasar dari SQL :
Select A1, A2,. From R1, R2,
Where P
Ket :
A : atribut
R : relasi
P : predikat
*keluaran dari query SQL adalah sebuah relasi

III. Query Dasar


Query merupakan statement dalam SQL yang berfungsi untuk mendapatkan atau mengambil
data dari database (satu atau beberapa tabel/view) berdasarkan kriteria-kriteria tertentu yang
diberikan[3]. Sebuah query selalu diawali dengan SELECT statement. Secara umum sintaks query
sederhana dapat dituliskan seperti di bawah ini [3].
Sintaks query sederhana :
SELECT [ALL|DISTINCT] (nama_kolom1, nama_kolom2, .)
FROM (nama_tabel_sumber1, nama_tabel_sumber2, . )
{WHERE (kondisi )}

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL

III- 3

MODUL III
DML DAN QUERY DASAR I

Menampilkan beberapa kolom yang spesifik (penggunaan klausa WHERE)


Contoh :
Menampilkan kolom id_barang dan nama dari tabel barang yang jumlah stocknya 100
(pengkondisian).
SELECT id_barang, nama
FROM barang
WHERE jml_stock=100;

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';

b. Nilai pada tipe data string harus case sensitive


c. Nilai tipe data harus format sensitive. Default dari format date adalah DD-MM-YYYY
Menampilkan nama barang yang ada di tabel barang (penggunaan klausa DISTINCT)
SELECT DISTINCT nama
FROM barang ;

Coba bandingkan hasilnya dengan


SELECT nama
FROM barang ;

Menampilkan jumlah member berdasarkan jenis member dari tabel kartu_member


(penggunaan klausa GROUP BY)
SELECT jenis_member, COUNT (no_kartu)
FROM kartu_member
GROUP BY jenis_member ;

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 ;

IV. Variable dalam Oracle

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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.

Untuk mennghilangkan penulisan old dan new dapat dilakukan dengan


menonaktifkan sistem variabel verify. Perintahnya adalah
SQL > set verify off;
Untuk melihat variabel apa saja yang sudah tersimpan dapat menggunakan perintah
DEFINE. Perintahnya adalah
SQL > define;
Perintah DEFINE juga bisa digunakan untuk mendefinisikan variabel baru.
Perintahnya adalah: SQL > define vbaru = new variable;
Perintah UNDEFINE untuk menghapus variabel.perintahnya:
SQL > undefine vbaru;

V. Operator-operator dalam Oracle


Operator Logika
Operator logika AND dan OR digunakan untuk membuat sebuah kondisi yang lebih kompleks
yang melibatkan beberapa konsidi yang lebih sederhana. Sedangkan operator NOT dipakai untuk
menyatakan negasi dari suatu kondisi. Bentuk umum penggunaan operator AND dan OR adalah
WHERE kondisi1 [AND|OR] kondisi2 [AND|OR] kondisi3
MODUL PRAKTIKUM BASIS DATA RELASIONAL

III- 6

MODUL III
DML DAN QUERY DASAR I

Contoh : menampilkan data pegawai yang namanya berawalan A atau N


SELECT nama, no_telp FROM pegawai
WHERE nama LIKE A% OR nama LIKE N%
WHERE NOT (nama IS NULL);

Operator Pembanding
1. Operator dengan Lambang Aritmatik
Operator
=
>
<

Definisi

Sama dengan
Lebih besar dari

Lebih kecil 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);

3. BETWEEN dan NOT BETWEEN


Operator ini digunakan untuk membandingkan suatu nilai terhadap suatu rentang nilai
(BETWEEN) atau di luar rentang (NOT BETWEEN). Operator ini memerlukan dua parameter
sebagai nilai batas awal dan nilai batas akhir. Bentuk umumnya :
WHERE nama_kolom BETWEEN nilai_awal AND nilai_akhir
WHERE nama_kolom NOT BETWEEN nilai_awal AND nilai_akhir
Contoh : menampilkan semua nama barang yang memiliki jumlah stock antara 50 - 150.
SELECT nama FROM barang WHERE jml_stock BETWEEN (50,150);

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL

III- 7

MODUL III
DML DAN QUERY DASAR I

4. LIKE dan NOT LIKE


Operator LIKE dan NOT LIKE digunakan untuk mencari suatu nilai bertipe string dengan
membandingkan susunan karakternya. Bentuk umumnya :
WHERE nama_kolom LIKE nilai_pembanding [ESCAPE char]
WHERE nama_kolom NOT LIKE nilai_pembanding [ESCAPE char]
Terdapat dua WILDCARD yang dapat digunakan untuk mengabaikan karakter-karakter yang
tidak perlu dibandingkan , keduanya adalah : [3]
Tanda _ mewakili satu buah karakter sembarang
Tanda % mewakili nol atau lebih karakter sembarang
Contoh : menampilkan nama customer yang diawali dengan huruf S
SELECT nama FROM customer
WHERE nama LIKE S%;

Contoh: menampilkan nama customer yang terdiri dari 4 karakter


SELECT nama FROM customer
WHERE nama LIKE ____;

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

*/

MODUL PRAKTIKUM BASIS DATA RELASIONAL

III- 8

MODUL III
DML DAN QUERY DASAR I

VI. Latihan
1)

DML pada Studi Kasus Transaksi Penjualan pada Mini Market

a) Ketik ulang DML diatas pada oracle masing-masing di rumah!


b) Lakukan perintah insert, update dan delete dimana id_barang = B005, nama barang=Kopi,
harga=1000 dan stocknya 125 (stocknya di update menjadi 150).
2) Buatlah sintaks untuk menampilkan semua data pegawai yang namanya berawalan huruf A!

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).

MODUL PRAKTIKUM BASIS DATA RELASIONAL

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

Fungsi Karakter dan String


Fungsi Manipulasi Kasus
LOWER (column/expression)
UPPER (column/expression)
INITCAP (column/expression)

Mengkonversikan column/expression menjadi huruf kecil semua


Mengkonversikan column/expression menjadi huruf kapital semua
Mengkonversikan huruf pertama dari setiap kata menjadi huruf kapital
Fungsi Manipulasi Karakter

CONCAT (column1/expression1,
column2/expression2)

Menggabungkan hanya dua string, ekivalen dengan (||)

LENGTH (column/expression)

Menghasilkan panjang suatu string

SUBSTR (column/expression,m,[n])

Memotong string dimulai dari karakter ke m sebanyak n


karakter. Jika n tidak dituliskan maka pemotongan akan
dilakukan sampai akhir string.

LPAD(column/expression,n,[string2])

Menambah di sebelah kiri (LPAD) atau sebelah kanan (RPAD)


dari ekspresi dengan string2 hingga mencapai n karakter. Bila
string2 tidak dituliskan maka akan ditambah dengan spasi.
Bila n < panjang column/expression maka akan terpotong
sebanyak n karakter

RPAD(column/expression,n,[string2])

LTRIM(column/expression,[string2])
RTRIM(column/expression,[string2])

Menghapus karakter di bagian kiri (LTRIM) atau kanan


(RTRIM) sehingga tidak diawali atau diakhiri dengan
sembarang karakter pada string2. Default string2 adalah
karakter spesial

INSTR(column/expression,string2,[m][,
n])

Mencari string2 di dalam column/expression dengan awal


pencarian adalah karakter ke m dan string2 ke n dalam
column/expression, default m dan n adalah 1

REPLACE(text,search_string,[replaceme
nt_string])

Mengganti semua search_string yang terdapat pada text


dengan replacement_string. Jika replacement_string tidak
ditulis, maka search_string pada text akan dihapus

TRANSLATE(Str1,Str2,[Str3])

Mengganti karakter penyusun Str2 pada Str1 dengan


karakter penyusun Str3

MODUL PRAKTIKUM BASIS DATA 2012

IV - 1

MODUL IV
QUERY DASAR II

SQL> SELECT lower (EduCatiOn) lower,

SQL> SELECT SUBSTR ('InstitutTeknologiTelkom',4) tes,

UPPER (EduCatiOn) upper,


INITCAP (EduCatiOn) initcap
FROM dual;

SUBSTR (' InstitutTeknologiTelkom ',2,7) tas,


SUBSTR (' InstitutTeknologiTelkom ',-6) tos
FROM dual;

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

SQL> SELECT LPAD (Knowledge,15,-) lpad1,

INSTR (how do you do, do,4) ini2,


INSTR (how do you do,do,1,2) ini3,
INSTR (how do you do,do,-1) ini4
FROM dual;

SQL> SELECT LTRIM (nama_barang,'AFM') ltrim

D
12

RPAD (Knowledge, 15,-) rpad,


LPAD (Knowledge, 5) lpad2
FROM dual;

SQL> SELECT TRANSLATE (Do Your Best Everytime And


Everywhere ,Aiueo,41t30)
FROM dual;

OR jenis =

translate

SQL> SELECT REPLACE (I am here,am,am not);


Kalimat awal : I am here
Kalimat setelah di replace : I am not her

Fungsi Tanggal dan Waktu


MASUKKAN TUTORIAL CARA MENGUBAH LOKALISASI BAHASA DI ORACLE. KARENA KESALAHAN
FORMAT TANGGAL KEMUNGKINAN BISA DIKARENAKAN INI.
EX: ALTER SESSION SET NLS_SORT = ENGLISH;
MASUKKAN JUGA CARA MENGUBAH FORMAT TANGGAL
EX: alter session set NLS_DATE_FORMAT='<my_format>';
FORMAT TANGGAL:
MM
MON
MONTH
DD
DY
YYYY
YY
RR
AM (or PM)

Numeric month (e.g., 07)


Abbreviated month name (e.g., JUL)
Full month name (e.g., JULY)
Day of month (e.g., 24)
Abbreviated name of day (e.g., FRI)
4-digit year (e.g., 1998)
Last 2 digits of the year (e.g., 98)
Like YY, but the two digits are ``rounded'' to a year in the range 1950 to 2049.
Thus, 06 is considered 2006 instead of 1906
Meridian indicator

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 2

MODUL IV
QUERY DASAR II
HH
HH24
MI
SS

Hour of day (1-12)


Hour of day (0-23)
Minute (0-59)
Second (0-59)

ADD_MONTHS (d,n)
SYSDATE
LAST_DAY (d)
NEXT_DAY (d,day_name)
MONTHS_BETWEEN (d1,d2)

Menghasilkan sebuah tanggal yang berjarak n bulan setelah tanggal d


Menghasilkan tanggal dan jam computer/system
Menghasilkan tanggal terakhir dari bulan pada tanggal d
Menghasilkan tanggal yang jatuh pada hari day_name yang terdekat
setelah tanggal d
Menghasilkan selisih bulan diantara dua tanggal

ROUND (d, [MONTH|YEAR])

Menghasilkan tanggal pembulatan d berdasarkan MONTH atau YEAR

TRUNC (d, [MONTH|YEAR])

Menghasilkan tanggal pemotongan d berdasarkan MONTH atau YEAR

SQL> SELECT add_months ('14-SEP-2010',2) add_months FROM dual;

SQL> SELECT last_day ('24-MAR-2000') last_day FROM dual;

SQL> SELECT next_day('10-JUL-2010','saturday') next_day FROM dual;

SQL> SELECT months_between('20-JUN-2011','01-JAN-2010') month_between FROM dual;

Asumsikan sysdate = '29-sep-2009'


SQL> SELECT round(sysdate,'month') round1 FROM dual;
ROUND1
- - - - - 01OCT-09

SQL> select round(sysdate,'year') round2 FROM DUAL;


ROUND2
- - - - - 01JAN-10

SQL> SELECT trunc(sysdate,'month') trunc1 FROM dual;


TRUNC1
- - - - - 01SEP-09

SQL> SELECT trunc(sysdate,'year') trunc2 FROM dual;


TRUNC1
- - - - - 01JAN-09

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 3

MODUL IV
QUERY DASAR II

Fungsi Konversi
TO_NUMBER (char)
TO_CHAR (date)
TO_CHAR (number)
TO_DATE (char)

Mengkonversi tipe data varchar2, char ke Number


Mengkonversi tipe data date ke varchar2, char
Mengkonversi tipe data number ke varchar2
Mengkonversi tipe data char ke date

SQL> SELECT to_number(88179) to_number FROM dual;


SQL> SELECT to_char('4-jul-2010') "ch_to_date", to_char(817989212) "ch_to_num" FROM dual;
Fungsi Numerik
ABS(n)
LN(n)
LOG(m,n)
SIN(n)
COS (n)
TAN (n)
MOD (m,n)
SQRT (n)
POWER (m,n)
EXP (n)
ROUND (n[,m])
FLOOR (n)
CEIL (n)
SIGN (n)
TRUNC (n[,m])

Menghasilkan nilai abolut dari n


Menghasilkan nilai logaritma natural dari n , dimana n>0
Menghasilkan nilai logaritma berbasis m untuk nilai n, dimana m>1 dan n>0
Menghasilkan nilai sinus dari n
Menghasilkan nilai cosines dari n
Menghasilkan nilai tangent dari n
Menghasilkan sisa pembagian m oleh n , jika n=0 maka fungsi ini akan menghasilkan
nilai m
Menghasilkan akar positif dari n, dimana tidak boleh negative
Menghasilkan nilai m yang dikalikan sebanyak n kali
Menghasilkan nilai e yang dikalikan sebanyak n kali, 3 = 2.71828183
Menghasilkan nilai n yang dibulatkan sebanyak m angka. Jika m tidak ditulis maka
pembulatan sampai 0 angka
Untuk pembulatan bilangan ke bawah
Untuk pembulatan bilangan ke atas
Menghasilkan nilai 1 jika n>0 , nilai 0 jika n=0, dan nilai -1 jika n<0
Menghasilkan nilai n sampai m angka di belakang koma

SQL> SELECT LOG(2,5) log,

SQL> SELECT id, NVL(col1, 'ZERO')

ABS (-8) abs,


LN(2) ln
FROM DUAL;

AS output
FROM null_test_tab ORDER BY id;

SQL> SELECT id, NVL2(col1, col2, col3)

SQL> SELECT SIN (30*3.14159265/180) sin30,


COS (60*3.14159265/180) cos60,
TAN (45*3.14159265/180) tan45
FROM DUAL;

AS output
FROM null_test_tab ORDER BY id;

SQL> SELECT id, NULLIF(col3, col4)


AS output
FROM null_test_tab ORDER BY id;

SQL> SELECT ROUND(17.1255,3) rd1,


ROUND(17.1255,2) rd2,
ROUND(17.1255) rd3
FROM DUAL;

SQL> SELECT id, COALESCE(col1, col2, col3)


AS output
FROM null_test_tab ORDER BY id;

SQL> SELECT FLOOR (2.77) floor,


CEIL (2.49) ceil
FROM DUAL;

Fungsi Umum
NVL(ex1,ex2)
NVL2(ex1,ex2,ex3)
NULLIF(ex1,ex2)
COALESCE(ex1,ex2, exN)

Menggantikan nilai dengan ex2 apabila nilai ditemukan pada ex1


adalah null
Menguji nilai ex1, kemudian memberikan nilai ex2 apabila ex1 NOT
NULL dan memberikan nilai ex3 jika ex1 bernilai NULL
Mengembalikan nilai NULL jika ex1 sama dengan ex2, dan akan
mengembalikan nilai ex1 jika nilai ex1 tidak sama dengan ex2
Menghasilkan nilai ex pertama yang tidak NULL, fungsi iini akan
menghasilkan nilai NULL jika semua ekspresi bernilai NULL

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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)

II. Ekspresi Kondisional


Terdapat dua metode yang digunakan untuk meyatakan ekspresi kondisional, yaitu CASE expression
dan DECODE function.
CASE Expression
Fungsi CASE memfasilitasi kebutuhan kondisional dengan mengerjakan pekerjaan yang ada
dalam statement IF-THEN-ELSE.
Bentuk umumnya adalah :
CASE expression WHEN comparison_expression1
THEN return_expression1
[WHEN comparison_expression2 THEN return_expression2
WHEN comparison_expression-n THEN return_expression-n
ELSE else_expression]
END

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).

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 5

MODUL IV
QUERY DASAR II

III. Menggunakan Fungsi Agregasi (Aggregate Function)


Fungsi agregasi akan melakukan operasi pada kelompok-kelompok baris data[3].
Beberapa fungsi yang termasuk dalam fungsi agregasi adalah :
AVG([DISTINCT|ALL]expr)
COUNT({*|[DISTINCT|ALL]expr})
MAX([DISTINCT|ALL]expr)
MIN([DISTINCT|ALL]expr)
SUM([DISTINCT|ALL]expr)
STDDEV([DISTINCT|ALL]expr)
VARIANCE([DISTINCT|ALL]expr)

Memperoleh nilai rata-rata dari seluruh nilai pada suatu kolom


Memperoleh jumlah baris yang tidak mengandung nilai null dari
suatu kolom
Memperoleh nilai maksimum dari suatu kolom
Memperoleh nilai minimum dari suatu kolom
Memperoleh nilai penjumlahan seluruh baris pada suatu kolom
Memperoleh nilai standar deviasi dari suatu kolom
Memperoleh nilai variansi dari suatu kolom

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 ;

IV. Multiple Selection Conditions


Untuk kasus-kasus query yang memerlukan select dengan kondisi yang banyak, kita dapat
menggunakan klausa where dengan penghubung AND atau OR.
Jika menggunakan AND di antara dua kondisi maka hasil query adalah query dengan kedua
kondisi tersebut terpenuhi. Jika kita menggunakan OR maka oracle hanya akan mengecek kedua
kondisi secara terpisah , hasil query kondisi satu akan ditambahkan dengan hasil query kondisi dua.
Contoh :
Menampilkan nama fasilitas yang harganya lebih besar dari 10000 dan jum_max_fasilitasnya lebih
kecil dari 10.
SELECT nama_fasilitas
FROM fasilitas
WHERE harga_fasilitas > 10000 AND jum_max_fasilitas < 10;

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%;

Bandingkan hasilnya dengan 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%);

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

VI. KLAUSA GROUP BY


Klausa GROUP BY digunakan untuk membagi-bagi baris dalam sebuah tabel berdasarkan
kelompok tertentu. Eksekusi query dilakukan pada setiap kelompok record. Penggunaan GROUP BY
ini dilakukan untuk SELECT yang mengandung fungsi agregasi (COUNT, MAX, MIN, SUM, AVG, dll).
Bentuk Umumnya adalah :
SELECT [ALL|DISTINCT] {*|nama_kolom1, nama_kolom2, }
FROM {nama_tabel_sumber1, nama_tabel_sumber2, ...}
[WHERE kondisi]
[GROUP BY nama_kolom] [HAVING kondisi]
Contoh :
Menampilkan jumlah petugas berdasarkan jenis jabatannya dari table petugas.
SELECT jabatan, COUNT(jabatan)
FROM petugas
GROUP BY jabatan
HAVING COUNT (jabatan) > 1;

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 7

MODUL IV
QUERY DASAR II

VII. MULTI-TABLE ACCESS

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;

Query di atas sama dengan :


SELECT tgl_reservasi, nama_petugas
FROM petugas, reservasi;

Untuk memudahkan dalam memahami hasil dari CROSS JOIN dapat dilihat contoh berikut :

Berikut ini query select yang menghasilkan hasil yang sama :


SQL> SELECT * FROM A CROSS JOIN B ;
SQL> SELECT * FROM A, B ;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 8

MODUL IV
QUERY DASAR II

Tabel hasil untuk statement di atas :

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 ;

Sintaks query untuk Natural Join :


SELECT *
FROM pemesan
NATURAL JOIN reservasi;

Maka tabel yang dihasilkan :

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) ;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 9

MODUL IV
QUERY DASAR II

Query di atas sama dengan :


SELECT petugas.id_petugas, petugas.nama_petugas,
reservasi.tgl_reservasi
FROM petugas, reservasi
WHERE petugas.id_petugas = reservasi.id_reservasi ;

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) ;

Maka tabel yang dihasilkan :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 10

MODUL IV
QUERY DASAR II

RIGHT OUTER JOIN


Join antara dua buah tabel yang mengembalikan hasil dengan baris boleh NULL pada
kanan kolom tabel. Atau bisa dikatakan, join antara dua tabel yang menampilkan semua
data di tabel kanan, walaupun data di sebelah kirinya bernilai NULL.
Sintaks query untuk RIGHT OUTER JOIN,
contoh :
SELECT *
FROM reservasi
RIGHT OUTER JOIN petugas
ON (reservasi.id_petugas = petugas.id_reservasi) ;

Maka tabel yang dihasilkan :

FULL OUTER JOIN


Join antara dua buah tabel yang mengembalikan hasil dengan baris boleh NULL pada
bagian KIRI dan KANAN tabel.
Sintaks query untuk FULL OUTER JOIN
contoh :
SELECT *
FROM reservasi
FULL OUTER JOIN petugas
ON (reservasi.id_petugas = petugas.id_reservasi) ;

Maka tabel yang dihasilkan :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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 ;

Hasil query di atas adalah sebagai berikut :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IV - 12

MODUL IV
QUERY DASAR II

VIII. LATIHAN
1.

Petugas perpustakaan ingin memberikan notifikasi kepada mahasiswa yang datang ke


perpustakaan dengan informasi judul buku, umur buku, kategori buku, dan lokasi buku.
Anehnya petugas hanya ingin menampilkan 20 karakter saja dari judul buku, serta hanya dari
penerbit terbatas yaitu CV. Gunung Jagung. Tolong bantulah petugas perpustakaan ya.
2. a. Buatlah sintaks untuk menampilkan nim, nama mahasiswa, umur mahasiswa, jenis kelamin,
alamat, dan email mahasiswa tersebut dimana hanya mahasiswa dengan umur lebih dari 20
tahun yang ditampilkan dan bila jenis kelaminnya P maka ditampilkan Perempuan dan bila L
maka ditampilkan Laki-Laki.

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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

Perhatikan contoh query berikut ini :

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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).

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

II. Corelated Subquery


Corelated Subquery berbeda dengan subquery. Adapun perbedaannya adalah corelated
subquery memiliki artian bahwa subquery tersebut memiliki keterhubungan ke main query
(melakukan validasi dan mengembalikannya ke main query, yang digunakan untuk memvalidasi baris
per baris sehingga cost yang dibutuhkan lebih besar sehingga performansi lebih lambat). Sementara
itu, kalau subquery biasa tidak melakukan validasi baris per baris (performansi lebih cepat
dibandingkan dengan menggunakan corelated subquery) dan pengeksekusian dimulai dari child
query (query yang terdalam kemudian baru dilanjutkan ke parent query/main query.
Sebagai ilustrasinya adalah sebagai berikut:
SELECT * FROM sekolah s
WHERE EXISTS
(SELECT * FROM calon_peserta
WHERE id_sekolah=s.id_sekolah);
Pada query di atas, dapat kita amati bahwa dilakukannya proses validasi baris per baris dari
subquery terhadap main query, yaitu dengan pencocokan baris per baris sesuai dengan kolom
id_sekolah yang dimiliki tabel sekolah dengan tabel calon_peserta.
Sementara itu, di bawah ini adalah contoh dari subquery biasa, yaitu:
SELECT * FROM sekolah
WHERE EXISTS
(SELECT * FROM calon_peserta);
Contoh lain subquery biasa :
SELECT * FROM sekolah s
WHERE s.id_sekolah IN
(SELECT id_sekolah
FROM calon_peserta
WHERE nama = Danu Witoko);
Dapat kita lihat pada contoh kedua subquery biasa diatas, tidak melakukan validasi baris per
baris melainkan secara logika bisa kita amati, bahwa pertama kali akan dilakukan pencarian pada
tabel calon peserta yg memenuhi syarat kondisi kemudian hasil dari pencarian tersebut digunakan
untuk memperoleh baris yang relevan pada tabel sekolah.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

V- 3

MODUL V
QUERY LANJUT

III. Klausa With


Dengan menggunakan klausa ini, kita dapat menggunakan blok query yang sama pada
statement select ketika statement tersebut dipakai lebih dari satu kali menggunakan complex query.
Klausa ini dapat memperbaiki performansi dari query.
Untuk lebih jelasnya, perhatikan contoh dibawah ini. Tabel yang digunakan adalah tabel Pegawai
pada contoh soal sebelumnya
Contoh :
WITH
gaji_dept AS(
SELECT id_dept, sum(gaji) AS gaji_total
FROM Pegawai
GROUP BY id_dept),
rata2_gaji AS(
SELECT SUM(gaji_total)/COUNT(*) AS rata2_dept
FROM gaji_dept)
SELECT * FROM gaji_dept
WHERE gaji_total >
(SELECT rata2_dept FROM
ORDER BY id_dept;

Klausa WITH,
dibentuk di awal

rata2_gaji)

IV. DDL Query & DML Query


DDL QUERY bisa diinterpretasikan sebagai query yang mensupport untuk terjadinya proses
pembuatan DDL (Data Definition Language).
Perhatikan tabel Panitia berikut:
ID_PANITIA
PU0001
PU0002
PU0003
PU0004
PU0005
PU0006
PU0007
PU0008
PU0009
PU0010
PU0011
PU0012

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

Lalu perhatikan contoh sintaks berikut ini


CREATE TABLE penyelenggara AS
SELECT * FROM panitia;
Sintaks DDL di atas akan menggenerate sebuah tabel penyelenggara yang berisikan struktur dan isi
row yang ada pada tabel Panitia.
Sedangkan DML Query bisa diinterpretasikan sebagai query yang mensupport untuk terjadinya
proses DML (Data Manipulation Language).
Perhatikan query berikut :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

V- 4

MODUL V
QUERY LANJUT

INSERT INTO penyelenggara


SELECT * from panitia;
Dengan sintaks di atas, maka tabel penyelenggara akan terisi dengan data yang sama persis pada
data yang terdapat pada tabel panitia.
Contoh lain DML Query :
UPDATE panitia SET jns_kelamin=L
WHERE id_panitia=(SELECT id_panitia FROM penyelenggara WHERE nama = Stephanie Leo);

Contoh lain DML Query:


DELETE FROM panitia
WHERE id_panitia = (SELECT id_panitia FROM penyelenggara WHERE nama = Rosaria Tiara);

V. Cube, Rollup, dan Grouping Sets


1. Cube
Cube pada oracle adalah jenis dari GROUP BY yang dispesifikkan untuk meng-group kolom
dengan menciptakan subtotal untuk seluruh kombinasi kemungkinan yang diinginkan.
Syntaks bakunya adalah :
SELECT <grouping_columns>, <aggregate_functions>
FROM <table_list>
WHERE <where_condition> optional
GROUP BY CUBE (<column_set_1>, ... , <column_set_N>);
Untuk lebih jelas, coba perhatikan syntaks di bawah ini :
SELECT jabatan, jns_kelamin, COUNT(*) Total
FROM panitia
GROUP BY CUBE(jabatan, jns_kelamin);
Jika Syntax di atas dieksekusi, maka akan diperoleh hasil seperti di bawah ini :
JABATAN

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

Coba kita bandingkan dengan syntax di bawah ini:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

V- 5

MODUL V
QUERY LANJUT

SELECT jabatan, jns_kelamin, COUNT(*) Total


FROM panitia
GROUP BY (jabatan, jns_kelamin);
Maka, akan mengeluarkan hasil seperti di bawah ini :
JABATAN

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 :

Sintaks di atas akan menghasilkan keluaran seperti di bawah ini:


JABATAN
Panitia lokal
Panitia lokal
Panitia lokal
Panitia pusat
Panitia pusat
Panitia pusat
NULL

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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

VI. Null Values


Penggunaan cube, rollup, maupun grouping sets akan menyebabkan munculnya nilai null
pada beberapa kolom dari beberapa tuple. Agar nilai null tersebut tidak kosong maka bisa diisi
dengan nilai yang kita definisikan dengan fungsi NVL, penulisannnya sebagai berikut:
NVL(kolom, nilai_bila_null)
Perhatikan contoh berikut:
Jika terdapat tabel panitia :
ID_Panitia
PU001
PU002
PU003
PU004
PU005

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

Terdapat query berikut :


SELECT NVL(id_panitia, Jumlah Panitia) kode_panitia, nama_panitia, COUNT(*)
FROM panitia
GROUP BY ROLLUP(id_panitia, nama_panitia);

Jika perintah tersebut dijalankan akan menghasilkan keluaran sebagai berikut:


KODE_PANITIA
PU001
PU001
PU002
PU002
PU003
PU003
PU004
PU004
PU005
PU005
Jumlah Panitia

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

V- 7

MODUL V
QUERY LANJUT

VII. LATIHAN
1.
C

a. Subquery yang memungkinkan terjadinya tampilan diatas adalah..


b. Berikut ini adalah operator pembanding yang mungkin digunakan untuk tampilan diatas,
KECUALI..
c. Query yang digunakan untuk menghitung umur buku adalah..
2.

a. Gambar diatas merupakan hasil dari sebuah..


b. Query yang memungkinkan terjadinya table rekap pada gambar diatas adalah..
3.

a. Apa maksud dari gambar diatas?


b. Jika terdapat table Buku dengan atribut (kode_buku, judul, pengarang, tgl_pembelian,
id_suplier) dan table Dipinjam dengan atribut (id_pinjam, tgl_pinjam, tgl_kembali,
kode_buku, nim) dan table Mahasiswa (nim, nama, ttl, alamat). Maka table apakah yang
dapat terlibat untuk menampilkan hasil diatas?

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

V- 8

MODUL VI
PL/SQL

MODUL VI
PL / SQL
Tujuan Praktikum :
2.
3.
4.
5.
6.
7.

Memahami Stuktur Program PL/SQL.


Memahami sintaks-sintaks dasar PL/SQL.
Menggunakan PL/SQL dalam SQL*Plus.
Memahami statemen Kondisional (IF..Then..Else).
Memahami statemen Pengulangan(LOOP).
Memahami Penanganan Error (Exception).

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

II. Struktur Blok PL/SQL


Setiap unit PL/SQL terdiri dari satu blok atau lebih.
Struktur umum untuk membuat sebuah blok PL/SQL di Oracle adalah[6] :

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;
/

tanda ini (/) wajib ada setelah(END;), untuk mengeksekusi PL/SQL

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

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

III. Pendeklarasian Variabel


Sintaks: Identifier [CONSTANT] typedata [NOT NULL] [:= value];
Keterangan:

Identifier, merupakan nama untuk objek-objek PL/SQL seperti variabel, cursor , dsb

CONSTANT, merupakan suatu opsional yang digunakan untuk mendeklarasikan konstanta

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.

IV. Type data pada PL/SQL


Tipe Data
NUMBER(X,Y)

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);

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;/

Menggunakan %TYPE dan %ROWTYPE


%TYPE merupakan atribut variabel yang berfungsi untuk memberikan tipe data yang sama
dengan tipe data suatu kolom dari suatu tabel.
Sintaks: [schema.]nama_table.nama_column%TYPE;
Contoh 5
DECLARE
var_nim Mahasiswa.nim%type
var_nama Mahasiswa.nama%type;
var_alamat Mahasiswa.alamat%type;
var_tgl Mahasiswa.ttl%type;
BEGIN
select nim, nama, alamat, ttl
into var_nim, var_nama, var_alamat, var_tgl
from Mahasiswa where nim='&nim';
dbms_output.put_line('=========Info Mahasiswa=========');

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;/

V. Statement SELECT dalam PL/SQL


tatement SELECT dalam PL/SQL harus mengembalikan sebuah baris, jika tidak ada baris atau ada
banyak baris yang dihasilkan maka kesalahan akan muncul untuk itu diperlukan penanganan
kesalahan pada bagian Exception pada struktur PL/SQL. Perilaku operasi SELECT pada PL/SQL
berbeda dengan pada SQL. Operasi SELECT dalam PL/SQL harus diikuti klausa INTO.
Sintaks:

Klausa INTO harus terletak diantara SELECT dan FROM.


Klausa ini digunakan untuk
menspesifikasikan nama variabel yang digunakan untuk menempatkan nilai kolom yang dihasilkan
dari suatu tabel. Satu variabel untuk satu kolom, dan urutannya disesuaikan.
Untuk mencoba contoh dibawah ini buatlah tabel dengan spesifikasi sebagai berikut :
TABEL MAHASISWA
NIM (not null)

NAMA (not null)

ALAMAT (not null)

MHS-001
MHS-002
MHS-003

Budi
Slamet
Tarjo

Jl. Buah Batu 5


Jl. Soekarno 9
Jl. Sukabirus 12

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;
/

Selanjutnya cobalah contoh dibawah ini dan analisa hasilnya.

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;
/

VI. PL/SQL Record


PL/SQL record menjadikan variabel-variabel yang kita deklarasikan menjadi sebuah unit atau
tipe baru sesuai dengan kebutuhan kita. Untuk penggunaannya Memerlukan adanya deklarasi
variabel terhadap tabel terlebih dahulu sebelum data-datanya dapat digunakan.
Adapun manfaat dari penggunaan record[7] yaitu :
1. Abstraksi data
2. Dapat melakukan operasi ke semua variable dalam record secara bersamaan
3. Kode program menjadi lebih efisien
Sintaks:
TYPE type_name IS RECORD (
Field-1 type-1 [NOT NULL] [:= expr-1]
Field-2 type-2 [NOT NULL] [:= expr-2]
:
Field-n type-n [NOT NULL] [:= expr-n]
);

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 ;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

VII. PL/SQL Table (Array)


Tipe data ini dibayangkan sebagai array pada bahasa C. PL/SQL Table bisa terdiri dari satu
atau lebih elemen data dimana tipe datanya sama. Setiap elemen data diakses dengan
menggunakan indeksnya (indeks bertipe binary_integer).
Sintaks: TYPE table_name IS TABLE OF type INDEX BY BINARY_INTEGER;

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;/

VIII. Percabangan (IF-THEN-ELSE)


Pernyataan percabangan pada PL/SQL berfungsi seperti statement IF pada bahasa
pemrograman lain.
Ada tiga bentuk IF statement pada PL/SQL : [3]
IF - THEN - END IF
IF - THEN - ELSE - END IF
IF - THEN - ELSIF - THEN - END IF
Sintaks:
IF kodisi THEN aksi
[ELSEIF kondisi THEN aksi]
[ELSE aksi]
END IF;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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; /

IX. Pengulangan (Looping)


Sesuai dengan namanya, perintah pengulangan digunakan untuk mengeksekusi suatu bagian
dari program berulang kali sampai suatu kondisi tercapai, atau sebanyak yang ditentukan oleh
pengguna[7]. Terdapat tiga macam statement pengulangan pada PL/SQL[7] yaitu :
1. LOOP-EXIT STATEMENT

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; /

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

exception-identifier merupakan variabel yang digunakan untuk mengaktifkan exception.


Contoh 17
DECLARE
jumlah number;
Id_pemesan pemesan.id_pemesan%TYPE := PN-011;
Nama pemesan.nama%TYPE := Tine;
Alamat pemesan.alamat%TYPE := Jl. Lengkong 7;
penuh exception;
BEGIN
Select count into jumlah from pemesan;
If jumlah > 3
then raise penuh;
else
insert into pemesan values(Id_pemesan, Nama, Alamat);
end if;
EXCEPTION
When penuh then
dbms_output.put_line(maaf jmlh pemesan max 3);
when others then
dbms_output.put_line(terjadi exception lain);
END;/

Membuat Error Message[5]


Error message dapat dibuat dengan RAISE_APLICATION_ERROR. Ini merupakan prosedur yang
disediakan oleh ORACLE untuk membuat sekaligus memanggil sebuah exception.
Sintaks : RAISE_APLICATION_ERROR(error_number, pesan_error);
- Nilai error_number harus berada dalam rentang nilai antara -20999 dan -20000.
- pesan_error adalah pesan kesalahan yang didefinisikan oleh user untuk jenis exception yang
dibuat. Ukuran karakter pesan_error tidak boleh lebih dari 2048 byte(karakter). Prosedur ini
dapat digunakan pada bagian Executable maupun Exception.
Contoh 18
BEGIN
Delete pemesan where id_pemesan=MHS-005;
If SQL%NOTFOUND then
RAISE_APPLICATION_ERROR(-20202, Mahasiswa tidak ditemukan);
End if;
END;
/
Contoh 19
DECLARE
V_nama pemesan.nama %TYPE;
BEGIN
Select nama into V_nama from pemesan
Where id_pemesan = MHS-005;
EXCEPTION

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;/

Exception Init Pragma[7]


Exception ini memungkinkan developer membuat suatu yang sama atau memodifikasi pesan
error dengan predefined exception yang sesuai dengan suatu nomor kesalahan.
Sintaks : PRAGMA EXCEPTION_INIT(exception-identifier, kode_error);
Pada contoh diatas terdapat kesalahan yaitu pada tabel petugas harus ada alamat, tetapi
pada contoh di atas tidak ada. Sehingga muncul pesan error :
ORA-01400: cannot insert NULL into ("TIF2"."PEMESAN"."ALAMAT")
Developer dapat membuat exception yang sama dengan predefined exception seperti di atas,
yaitu dengan cara:
Contoh 21
DECLARE
Ada_kosong exception;
PRAGMA EXCEPTION_INIT(Ada_kosong, -01400);
BEGIN
insert into pemesan(id_pemesan,nama) values('PN-013','Aming');
EXCEPTION
When Ada_kosong then
dbms_output.put_line(kolom NOT NULL tidak boleh kosong);
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

Buatlah PL/SQL yang dapat menampilkan hasil diatas!

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

VI - 12

MODUL VII
CURSOR

MODUL VII
CURSOR
Tujuan Praktikum :
8.
9.
10.
11.

Praktikan Mengetahui dan Memahami fungsi cursor.


Praktikan Mengetahui dan Memahami sintaks cursor.
Praktikan Mengetahui dan Memahami macam-macam cursor.
Praktikan dapat menggunakan cursor dalam SQL *Plus.

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; /

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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; /

II. Macam-macam Cursor


Cursor dibedakan atas dua macam, yaitu cursor eksplisit dan cursor implisit.
Cursor Eksplisit
Cursor eksplisit merupakan cursor yang harus dideklarasikan telebih dahulu sebelum digunakan.
Cursor eksplisit dapat digunakan untuk query yang menghasilkan lebih dari satu record. Selain itu,
dapat pula dimanipulasi melakukan statement tertentu dalam block eksekusi.
Terdapat 4 buah atribut yang berhubungan erat dengan cursor eksplisit yaitu:
Atribut
nama_cursor%FOUND
nama_cursor%NOTFOUND
nama_cursor%ROWCOUNT
nama_cursor%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).

Contoh penggunaan cursor eksplisit:


Contoh cursor yang keluarannya berupa deskripsi tipe pekerja dari kode tipenya.
1
DECLARE
2
/* Explicit declaration of a cursor */
3
CURSOR emptyp_cur IS
4
SELECT emptyp.type_desc
5
FROM employees emp, employee_type emptyp
6
WHERE emp.type_code = emptyp.type_code;
7
BEGIN
8
/* Check to see if cursor is already open. If not, open
it. */
9
IF NOT emptyp_cur%ISOPEN
10
THEN
11
OPEN emptyp_cur;
12
END IF;
13
14
/* Fetch row from cursor directly into an Oracle Forms
item */
15
FETCH emptyp_cur INTO :emp.type_desc;
16
17
/* Close the cursor */
18
CLOSE emptyp_cur;
19
END;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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).

Contoh penggunaan cursor implicit:


UPDATE employee
SET salary = salary * 1.1;

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].

III. Memanipulasi Cursor dengan Struktur FOR-LOOP


Isi cursor dapat dimanipulasi secara otomatis menggunakan struktur pengulangan FOR-LOOP.
Dikatakan otomatis karena:
Tidak diperlukan proses pembukaan (OPEN) cursor
Tidak diperlukan pengambilan (FETCH)
Tidak diperlukan penutupan (CLOSE) cursor
Variable indeks yag digunakan dalam struktur pengulangan FOR-LOOP tidak perlu
dideklarasikan terlebih dahulu.
Sintaks:
FOR nama_variabel IN nama_cursor LOOP
Statement_untuk_memanipulasi_cursor;
END LOOP;

Untuk lebih memahami konsep mengenai materi ini, coba anda perhatikan baik-baik contoh blok
PL/SQL berikut ini:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

IV. Tahapan Penggunaan Cursor


Untuk melakukan pemrosesan cursor dapat dilakukan dengan beberapa langkah berikut:
1. Declare Cursor
Langkah pertama, yaitu dengan melakukan pendeklarasian cursor pada bagian DECLARE pada suatu
blok atau package. Pendeklarasian ini dilakukan untuk mendefinisikan baris (row) yang nantinya
akan diambil.
Berikut adalah sintaks untuk pendeklarasian cursor: DECLARE
CURSOR nama_kursor IS
SELECT statement_select;

Terdapat 3 jenis pendeklarasian cursor, yaitu:


- Cursor tidak berparameter, misalnya:
CURSOR company_cur
IS
SELECT company_id FROM company;

- Cursor yang berparameter, misalnya:

CURSOR company_cur (id_in IN NUMBER) IS


SELECT name FROM company
WHERE company_id = id_in;

- Cursor header yang memiliki klausa RETURN, misalnya:

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

Berikut contoh penggunaan sintaks CLOSE untuk menutup cursor company_cur:


CLOSE company_cur;

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.

Praktikan mengerti penanganan Function dalam Oracle.


Praktikan mengerti penangan Procedure dalam Oracle.

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

VIII- 1

MODUL VIII
STORED PROGRAM

MEMBUAT SEBUAH PROCEDURE

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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

ID_BUKU (not null)


C001
N001
N002

ID_BUKU (not null)


C001
N001
N002

HARGA_SEWA (not null)


4000
1000
300

TABEL PINJAMAN
ID_MEMBER (not null)
TGL_PINJAM
P002
19-JAN-10
P001
17-JAN-10
P003
17-JAN-10

ID_MEMBER (not null)


P001
P002
P003

TABEL MEMBER
NAMA (not null)
Rendra
Aziz
Yudi

TGL_KEMBALI
23-JAN-10
24-JAN-10
24-JAN-10

ID_CABANG (not null)


L001
L002
L002

CABANG
ID_CABANG (not null)
L001
L002
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

LOKASI (not null)


Sukabirus
Gg. PGA
VIII- 3

MODUL VIII
STORED PROGRAM

II. JENIS-JENIS PROCEDURE PADA ORACLE :


1. PROCEDURE TANPA PARAMETER/ARGUMENT
Procedure yang tidak memiliki parameter/argument biasanya menghasilkan output yang
sama setiap kali dieksekusi.
Contoh :
CREATE OR REPLACE PROCEDURE lihat_cabang IS
namalokasi cabang.lokasi%type;
BEGIN
SELECT c.lokasi INTO namalokasi from member m, cabang c where m.id_cabang=c.id_cabang and
m.id_member=P001;
DBMS_OUTPUT.PUT_LINE(Cabang dari member bernama Rendra terletak di ||namalokasi);
END;/

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 :

B. Parameter Keluaran (Output/OUT)


Ditandai dengan penggunaan attribut OUT pada argument, dimana argument yang
disertai atribut OUT tersebut akan diisi/diassign dengan suatu nilai yang akan menjadi
output dari procedure tersebut.
Contoh : Procedure menghitung total harga sewa yang harus dibayar oleh seseorang.
CREATE OR REPLACE PROCEDURE hitung_total_pinjaman (id IN member.id_member%type, biaya
OUT number,nama_member OUT member.nama%type) is
BEGIN
SELECT SUM(harga_sewa) into biaya from buku b, member m, pinjaman p where
m.id_member=p.id_member and b.id_buku=p.id_buku and m.nama=nama;
SELECT nama into nama_member from member where id_member = id;
END;/

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

VIII- 4

MODUL VIII
STORED PROGRAM

Untuk mengeksekusi procedure hitung_total_pinjaman menggunakan blok PL/SQL :


SET SERVEROUTPUT ON
DECLARE
totharga number;
nama member.nama%type;
BEGIN
hitung_total_pinjaman('P001',totharga,nama);
DBMS_OUTPUT.PUT_LINE('Total harga yang harus dibayarkan oleh ||nama|| sebanyak Rp
'||totharga);
END;/

OUTPUT:

C. Parameter Masukan/Keluaran (Input-Output/IN OUT)


Ditandai dengan penggunaan attribute IN OUT pada argument. Dengan penggunaan
atribut IN OUT ini, maka argument tersebut akan dianggap sebagai inputan dan setelah
itu akan ditampilkan kembali sebagai outputan.CONTOH :
CREATE OR REPLACE PROCEDURE pangkat_dua (x IN OUT number) is
BEGIN
x:=x*x;
END;/

Untuk mengeksekusi procedure pangkat_dua menggunakan blok PL/SQL :


SET VERIFY OFF;
DECLARE
angka number;
BEGIN
angka:=&masukkan_angka;
pangkat_dua(angka);
DBMS_OUTPUT.PUT_LINE('Hasil Pangkat Dua Bilangan tersebut adalah : ' ||angka);
END;/

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

Digunakan sebagai parameter di dalam sub program lain


EXECUTE DBMS_OUTPUT.PUT_LINE(nama_fungsi[(parameter)]);

Dilibatkan sebagai bagian dari ekspresi PL/SQL


DECLARE
nama_variabel TYPE_VARIABEL;
BEGIN
nama_variabel := nama_function[(Parameter)];
END;
/

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.

IV. JENIS-JENIS FUNCTION


Ada 2 jenis function, yaitu :
FUNCTION TANPA PARAMETER
Function tanpa parameter biasanya bersifa statis (outputannya selalu sama)setiap kali di
eksekusi.
Contoh:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;
/

Sintaks untuk mengeksekusi function diatas :


DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE(nama member dengan id_member = P001 adalah
||nama_member);
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 :

Sintaks untuk mengeksekusi function diatas :


SELECT lokasi(L001) FROM dual;

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;/

Sintaks untuk mengeksekusi function diatas :


DECLARE
v_hrg buku.harga_sewa%type;
BEGIN
DBMS_OUTPUT.PUT_LINE('judul buku untuk id_buku = C001 adalah '
||keterangan_buku('C001',v_hrg));
DBMS_OUTPUT.PUT_LINE('harga sewa buku untuk id_buku = C001 adalah '||v_hrg);
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;/

Sintaks untuk mengeksekusi function diatas :


DECLARE
x buku.harga_sewa%type:=&hrg_brp_kali_lipat_dari_semula;
BEGIN
DBMS_OUTPUT.PUT_LINE(Harga sewa buku berikut naik ||x|| kali lipat dari harga lama);
DBMS_OUTPUT.PUT_LINE(==================================================);
DBMS_OUTPUT.PUT_LINE(judul buku = ||update_harga_sewa(C001,x));
DBMS_OUTPUT.PUT_LINE(Harga Sewa baru = ||x);
END;
/

Output :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

VIII- 9

MODUL IX
PACKAGE

MODUL IX
PACKAGE
Tujuan Praktikum:
3.
4.

Praktikan memahami masalah tentang package


Praktikan dapat menerapkan package dalam basis data

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

Keuntungan penggunaan package :


Memudahkan pengelolaan modul modul sebagai kesatuan tugas
Package dapat digunakan untuk membagi-bagi tugas dalam hal ini procedure dan fungsi yang
dapat digunakan oleh user, sehingga masing masing user hanya diberikan akses ke package
yang merupakan bagian dari tugas yang diberikan.
Dapat meningkatkan kinerja program[5]
MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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 :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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 :

Mengeksekusi Elemen Package


Untuk mengeksekusi package, sesuaikan dengan elemen yang akan dieksekusi. Jika elemen yang
akan kita eksekusi didalam package adalah function maka untuk mengeksekusinya kita gunakan cara
seperti kita mengeksekusi function, begitu pula dengan procedure dan elemen package lainnya.
Contoh :
Mengeksekusi elemen package yang berupa procedure :

Mengeksekusi elemen package yang berupa function :

Mengeksekusi Elemen package yang berupa Cursor :

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IX- 4

MODUL IX
PACKAGE

Hasil :

Contoh Package Lain


1. Membuat package dari package yang sudah ada :[10]
CREATE OR REPLACE PACKAGE forreal1
IS
PROCEDURE proc1;
END forreal1;
/
CREATE OR REPLACE PACKAGE BODY forreal1
IS
PROCEDURE proc1 IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('for real 1');
END;
END forreal1;
/
CREATE OR REPLACE PACKAGE forreal2
IS
PROCEDURE proc1;
END forreal2;
/
CREATE OR REPLACE PACKAGE BODY forreal2
IS
PROCEDURE proc2 IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('for real 2');
END;
END forreal2;
/
CREATE OR REPLACE PACKAGE cover
IS
PROCEDURE proc1;
PROCEDURE proc2;
END cover;
/
CREATE OR REPLACE PACKAGE BODY cover
IS
PROCEDURE proc1 IS BEGIN forreal1.proc1; END;
PROCEDURE proc2 IS BEGIN forreal2.proc2; END;
END cover;
/

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%;

Syntak untuk kompilasi :


Untuk Package Specification :
ALTER PACKAGE nama_package COMPILE Package;

Untuk Package Body :


ALTER PACKAGE nama_package COMPILE PACKAGE BODY;

Menghapus Procedure,Function dan Package


Untuk menghapus Procedure
DROP PROCEDURE nama_procedure;

Untuk menghapus Function :


DROP FUNCTION nama_function;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IX- 6

MODUL IX
PACKAGE

Untuk menghapus Package Body :


DROP PACKAGE BODY nama_package;

Untuk menghapus Package Body dan Package Specification :


DROP PACKAGE nama_package;

NOTE:

Agar package bisa menampilkan pesan terlebih dahulu ketikkan


SET SERVEROUTPUT ON PADA SQL*PLUS anda
Jika package yang telah ditulis terdapat kesalahan, ketikkan SHOW ERROR
pada SQL*PLUS anda untuk mengetahui letak kesalahan anda.

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:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

IX- 7

MODUL X
TRIGGER

MODUL 10
TRIGGER
Tujuan :
5.
6.
7.

Praktikan dapat memahami trigger


Praktikan mengerti fungsi dan kelebihan penggunaan trigger
Praktikan mampu mengimplementasikan trigger

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.

II. Fungsi dan Kelebihan


Fungsi dan kelebihan penggunaan trigger antara lain:
Mencegah transaksi yang tidak valid.
Dapat menerapkan aturan bisnis yang lebih rumit.
Secara otomatis dapat memberikan nilai pada suatu kolom.
Memperbaiki keamanan database dengan menyediakan audit yang lebih kompleks
mengenai informasi perubahan database dan user siapa yang melakukan perubahan.
Memperbaiki integritas data dengan membuat integrity constraint yang kompleks yang
mana tidak mungkin ditangani oleh sintaks pembuat table.
Sintaks :
-

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

X-1

MODUL X
TRIGGER
Catatan:
- []

= bersifat optional, boleh digunakan atau tidak

- {}

= gunakan salah satu pilihan yang dipisahkan tanda |

-|

= atau

Contoh: (contoh berikut tidak berhubungan dengan ER Diagram modul praktikum)

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

III. Komponen Trigger


Bagian Trigger
Trigger timing
Trigger event

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

Batasan yang mengizinkan


pengeksekusian trigger.
Berapa kali body trigger dieksekusi.

Trigger body

Berisi algoritma aksi yang akan


dilakukan.

Nilai yang mungkin


BEFORE
AFER
INSTEAD OF
- INSERT
- ALTER
- UPDATE
- STARTUP
- DELETE
- LOGOFF
- CREATE
- LOGON
- DROP
- SUSPEND
- SHUTDOWN - etc.
- SERVERERROR
WHEN (boolean value)
T/F
ROW-level
STATEMENT-level
Blok PL/SQL

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

X-2

MODUL X
TRIGGER

IV. Jenis Trigger


A. Row-level dan Statement-level Trigger
Ketika membuat sebuah trigger, dapat ditentukan berapa kali aksi di dalamnya dieksekusi:

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

= variabel yang menyimpan nilai lama kolom sebelum trigger dieksekusi.

:new

= variabel yang mneyimpan nilai baru kolom setelah trigger dieksekusi.

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)

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

VI. Studi Kasus 1


Perhatikan Tabel Relasi di bawah ini:
Peserta
PK

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

Table Cabang_Pertandingan (kondisi awal)


kode_cabang
cab001
cab002
cab003

nama_cabang
Basket_3on3
Volly
Futsal

durasi_pertandingan
30
45
45

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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;

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

X-6

MODUL X
TRIGGER
::Prekondisi::

::Insert Peserta Baru::

::Triggering Statement::

VII. Studi Kasus 2


Sebuah permainan 1-on-1 battle berbasiskan web menerapkan basis data relasional yang sebagian
dari tabelnya dapat dilihat sebagai berikut:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

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.

Berikut percobaan untuk mengecek kedua contoh trigger di atas:

VIII. Cascading Trigger


Suatu trigger bisa memicu dijalankannya trigger lain, sehingga terjadi operasi trigger berantai.
Misalnya operasi insert suatu tabel memiliki trigger yang memicu trigger pada tabel lain, kemudian
trigger pada tabel terakhir ini dapat memicu trigger tabel lain juga. Dalam cascading operation
seperti ini, dapat terjadi kesalahan ORA-04091 atau table is mutating. Hal ini disebabkan
karena ada trigger action yang mencoba melakukan operasi query atau modifikasi terhadap tabel
yang sedang dimodifikasi. Untuk menghindari kesalahan seperti ini, maka trigger harus
dimodifikasi agar tidak melakukan pengaksesan tabel yang sedang digunakan.
Contoh mutating trigger:

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

X-9

MODUL X
TRIGGER

IX. Contoh Lain Penggunaan Trigger


:::>> Pembuatan Auto Increment <<:::
Auto increment (seperti halnya pada MySQL) disini berarti pengisian kolom suatu tabel yang
dilakukan secara automatic secara increment (bertahap naik / turun). Contoh berikut adalah
pembuatan primary key secara automatic.
1. Pembuatan sequence
2. Pembuatan trigger

X. Mengubah Status Trigger


Pada saat diciptakan, trigger berstatus aktif (enable). Kita dapat mengubah status trigger dengan
perintah-perintah berikut:

Untuk menonaktifkan trigger dapat menggunakan sintaks:


ALTER TRIGGER nama_trigger DISABLE;
Untuk mengaktifkan trigger menggunakan sintaks:
ALTER TRIGGER nama_trigger ENABLE;

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;

Untuk menghapus trigger digunakan sintaks:


DROP TRIGGER nama_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?

MODUL PRAKTIKUM BASIS DATA RELASIONAL 2013

X - 10

Anda mungkin juga menyukai