Anda di halaman 1dari 62

MODUL PRAKTIKUM

PEMROGRAMAN BASIS DATA


SIF 15202

LABORATORIUM SISTEM INFORMASI


PROGRAM TEKNOLOGI INFORMASI DAN ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA
MALANG
2014

DAFTAR ISI
BAB I STORED PROCEDURE INTRODUCTION

1.1 SQL Procedure.............................................................................................................................. 1


1.2 SQL Procedure Sederhana .......................................................................................................... 12
1.3 DECLARATION .......................................................................................................................... 2
LATIHAN........................................................................................................................................... 3
BAB II REVIEW PL/SQL ELEMENT 4
2.1 Tipe Data ...................................................................................................................................... 4
2.1.1 Tipe Data Baris ..................................................................................................................... 4
2.1.2 Tipe Data Array .................................................................................................................... 5
2.1.3 Anchor Data Type................................................................................................................. 6
LATIHAN........................................................................................................................................... 7
BAB III - CONDITION 8
3.1 STATEMENT IF .......................................................................................................................... 8
3.2 CONTOH STATEMENT IF ...................................................................................................... 12
2.1.1 Simple Case Statement ....................................................................................................... 12
2.1.2 Search Case Statement ...................................................................................................... 121
LATIHAN....................................................................................................................................... 123
BAB IV - LOOP 184
4.1 Pengulangan.............................................................................................................................. 124
4.2 While ........................................................................................................................................ 124
4.3 Repeat ....................................................................................................................................... 125
4.4 Loop .......................................................................................................................................... 126
4.5 For ............................................................................................................................................. 127
LATIHAN....................................................................................................................................... 129
BAB V CURSOR AND RESULT SETS

240

5.1 Contoh Deklarasi Cursor ............................................................................................................ 20


5.1.1 Cursor dalam sebuah SQL Procededure ............................................................................. 21
5.1.2 Contoh Cursor ..................................................................................................................... 22
2

5.2 Positioned Delete ........................................................................................................................ 23


5.3 Positioned Update ....................................................................................................................... 23
5.4 Menggunakan Proses Cursor Untuk Mengembalikan Multiple Result Set ................................ 24
5.5 Cursor Mempengaruhi Locking .................................................................................................. 25
5.6 Isolation Level ............................................................................................................................ 26
LATIHAN......................................................................................................................................... 27

BAB VI CONDITION HANDLING DAN TRANSACTION MANAGEMENT 28


6.1 SQLSTATE dan SQLCODE ...................................................................................................... 28
6.2 Condition Handling .................................................................................................................... 29
6.3 Trancsaction Management .......................................................................................................... 31
LATIHAN......................................................................................................................................... 33

BAB VII DYNAMIC SQL

34

7.1 Dynamic SQL ............................................................................................................................. 34


7.1.1 Contoh dynamic sql single execute..................................................................................... 35
7.1.2 Contoh dynamic sql multiple execute ................................................................................. 36
LATIHAN......................................................................................................................................... 38

BAB VIII NESTED SQL PROCEDURE

39

8.1 Pemanggilan SQL Procesure ...................................................................................................... 39


8.2 Dasar Nested SQL Procedure ..................................................................................................... 40
8.3 Locator Variabel ......................................................................................................................... 41
8.4 Contoh Nested SQL Procedure ................................................................................................... 43
8.5 Recursive .................................................................................................................................... 44
LATIHAN......................................................................................................................................... 45

BAB IX - USER DEFINED FUNCTION 46


9.1 Definisi User Defined Function ............................................................................................. 46
9.2 Pembuatan User Defined Function ........................................................................................ 46
9.2.1 Create UDF ....................................................................................................................... 46
3

9.2.2 Modifying UDF ................................................................................................................ 47


9.2.3 Drop UDF.......................................................................................................................... 48
9.3 Tipe-Tipe User Defined Function .......................................................................................... 48
9.3.1 User defined scalar functions ......................................................................................... 49
9.3.2 User defined table functions ........................................................................................... 50
LATIHAN......................................................................................................................................... 52

BAB X MODULE

52

10.1 Module ...................................................................................................................................... 52


LATIHAN......................................................................................................................................... 54

BAB XI TRIGGER

595

11.1 TRIGGER ............................................................................................................................... 595


11.1.1 Contoh BEFORE trigger ................................................................................................. 606
11.1.2 Contoh AFTER trigger ................................................................................................... 606
11.1.3 Contoh INSTEAD OF trigger ......................................................................................... 617
LATIHAN......................................................................................................................................... 58

BAB I STORED PROCEDURE INTRODUCTION


TUJUAN BELAJAR :
Membuat sebuah stored procedure menggunakan struktur dasar SQL
procedure

1.1 SQL Procedure


SQL Procedure didefiniskan dan disimpan di katalog DB2. SQL Procedure dapat
mendukung pengembalian lebih dari satu set hasil maupun untuk memanggil SQL
procedure dan juga dapat mendukung multiple parameter (input, output, maupun
input/output). Kalimat yang ada di dalam STORE PROCEDUR adalah bahasa SQL. Isi
dari procedure dapat berupa compound statement (BEGIN ... END), pendeklarasian,
statement assignment, syarat, struktur pengulangan (LOOP, dsb), exception handling, dan
CALL yang digunakan untuk memanggil stored procedure lain.

1.2 SQL Procedure Sederhana


Berikut ini adalah beberapa contoh Stored Procedure sederhana.
1. Stored Procedure untuk menambahkan data dalam suatu tabel.
CREATE OR REPLACE PROCEDURE insert1 (IN NOMOR CHAR(6), IN NAMA1
VARCHAR(12))
P1: BEGIN
INSERT INTO EMPLOYEE1 (NOM, NAMA) VALUES (NOMOR, NAMA1);
END P1

2. Stored Procedure untuk mengupdate data dalam suatu tabel.


CREATE OR REPLACE PROCEDURE update1 (IN NOMOR CHAR(6), IN ALAMAT1
VARCHAR(12))
P1: BEGIN
UPDATE EMPLOYEE1 SET ALAMAT = ALAMAT1
WHERE NOM = NOMOR;
END P1

3. Stored Procedure untuk menghapus data dalam suatu tabel.


CREATE OR REPLACE PROCEDURE delete1 (IN NOMOR CHAR(6))
P1: BEGIN
DELETE FROM EMPLOYEE1
WHERE NOM = NOMOR;
END P1

4. Stored Procedure untuk menampilkan data suatu tabel.


CREATE OR REPLACE PROCEDURE select1 (IN NOMOR CHAR(6), OUT PESAN
VARCHAR(50))
RESULT SETS 1
P1: BEGIN
DECLARE CUR1 CURSOR WITH RETURN FOR
SELECT * FROM EMPLOYEE1 WHERE NOM = NOMOR;
OPEN CUR1;
SET PESAN = DATA BERHASIL DITAMPILKAN;
END P1

1.3 DECLARATION
1.3.1

Local variable
Digunakan pada Bahasa SQL Procedural Stored Procedure. Variabel ini dapat
digunakan untuk menyimpan parameter yang mungkin akan berubah selama
eksekusi prosedur atau dapat digunakan untuk melakukan perhitungan oleh stored
procedure.
DECLARE var_name datatype [DEFAULT VALUE];

Contoh: DECLARE my_var INTEGER DEFAULT 6;


Maksud dari kalimat diatas adalah mendeklarasikan variable dengan nama my_var
yang bertipe data integer dengan nilai default 6.
Apabila nilai default tidak diisikan, secara otomatis akan bernilai NULL.
1.3.2

Condition declaration
Contoh: DECLARE not_found CONDITION FOR SQLSTATE 02000;

1.3.3

Local cursor declaration


Contoh: DECLARE c1 CURSOR FOR select * from staff;

1.3.4

Handler declaration
Contoh: DECLARE EXIT HANDLER FOR SQL EXCPETION ;

LATIHAN
1. Buatlah procedure untuk dapat melakukan insert ke tabel Employee!
2. Buatlah procedure untuk menghapus baris pada tabel Employee dengan parameter

input berupa empno!


3. Buatlah procedure untuk mengupdate data firstnme pada tabel Employee dengan

parameter input berupa empno dan firstnme yang baru!

BAB II REVIEW PL/SQL ELEMENT


TUJUAN BELAJAR :
Mempelajari kembali beberapa elemen PL/SQL

2.1 Tipe Data


Tipe-tipe data yang digunakan dalam SQL tidak memiliki perbedaan jauh dengan bahasa
pemrograman pada umumnya. Dalam SQL kita akan menemukan tipe data seperti integer
(bigint, int, smallint), float, decimal/numeric, double, real, char, varchar, date, time,
timestamp, blob, dll. Tipe data tersebut adalah tipe data yang telah disediakan. Sedangkan
User-defined Distinct data type (UDT) merupakan tipe data yang dibuat sendiri oleh
pengguna. Tipe data ini dapat didefinisikan dari beberapa tipe data yang telah ada. Pada
bab ini akan dibahas tentang tipe data baris dan array.
2.1.1 Tipe Data Baris
Tipe data ini terdiri dari beberapa field, tiap field memiliki nama dan tipe datanya sendiri,
yang dapat digunakan untuk menyimpan nilai kolom dari baris dalam suatu hasil.
Berikut ini adalah contoh untuk membuat tipe data baris.
CREATE TYPE myRowType AS ROW
(
Key INTEGER,
data VARCHAR(100)
);
CREATE PROCEDURE myProc(OUT p1 myRowType)
BEGIN
DECLARE var1 myRowType;
SET var1.key = 100;
SET var1.data = one hundred;
SET p1 = var1;
END;

CREATE TABLE t1 (
deptNo VARCHAR(3),
reportNo VARCHAR(3),
deptName VARCHAR(29),
mgrNo VARCHAR (8),
location VARCHAR(128)
);
INSERT INTO t1 VALUES
('123', 'MM1', 'Sales-1', '0112345', 'Miami');
INSERT INTO t1 VALUES
('456', 'MM2', 'Sales-2', '0221345', 'Chicago');
INSERT INTO t1 VALUES
('789', 'MM3', 'Marketing-1', '0331299', 'Toronto');
CREATE TYPE deptRow AS ROW (
r_deptNo VARCHAR(3),
r_reportNo VARCHAR(3),
r_depTName VARCHAR(29),
r_mgrNo VARCHAR (8),
r_location VARCHAR(128)
);
CREATE FUNCTION getLocation(
theDeptNo VARCHAR(3),
reportNo VARCHAR(3),
theName VARCHAR(29)
)
RETURNS VARCHAR(128)
BEGIN
DECLARE dept deptRow;
SET
SET
SET
SET
SET

dept.r_deptno = theDeptNo;
dept.r_reportNo = reportNo;
dept.r_deptname = theName;
dept.r_mgrno = '';
dept.r_location = '';

2.1.2 Tipe Data Array


Tipe data array terbagi menjadi dua, yaitu :
1. Array konvensional
Berikut ini adalah contoh untuk membuat array konvensional.
CREATE TYPE arrType AS INTEGER ARRAY[1000];
2. Array asosiatif
Array asosiatif tidak memiliki keterikatan khusus pada jumlah elemen yang digunakan
dan setiap nilai elemen memiliki nilai indeks yang berkaitan. Berikut ini adalah
contoh untuk membuat array asosiatif.
9

CREATE TYPE arrType2 AS


INTEGER ARRAY [VARCHAR(100)];
CREATE TYPE PHONENUMBERS AS DECIMAL(10,0)
ARRAY[50];
CREATE TYPE arrType3 AS
myRowType ARRAY[VARCHAR(100)];
CREATE TYPE CAPITALSARRAY AS VARCHAR(30)
ARRAY[VARCHAR(20)];

2.1.3 Anchor Data Type


Tipe data ini digunakan untuk variable prosedur yang memiliki struktur yang sama dengan
kolom tabel yang telah ada. Berikut ini adalah contoh membuat variable yang
dibedakan menjadi dua, yaitu :
1. Skalar
CREATE
INSERT
INSERT
CREATE

TABLE tab1(col1 INT, col2 CHAR);


INTO tab1 VALUES (1,2);
INTO tab1 VALUES (3,4);
TABLE tab2 (col1a INT, col2a CHAR);

CREATE PROCEDURE p1()


BEGIN
DECLARE var1 ANCHOR tab1.col1;
SELECT col1 INTO var1 FROM tab1 WHERE col2 = 2;
INSERT INTO tab2 VALUES (var1, 'a');
END;

2. Baris
CREATE PROCEDURE ADD_EMP ()
BEGIN
DECLARE emp ANCHOR ROW employee;
SET emp.empno= 000100;
SET emp.lastname= McClung;
SET emp.firstname= Naomi;
END;

10

LATIHAN
1. Buatlah prosedur untuk memasukkan empno, firstnme, lastname, workdept dan salary
pada table EMPLOYEE_TEST. Tipe data empno, firstnme, lastname, workdept dan
salary sesuai dengan tipe data pada kolom employee!
2. Buatlah prosedur untuk menampilkan nama department dari manager. Parameter input
terdiri dari firstname dan lastname sedangkan parameter out berupa deptname dari
manager tersebut. Tipe data parameter input menggunakan tipe data pada kolom
masing-masing!
3. Buatlah prosedur yang menampilkan projno, projname, actno, actkwd, actdesc, dan
acstdate dari nama departemen yang dijadikan parameter input. Tipe data parameter
input sesuai dengan tipe data pada kolom masing-masing! Tampilkan juga keluaran
berupa tulisan Daftar Project dan Act Perusahaan (deptname tersebut)!

11

BAB III - CONDITION


TUJUAN BELAJAR :
-Memanfaatkan conditional statement untuk memecahkan permasalahan
-Membedakan penggunaan IF dan CASE

Conditional statement memperbolehkan stored procedures untuk membuat keputusan yang


digunakan untuk menetapkan berbagai eksekusi berdasarkan kondisi yang sesuai maupun
tidak sesuai. Conditional statemen yang biasa digunakan adalah statement IF dan CASE.
-

Statement IF dapat digunakan untuk menentukan eksekusi ketika kondisi terpenuhi


dan ketika kondisi tidak terpenuhi

Statement CASE menyediakan kemampuan untuk mengevaluasi daftar pilihan


berdasarkan nilai dari variabel tunggal. Anda bisa menggunakan statement CASE jika
anda memiliki banyak keputusan dan semua keputusan tersebut berdasarkan pada
nilai dari variabel yang sama.

3.1 STATEMENT IF
Pendekatan yang paling sering digunakan untuk eksekusi kondisi adalah statement IF.
Pada dasarnya terdapat tiga golongan statement IF. Bentuk yang paling sederhana dari
statement IF adalah melakukan sesuatu jika kondisi terpenuhi begitu pula sebaliknya.

Namun apa yang akan terjadi jika anda ingin melakukan sesuatu ketika kondisi terpenuhi
dan melakukan hal lain ketika kondisi tidak terpenuhi? Disinilah peranan klausa ELSE.
Ketika digunakan bersamaan dengan statement IF, anda bisa melakukan eksekusi jika
kondisi TRUE dan melakukan eksekusi lain jika kondisi FALSE.

Yang ketiga, ELSEIF digunakan untuk membuat kondisi bercabang berdasarkan kondisi
dengan cara yang sama dengan statement IF.
Syntax :
IF cond1 THEN statement;
ELSEIF cond2 THEN statement;
ELSE statement;
END IF;

12

Konsep IF mengijinkan pemrosesan statement kondisi didalam stored procedure.


Pengecekan kondisi bisa lebih dari satu level dengan menggunakan klausa ELSEIF.
Anda juga bisa menggunakan compound statement(BEGIN/END) didalam statement
IF.

Contoh
CREATE PROCEDURE UPDATE_SALARY_IF
(IN employee_number CHAR(6), INOUT rating SMALLINT)
LANGUAGE SQL
BEGIN
SET rating = -1;
IF rating = 1

--(1)

THEN UPDATE employee


SET salary = salary * 1.10, bonus = 1000
WHERE empno = employee_number;
ELSEIF rating = 2

--(2)

THEN UPDATE employee


SET salary = salary * 1.05, bonus = 500
WHERE empno = employee_number;
ELSE UPDATE employee

--(3)

SET salary = salary * 1.03, bonus = 0


WHERE empno = employee_number;
END IF;
END

(1) employee dengan rating 1 akan mendapat kenaikan gaji 10% dan bonus $1000
(2) employee dengan rating 2 akan mendapat kenaikan gaji 5% dan bonus $500
(3) semua employee yang tidak memiliki rating akan mendapat kenaikan gaji sebesar
3%
dan tidak mendapat bonus

Dalam membuat kondisi pada statement IF, tidak hanya dibatasi oleh operator
matematika seperti =, >, <. Anda juga bisa menggunakan keyword SQL seperti NOT,
AND, atau OR.

13

NOTE:
IF

atau

ELSEIF

harus

melibatkan

operator.

Tidak

cukup

hanya

dengan

mendeklarasikan variabel(seperti yang bisa diselesaikan di beberapa bahasa


pemrograman lain), PL SQL tidak dapat menentukan nilai negatif sebagai false dan
nilai positif sebagai true.

3.2 CONTOH STATEMENT CASE


Ada dua jenis Statement Case yaitu Simple Case Satement dan Search Case Statement
3.2.1

Simple Case Statement


Syntax
CASE exspression
WHEN condition THEN statement
ELSE statement
END CASE

Pada simple case statement, ekspresi sebelum keyword WHEN yang pertama
dicek kesamaannya dengan nilai dari tiap expression yang mengikuti keyword
WHEN. Jika nilainya sama, statement yang mengikuti keyword THEN akan
dieksekusi. Jika tidak, proses pembandingan dilanjutkan antara expression
pertama dengan expression yang mengikuti klausa WHEN berikutnya. Jika
hasilnya tidak cocok dengan semua kondisi, maka statement pada klausa ELSE
akan dieksekusi

14

Contoh
CREATE PROCEDURE foo ( IN v_workdept CHAR(3))
LANGUAGE SQL
P1: BEGIN
CASE v_workdept
WHEN 'A00'
THEN UPDATE department
SET deptname = 'DATA ACCESS 1';
WHEN 'B01'
THEN UPDATE department
SET deptname = 'DATA ACCESS 2';
ELSE UPDATE department
SET deptname = 'DATA ACCESS 3';
END CASE;
END P1

Dalam contoh diatas, v_workdept dicocokkan apakah sama dengan 'A00' dan
'B01'. Jika v_workdept tidak sama dengan A00 atau B01, kondisi ELSE akan
dieksekusi dan deptname di set menjadi 'DATA ACCESS 3'.

3.2.2

Search Case Statement


Syntax
CASE
WHEN condition THEN statement
ELSE statement
END CASE

Variasi searched case statement sedikit berbeda dari simple case statement
dimana proses pencocokan dilakukan untuk setiap nilai dari setiap ekspresi yang
mengikuti keyword WHEN. Argumen pada statement case pada search case
statement dicek pada setiap klausa WHEN.

15

Contoh
CREATE PROCEDURE foo ( IN v_workdept CHAR(3))
LANGUAGE SQL
P1: BEGIN
CASE
WHEN v_workdept = 'A00'
THEN UPDATE department
SET deptname= 'DATA ACCESS 1';
WHEN v_workdept = 'B01'
THEN UPDATE department
SET deptname = 'DATA ACCESS 2';
ELSE
UPDATE department
SET deptname = 'DATA ACCESS 3';
END CASE;
END P1

Baik simple case statement maupun searched case statement membutuhkan END
CASE untuk menunjukkan akhir dari statement CASE. Dimungkinkan untuk
menggunakan statement CASE tanpa klausa ELSE. Namun, jika tidak ada
kondisi yang terpenuhi pada klausa WHEN ketika run-time, maka hasilnya akan
error(SQLSTATE 20000).

16

LATIHAN
1. Buatlah stored procedure yang dapat menampilkan empno, firstname, lastname, salary
dan income dari employee yang bekerja di departmen tertentu (inputan kode
department). Income berisi keterangan, LOW, NORMAL atau HIGH dengan
ketentuan seperti berikut
-

Jika Salary kurang dari 50000 maka income LOW

Jika Salary antara 50000 sampai 60000 maka income NORMAL

Jika Salary lebih besar dari 60000 maka income HIGH

(Gunakan Statement CASE)


2. Buatlah procedure untuk menampilkan last name, salary dan nilai perbedaan (dalam
bentuk mutlak) antara gaji dengan 50000. Misalnya untuk salary 60000 maka nilai
perbedaannya adalah 10000, dan untuk salary 40000 maka nilai perbedaannya adalah
10000 (inputan employee number). Tambahkan pesan bahwa Data Berhasil
ditampilkan. (Gunakan Statement IF)
3. Buatlah sebuah procedure untuk menampilkan kode department, nama department,
jumlah pegawai pada tiap department dan keterangan. Keterangan berisi ketentuan
-

Jika jumlah pegawai kurang dari atau sama dengan 5 maka keterangannya sangat
kurang

Jika jumlah pegawai lebih dari 5 dan kurang dari 8 maka keterangannya kurang

Jika jumlah pegawai antara 8 sampai 10 maka keterangannya cukup

Jika jumlah pegawai lebih dari 10 maka keterangannya banyak

Inputan berupa kode department. (Gunakan Statement CASE)


4. Buatlah procedure untuk menampilkan kode department, nama department, nama
employee, salary. Jika salary diatas rata-rata maka salary dikurangi 15% sedangkan
jika salary dibawah rata-rata maka salary ditambah 10%. Tampilkan pesan data
berhasil diupdate. (Gunakan Statement IF/CASE)

17

BAB IV - LOOP
TUJUAN BELAJAR :
-Memahami jenis pengulangan dalam stored procedure
-Mengimplementasikan beberapa jenis pengulangan pada stored procedure
4.1 PENGULANGAN
Dalam stored procedure memungkinkan untuk melakukan pengulangan seperti dalam
bahasa pemrograman yang lain. Ada beberapa tipe pengulangan yang dapat digunakan
dalam stored procedure yaitu LOOP, WHILE, FOR dan REPEAT.

4.2 WHILE
Seperti penggunaan pengulangan WHILE dalam bahasa pemrograman lain,
pengulangan WHILE akan terus berjalan jika kondisi bernilai true dan akan berehnti
jika bernilai false. Kondisi WHILE akan dievaluasi di awal eksekusi loop.
WHILE [conditions]
DO
[SQL-procedure-statement]
END WHILE;

Contoh penggunaan WHILE


CREATE OR REPLACE PROCEDURE TEST8()
BEGIN
DECLARE FIRST_NAME VARCHAR(15);
DECLARE LAST_NAME VARCHAR(15);
DECLARE FULL_NAME VARCHAR(30);
DECLARE COUNTER INTEGER DEFAULT 0;
DECLARE C1 CURSOR FOR SELECT FIRSTNME,LASTNAME
FROM EMPLOYEE;
OPEN C1;
WHILE COUNTER<10
DO
FETCH C1 INTO FIRST_NAME,LAST_NAME;
SET FULL_NAME=FIRST_NAME||' '||LAST_NAME;
INSERT INTO FULLNAMES VALUES (FULL_NAME);
SET COUNTER=COUNTER+1;
END WHILE;
END@

Pada contoh diatas, digunakan untuk menggabungkan data first name dan last name
dari employee, data first name dan last name tersebut akan digabung menjadi fullname
18

kemudian data fullname tersebut akan dimasukkan ke dalam tabel FULLNAMES


hanya 10 data pertama.

4.3 REPEAT
Pengulangan REPEAT hampir sama dengan WHILE. Jika pengulangan WHILE,
kondisi berada di awal statement, tetapi jika pengulangan REPEAT kondisi berada di
akhir statement dengan menggunakan klausa UNTIL untuk mengontrol jalannya
perulangan. Jika kondisi pada kalusa UNTIL terpenuhi maka pengulangan REPEAT
akan berhenti. Statement dalam pengulangan REPEAT setidaknya akan di jalankan satu
kali, hal ini dikarenakan pengecekan kondisi berada di akhir statement REPEAT.
[Label :]
REPEAT
[SQL-procedure-statement]
UNTIL [conditions]
END REPEAT [Label];

Contoh penggunaan REPEAT


CREATE OR REPLACE PROCEDURE TEST9()
BEGIN
DECLARE FIRST_NAME VARCHAR(15);
DECLARE LAST_NAME VARCHAR(15);
DECLARE FULL_NAME VARCHAR(30);
DECLARE COUNTER INTEGER DEFAULT 0;
DECLARE C1 CURSOR FOR SELECT FIRSTNME,LASTNAME
FROM EMPLOYEE;
OPEN C1;
REPEAT
FETCH C1 INTO FIRST_NAME,LAST_NAME;
SET FULL_NAME=FIRST_NAME||' '||LAST_NAME;
INSERT INTO FULLNAMES VALUES (FULL_NAME);
SET COUNTER=COUNTER+1;
UNTIL COUNTER>=10
END REPEAT;
END@

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan
WHILE sebelumnya, tetapi diimplementasikan dengan menggunakan pengulangan
REPEAT.

19

4.4 LOOP
Pengulangan LOOP sedikit berbeda dengan pengulangan yang lain. Pengulangan
LOOP tidak mempunyai klausa untuk menentukan kondisi berhenti di bagian
pernyataan dekalarasinya. Dalam penggunaan statement LOOP biasanya diikuti dengan
statement LEAVE, statement LEAVE berfungsi untuk keluar dari pengulangan LOOP
jika suatu kondisi yang ditentukan telah terpenuhi. Dengan kata lain, statement LEAVE
digunakan untuk menghentikan proses pengulangan pada LOOP. Selain pernyataan
LEAVE, pernyataan GOTO juga dapat digunakan untuk keluar dari pengulangan
LOOP, tetapi penggunaan pernyataan GOTO tidak disarankan dalam LOOP.
Syntax LOOP:
[label] LOOP
SQL-procedure-statement(s);
END LOOP [label]

Contoh penggunaan LOOP:


CREATE OR REPLACE PROCEDURE TEST10()
BEGIN
DECLARE FIRST_NAME VARCHAR(15);
DECLARE LAST_NAME VARCHAR(15);
DECLARE FULL_NAME VARCHAR(30);
DECLARE COUNTER INTEGER DEFAULT 0;
DECLARE C1 CURSOR FOR SELECT FIRSTNME,LASTNAME
FROM EMPLOYEE;
OPEN C1;
LOOP_LABEL:
LOOP
FETCH C1 INTO FIRST_NAME,LAST_NAME;
SET FULL_NAME=FIRST_NAME||' '||LAST_NAME;
INSERT INTO FULLNAMES VALUES (FULL_NAME);
SET COUNTER=COUNTER+1;
IF COUNTER>=10 THEN LEAVE LOOP_LABEL;
END IF;
END LOOP LOOP_LABEL;
END@

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan
WHILE dan REPEAT sebelumnya, tetapi diimplementasikan dengan menggunakan
pengulangan LOOP.

20

4.5 FOR
Pengulangan FOR merupakan compound statement dengan divinisi CURSOR
didalamnya. Hal ini memungkinkan untuk mengolah dan memproses semua row yang
dikembalikan atau result sets dari SELECT statement pada devinisi CURSOR.
Syntax FOR:
[label] FOR for-loop-name AS [cursor-name CURSOR FOR]
select-statement DO
SQL-procedure-statement(s);
END FOR [label]
Beberapa aturan dalam FOR statement:

FOR mengeksekusi statement atau kumpulan statement untuk setiap row pada
tabel yang dikembalikan CURSOR.

Jika label digunakan dalam statement FOR, maka label tesebut dapat digunakan
untuk statement LEAVE dan ITERATE. Nama Label pembuka dan

label

penutup harus sama.

Nama-nama kolom dalam select statement harus unik dan tabel yang digunakan
pada select statement harus ada terlebih dahulu.

CURSOR yang dideklarasikan pada FOR statement tidak dapat digunakan di


luar FOR statement dan tidak dapat di menggunakan statement OPEN, FETCH
atau CLOSE.

contoh penggunaan FOR statement:


CREATE OR REPLACE PROCEDURE TEST7()
BEGIN
DECLARE FULL_NAME VARCHAR(30);
FOR FOR_TEST AS C1 CURSOR FOR
SELECT FIRSTNME,LASTNAME FROM EMPLOYEE
DO
SET FULL_NAME=FIRSTNME||' '||LASTNAME;
INSERT INTO FULLNAMES VALUES (FULL_NAME);
END FOR;
END@

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan
WHILE, REPEAT dan LOOP sebelumnya, tetapi diimplementasikan dengan
menggunakan pengulangan FOR.
21

Perulangan FOR sedikit berbeda dengan perulangan yang lain karena dalam
perulangan FOR sudah terdapat CURSOR di dalamya sehingga tidak perlu
mendeklarasikan CURSOR sebelumnya seperti pada WHILE, REPEAT dan LOOP.
Dalam perulangan FOR juga tidak perlu melakukan OPEN cursor, FETCH data dan
CLOSE cursor. Data hasil dari CURSOR atau result sets akan di FETCH per baris
setiap kali perulangan sampai baris yang terakhir. Perulangan FOR akan berhenti
ketika sudah tidak ada baris yang dibaca pada result set.

22

LATIHAN
1. Buat sebuah stored procedure yang dapat menghitung jumlah fakultas, jumlah
jurusan dan jumlah total (jumlah fakultas dan jumlah jurusan) dengan
menggunakan perulanagan.
2. Buat tabel dengan nama FAKULTAS_BACKUP yang mempunyai struktur sama
dengan tabel FAKULTAS.
Buat sebuah stored procedure yang dapat mengcopy data dari tabel FAKULTAS
ke tabel FAKULTAS_BACKUP. Jumlah data yang dicopy berdasarkan inputan
user, dan jika jumlah data yang diinputkan oleh user melebihi jumlah data yang
ada pada tabel FAKULTAS maka tampilkan pesan error dan operasi copy data
tidak dilakukan.
Jika operasi copy data berhasil, tampilkan pesan sukses.

23

BAB V CURSOR AND RESULT SETS


TUJUAN BELAJAR :
- Menjelaskan tentang proses cursor
- Menggunakan cursor dalam SP
- Melakukan position delete dan position update
- Mendeskripsikan jalannya cursor pada commit dan rollback
- Menggunakan proses cursor untuk mengembalikan result sets pada sebuah
aplkasi
- Menjelaskan bagaimana cursor mempengaruhi locking

Cursor memungkinkan sebuah aplikasi me-retrive beberapa baris dan kemudian


memprosesnya menjadi beberapa baris dalam satu waktu. Ketika menggunakan sebuah
cursor, program dapat mengambil setiap baris secara sequential dari result table sampai data
terakhir. Statement SELECT digunakan harus dalam statement DECLARE CURSOR.
Statement DECLARE CURSOR menentukan dan menamai cursor, mengidentifikasi
sekumpulan baris yang diambil (retrieved) dengan statement SELECT dari cursor.
Result table diproses seperti sebuah data set yang berurutan. Cursor harus
dibuka(dengan statement OPEN) sebelum baris lainnya di-retrieved. Statement FETCH
digunakan untuk me-retrieve baris terakhir cursor. FETCH dapat dijalankan berkali-kali
sampai semua baris di-retrieved. Ketika sudah sampai pada data terakhir, cursor harus ditutup
dengan statement CLOSE.
5.1 CONTOH DEKLARASI CURSOR
DECLARE c1 CURSOR FOR select * from staff;
DECLARE c1 CURSOR WITH HOLD
FOR select * form staff;
DECLARE c1 CURSOR
WITH RETURN TO CALLER
FOR select * from staff;
DECLARE c1 CURSOR
WITH RETURN TO CLIENT
FOR select * from staff;

Cursor yang dideklarasikan di dalam Store Procedure dapat diproses seperti halnya cursor
pada konvensional program.
24

WITH HOLD Mendeklarasikan cursor menggunakan WITH HOLD clause akan


menyebabkan cursor mempertahankan posisinya dan beberapa lock melewati
transaksi. Ketika cursor dideklarasikan dengan WITH HOLD, resource tidak
dibebaskan pada saat COMMIT. Jika cursor tidak dideklarasikan dengan WITH
HOLD clause, semua resource dibebaskan ketika COMMIT atau ROLLBACK.

WITH RETURN clause ini mengindikasikan bahwa cursor yang dideklarasikan


akan menghasilkan result set.

TO CALLER Merupakan default dan menetapkan bahwa cursor dapat


mengembalikan result set ke pemanggil. Cotohnya, jika pemanggil adalah Store
Procedure lain, result set dikembalikan ke store procedure tersebut. Jika pemanggil
adalah aplikasi client, result set dikembalikan ke aplikasi client. Result set dari
RETURN TO CALLER hanya tampak ke program yang terletak pada sebelum level
bersarang.

TO CLIENT Menetapkan bahwa cursor dapat mengembalikan result set ke


aplikasi client. Cursor ini tidak terlihat pada semua intermediate nested procedure.

TO CALLER clause dan TO CLIENT clause berarti hanya pada konteks nested
SQL procedure. Hanya saja row yang tidak terbaca dilewati. Contohnya, jika result
set dari cursor adalah 500 row, dan 150 dari row tersebut telah dibaca oleh procedure
ketika procedure diakhiri, row 151 sampai row 500 akan dikembalikan ke pemanggil
atau aplikasi.
5.1.1

Cursor dalam sebuah SQL Procededure

Cursor dapat didefinisikan di dalam stored procedure. Stored procedure


DB2ADMIN.Sample1 menerima satu input parameter, in_Dept. Sebuah cursor
cursor1 didefinisikan dan akan berisi sebuah barisdari table ORG dimana parameter
input sama dengan DEPRNUMB. Result set yang dikembalikan oleh stored procedure
akan berisi DEPTNUMB, MANAGER, dan LOCATION untuk DEPTNUMB yang
sama dengan parameter in_Dept.

25

CREATE PROCEDURE Sample1(


IN in_Dept INT
)
RESULT SETS 1
LANGUAGE SQL
-----------------------------------------------------------------SQL Stored Procedure -------------------------------------------------------------------------------------------------------P1: BEGIN
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT DEPTNAME, MANAGER, LOCATION FROM ORG
WHERE DEPTNUMB = in_Dept;
---OPEN cursor1;
END P1

5.1.2

Contoh Cursor
CREATE PROCEDURE Cur_Samp (
IN v_name VARCHAR(254),
OUT v_job VARCHAR(5)
)
LANGUAGE SQL
P1: BEGIN
DECLARE c1 CURSOR FOR
SELECT JOB FROM STAFF
WHERE NAME = v_name;
OPEN c1;
FETCH c1 INTO v_job;
END P1

Contoh di atas merupakan stored procedure yang mendeklarasikan local


cursor. Karena tidak ditentukan dengan WITH RETURN, cursor akan ditutup
oleh database manager ketika store procedure selesai. Tanpa kode tambahan pada
stored procedure, maka cursor tersebut tidak berguna.
Contoh cursor di atas merupakan local cursor karena tidak ada WITH
RETURN clause, dan tidak ada result set dibuat. Stored procedure tersebut
menggunakan FETCH untuk proses cursor pada select sebuah job untuk user
26

dengan nama tertentu, dan mengembalikan nilai dari job ke program yang
memanggil melalui parameter OUT.
5.2 POSITIONED DELETE
Cursors dapat digunakan untuk menghapus data pada posisi cursor saat itu selama cursor
deletable. Sebuah cursor dinyatakan deletable ketika :

Setiap FROM clause dari outer fullselect me-refer hanya pada satu table.

Outer fullselect tidak mengandung VALUES, GROUP BY, atau HAVING clause dan
tidak mengandung fungsi kolom.

Daftar select pada outer fullselect tidak mengandung DISTINCT.

Select statement tidak mengandung ORDER BY atau FOR READ ONLY clause.
Cursor didefinisikan secara statis, atau terdapat FOR UPDATE clause.
Ketika cursor dideklarasikan dapat dispesifikasikan operasi jenis apa yang akan
dilakukan. Jika tidak menyediakan spesifikasi serupa, cursor di refer sebagai ambigu,
dan DB2 hanya akan menyediakan optimisasi minor. Menentukan type cursor dengan
menyediakan FOR READ ONLY atau FOR UPDATE clause dalam SELECT statement
pada cursor.
CREATE PROCEDURE pos_del()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE v_DEPTNUMB SMALLINT;
DECLARE v_DEPTNAME VARCHAR(14);
DECLARE v_LOCATION VARCHAR(13);
DECLARE cursor1 CURSOR FOR
SELECT DEPTNUMB, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;-OPEN cursor1;-FETCH FROM cursor1 INTO v_DEPTNUMB, V_DEPTNAME,
v_LOCATION;
DELETE FROM DB2ADMIN.ORG
WHERE CURRENT OF cursor1;
CLOSE cursor1;
END P1

5.3 POSITIONED UPDATE


Dalam sebuah positioned update, cursor harus updatable. cursor updatable jika semua
pernyataan berikut benar :
27

Cursor merupakan deletable.


Kolom yang diupdate berubah pada kolom pada table asal

Semua kolom yang diupdate harus ditentukan secara explisit atau implisit dalam FOR
UPDATE clause.
CREATE PROCEDURE pos_upd()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE v_DEPTNUMB SMALLINT;
DECLARE v_DEPTNAME VARCHAR(14);
DECLARE v_LOCATION VARCHAR(13);
DECLARE cursor1 CURSOR FOR
SELECT DEPTNUMB, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE OF DEPTNAME;-OPEN cursor1;
FETCH FROM cursor1 INTO v_DEPTNUMB, V_DEPTNAME,
v_LOCATION;
UPDATE ORG SET DEPTNAME = 'NEW NAME'
WHERE CURRENT OF cursor1;
END P1

5.4 MENGGUNAKAN PROSES CURSOR UNTUK MENGEMBALIKAN MULTIPLE


RESULT SETS
Stored procedures dibuat untuk mengembalikan multiple result sets pada aplikasi client
(pemanggil) memerlukan :
Adanya DYNAMIC RESULT SETS clause pada CREATE PROCEDURE
statement.
Mendeklarasikan cursor untuk setiap result set dengan RETURN.
Meninggalkan semua cursor terbuka untuk mengambalikan result set ke aplikasi client
(pemanggil).

28

CREATE PROCEDURE MULTIPLE_RESULTS ( )


DYNAMIC RESULT SETS 2
-------------------------------------------------------------------------SQL Stored Procedure ----------------------------------------------------------------------------------------------P1: BEGIN
--Declare cursors1
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT DEPTNAME
FROM ORG;
--Declare cursors2
DECLARE cursor2 CURSOR WITH RETURN FOR
SELECT DISTINCT DIVISION
FROM ORG;
--Cursor left open for client application
OPEN cursor1;
--Cursor left open for client application
OPEN cursor2;
END P1

5.5 CURSOR MEMPENGARUHI LOCKING


Lock Modes:

S(Share) Lock

Rows, tables
o Pemilik dan aplikasi yang bersamaan dapat membaca, tidak meng-update.

U(Update) Lock

Rows, tables
o Pemilik dapat meng-update. Aplikasi yang bersamaan dapat membaca
data dalam objek yang dikunci, tidak meng-update.

X(Exclusive) Lock

Rows, tables
29

o Pemilik dapat membaca dan meng-update. Aplikasi uncommitted read


yang bersamaan dapat membaca data dalam objek yang terkunci.
Cursor dalam stored procedure dapat mempengaruhi aplikasi lain yang mengakses objek
yang sama. Ketika table diakses, DB2 meletakkan lock pada table dan/atau row. Lock
merubah keadaan dari yang akan mencegah siapapun membaca data dalam table untuk
sebuah row lock terakhir selama membaca row tersebut. Type lock yang digunakan DB2
bergantung pada type cursor yang digunakan dan DB2 isolation level.
5.6 ISOLATION LEVEL

Uncommitted Read (UR)


Dirty Read: Mengabaikan semua kunci pada baris dan table, mengijinkan aplikasi
untuk membaca uncommitted data.

Cursor Stability (CS)


Default (maximum concurrency): Menjaga current row dari pembacaan atau update
dari perubahan oleh aplikasi lain.

Read Stability (RS)


RS isolation mengijinkan aplikasi untuk membaca pages yang sama atau baris lebih
dari satu kali ketika mencegah proses lain dari mengubah row.

Repeatable Read (RR)


Baris yang di-refer sebuah aplikasi tidak dapat diupdate oleh aplikasi lain sebelum
aplikasi tersebut mencapai commit poin.

30

LATIHAN
1. Buatlah tabel pegawai yang memiliki struktur seperti tabel employee. kemudian buat
prosedur dengan nama multiple_4digitnimbelakang dengan ketentuan :

prosedur terdiri dari 2 result sets

buat cursor untuk memasukkan data dari tabel employee ke tabel pegawai
(gunakan perulangan while atau loop)

result set 1 menampilkan pesan berhasil insert

result set 2 menampilkan semua data pegawai

2. Buatlah prosedur yang berfungsi untuk mengupdate salary pegawai tertentu dengan
menggunakan cursor kemudian tampilkan hasilnya dengan multiple result sets

31

BAB VI CONDITION HANDLING DAN TRANSACTION


MANAGEMENT
TUJUAN BELAJAR :
-Memahami penggunaan Condition Handler
-Mengeluarkan pesan sukses atau gagal pada suatu SQL statement
-Membedakan SQLSTATE dan SQLCODE
-Memahami transaksi dalam database
-Memahami pengertian commit dan rollback
-Memahami penggunaan savepoint

6.1 SQLSTATE DAN SQLCODE


SQLSTATE dan SQLCODE merupakan kode - kode yang menyimpan status penjelasan
dari proses sebuah statement SQL yang dijalankan. Bila menggunakan SQLSTATE dan
SQLCODE, kita harus secara eksplisit menyatakannya dalam stored procedure.
SQLSTATE dan SQLCODE adalah nama variabel yang telah disediakan dan
hanya dapat dideklarasikan pada awal stored procedure.

SQLSTATE adalah lima digit numeric string.


dinyatakan dalam 5 digit char dalam array yang menyatakan kondisi error dan
warning. 2 karakter awal menyatakan kondisi umum class dan 3 karakter terakhir
menyatakan kondisi umum dari subclass.
class code 00 = statement yang dijalankan lengkap, berhasil, dan selesai.
class code 01 = statement yang dijalankan mendapat peringatan/warning.
class code 02 = tidak ada data.

SQLCODE adalah code status dengan tipe integer.


- menunjukkan statement yang dijalankan tidak berhasil (ada error)
+ menunjukkan statement yang dijalankan berhasil tetapi memiliki warning
0 menunjukkan statement yang dijalankan berhasil tetapi tanpa warning
100 menunjukkan bahwa data tidak ditemukan

32

Contoh pendeklarasiannya :
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INTEGER DEFAULT 0;
6.2 Condition Handling
Dalam pemanggilan SQL Procedural Language stored procedure pemanggilan aplikasi logic
akan menjadi simple jika kita menerapkan condition handling, dimana dengan condition
handling ini maka kita dapat memberikan kemungkinan kemungkinan kegagalan yang ada
dalam Stored procedure kita.
Ada 3 tipe Condition Handler:

CONTINUE
Dilakukan setelah SQL-Procedure-Statement selesai, eksekusi akan dilanjutkan pada
statement selanjutnya jika statement yang ada menyebabkan error.
EXIT
Dilakukan setelah SQL-Procedure-Statement selesai, eksekusi akan dilanjutkan ke akhir dari
Composund Statement yang berisi handlers.
UNDO
Dijalankan setelah SQL-procedure-Statements dieksekusi, DB2 men-Roll Back setiap operasi
SQL yang terdapat di dalam Compound Statement yang berisi Handler ini. Sesudah SQLprocedure-statement selesai, eksekusi dilanjutkan di akhir dari compound statement yang
berisi handler. Kita hanya bisa mendeklarasikan UNDO handler di ATOMIC compound
Statements.

DB2 menyediakan 3 kondisi umum:


NOT FOUND
Mengidentifikasi setiap kondisi yang hasilnya di SQLCODE +100 atau SQLSTATE yang
dimulai dengan Karakter 02000,
SQLEXCEPTION
Mengidentifikasi setiap kondisi yang hasilnya adalah NEGATIVE SQLCODE
SQLWARNING
Mengidentifikasi setiap kondisi yang hasilnya warning condition atau hasilnya Positif
SQLCODE return selain +100.
33

Kita juga dapat mendeklarasikan statement untuk menetukan kondisi spesifik SQLSTATE
kita sendiri.
Kita dapat menggunakan Single SQL Procedure untuk mendifinisikan perilaku dari condition
handler. DB2 menerima compunds statement yang dipisahkan oleh block BEGIN - END
sebagai sebuah single SQL Procedure Statements

Sintaks sederhananya :

DECLARE

handler-type

HANDLER

FOR

condition

SQL-

procedurestatement
CONTOH:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end = 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
SELECT SQLSTATE, SQLCODE INTO
v_SQLSTATE, v_SQLCODE FROM
SYSIBM.SYSDUMMY1;
DECLARE NO_TABLE CONDITION FOR SQLSTATE '42704';
A: BEGIN ATOMIC
DECLARE UNDO HANDLER FOR NO_TABLE

34

Contoh penerapan dalam store procedure:


CREATE OR REPLACE PROCEDURE
VARCHAR(1000))
DYNAMIC RESULT SETS 1

DEL_EMPLOYEE(IN v_VEMPNO CHAR(6),OUT MSG

BEGIN
DECLARE
DECLARE
DECLARE
DECLARE

SQLSTATE CHAR(5)DEFAULT '00000' ;


MYQUERY VARCHAR(1000);
ERRSTATE CHAR(5) DEFAULT '00000';
CUR CURSOR WITH RETURN FOR A;

DECLARE CONTINUE HANDLER FOR NOT FOUND


SET ERRSTATE=SQLSTATE;
DECLARE CONTINUE HANDLER FOR SQLWARNING
SET ERRSTATE=SQLSTATE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET ERRSTATE=SQLSTATE;
BEGIN
DELETE FROM EMPLOYEE WHERE EMPNO = v_VEMPNO;
IF(ERRSTATE = '00000') THEN
SET MSG = 'DATA BERHASIL DIHAPUS';
ELSEIF(ERRSTATE = '02000') THEN
SET MSG = 'DATA NOT FOUND';
ELSEIF(ERRSTATE = '23001') THEN
SET MSG = 'DATA GAGAL DIHAPUS KARENA PARENT ROW DARI SUATU RELASI';
END IF;
END;
END

6.3 Transaction Management


Transaksi dalam database adalah suatu kondisi dimana kita menggunakan perintah COMMIT
atau ROLLBACK dalam printah perintah Query yang telah kita lakukan. Commit adalah
perintah yang membuat dimana perintah Query yang dilakukan dinyatakan mutlak dan tidak
bisa diundo atau dikembalikan ke kondisi sebelum commit. Sedangkan rollback adalah
suatu perintah yang dapat mengembalikan kondisi sebelum commit dilakukan kecuali
rollback ini tidak dapat dilakukan ketika kita telah melakukan proses delete dan drop.
Savepoint adalah suatu perintah dimana kita dapat melakukan suatu penyimpanan sementara
di tengah tengah beberapa Query yang sedang kita lakukan.

35

Contoh:

CREATE TABLE DEPARTMENT (


DEPTNO
CHAR(6),
DEPTNAME VARCHAR(20),
MGRNO
INTEGER)
INSERT INTO DEPARTMENT VALUES ('A20', 'MARKETING', 301)
SAVEPOINT SAVEPOINT1 ON ROLLBACK RETAIN CURSORS
INSERT INTO DEPARTMENT VALUES ('B30', 'FINANCE', 520)
SAVEPOINT SAVEPOINT2 ON ROLLBACK RETAIN CURSORS
INSERT INTO DEPARTMENT VALUES ('C40', 'IT SUPPORT', 430)
SAVEPOINT SAVEPOINT3 ON ROLLBACK RETAIN CURSORS
INSERT INTO DEPARTMENT VALUES ('R50', 'RESEARCH', 150)

Setelah kita melakukan Query diatas maka data 'A20', 'B30', 'C40', dan 'R50' sudah tersimpan
di table Department, kemudian kita lakukan perintah dibawah ini:
ROLLBACK TO SAVEPOINT SAVEPOINT3
Maka baris dengan DEPTNO R50 sudah tidak ada di table Department, kemudian missal kita
lakukan perintah dibawah ini :
ROLLBACK TO SAVEPOINT SAVEPOINT1
Maka table Department tetap ada hanya saja data yang tersisa hanyalah baris dengan
DEPTNO 'A20'.

36

LATIHAN:
1. Buatlah sebuah table DEPT_TEMP dengan struktur DEPTNO CHAR(6), DEPTNAME
VARCHAR(100), MGRNO

INTEGER !

2. Buat table DEPT_TEMP2 yang memiliki struktur yang sama dengan DEPT_TEMP
dan alter colom DEPTNO menjadi primary key.
3. Copy semua data deptno,deptname,mgrno dari table department di sample ke
DEPT_TEMP.
4.

copy baris sesuai dengan 1 digit nim terakhir kalian pada table DEPT_TEMP

5. Buat sebuah Procedure yang berfungsi untuk memasukkan data dari table
DEPT_TEMP ke DEPT_TEMP2 dengan syarat beri pesan error ketika smua data
gagal dipindahkan dan beri pesan sukses ketika semua data berhasil dipindahkan. Beri
mekanisme savepoint sehingga ketika pada baris data gagal dimasukkan maka harus
keluar dari procedure.
6. Buat sebuah demo bagaimana agar data berhasil dipindahkan semua dan
mengeluarkan pesan sukses.

37

BAB VII DYNAMIC SQL


TUJUAN BELAJAR :
- Menjelaskan tentang dynamic sql
- Mengetahui mengapa menggunakan dynamic sql
- Mengetahui keuntungan menggunakan dynamic sql
- Menggunakan dynamic sql

7.1 DYNAMIC SQL


Sebuah statement SQL dinamis dibangun saat runtime, sedangkan SQL statis
pada saat kompilasi program. SQL dinamis dapat digunakan hanya jika memang
diperlukan karena SQL dinamis bersifat lebih kompleks dan kurang efisien dibanding
SQL statis. Keuntungan SQL dinamis adalah memungkinkan untuk membuat
statement lebih berguna karena bersifat lebih general. SQL dinamis akan berguna saat
dihadapkan

pada

sebuah

keadaan

membangun

statement

SQL

berdasarkan input pengguna.


Dynamic SQL dapat digunakan dalam situasi sebagai berikut:

Eksekusi sebuah perintah data definition SQL (seperti CREATE), sebuah


perintah data control (seperti GRANT), atau sebuah perintah session control
(seperti ALTER SESSION). Di dalam PL/SQL, perintah-perintah seperti itu
tidak dapat dieksekusi secara statis.

Meningkatkan fleksibilitas. Sebagai contoh, menangguhkan pilihan schema


objects hingga saat runtime. Atau, program ingin membangun kondisi-kondisi
pencarian yang berbeda untuk klausa WHERE dari sebuah perintah SELECT.
Sebuah program yang lebih kompleks mungkin memilih dari berbagai macam
operasi-operasi SQL, klausa, dan sebagainya.

Kita menggunakan package DBMS_SQL untuk mengeksekusi perintahperintah SQL, namun kita menginginkan performa yang lebih baik, sesuatu
yang lebih mudah digunakan, atau fungsionalitas yang merupakan kekurangan
dari DBMS_SQL seperti dukungan untuk objects dan collections.
DB2 universal database memberikan statement berikut pada sql procedures

38

single execute:
PREPARE
EXECUTE
multiple times execute :
EXECUTE IMMEDIATE
7.1.1

Contoh dynamic sql single execute


CREATE PROCEDURE single_dyn ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE v_stmt VARCHAR(256);
SET v_stmt = 'UPDATE backup_emp SET salary = salary *
1.1 WHERE empno = ?';--(1)
PREPARE s1 FROM v_stmt;--(2)
FOR each_department AS
c1 CURSOR FOR
SELECT mgrno FROM department WHERE mgrno IS
NOT NULL
DO
EXECUTE s1 USING mgrno; --(3)
END FOR;
END P1

Pada variable stmt di-set untuk string yang mewakili pernyataan SQL :
1. Tanda tanya disebut penanda parameter dan merupakan nilai yang akan
diganti pada waktu eksekusi.
2. Pernyataan ini disiapkan untuk eksekusi.
3. Pernyataan yang disiapkan di no 2 dijalankan, dan mengganti penanda
parameter dengan isi mgrno variabel.

39

CREATE OR REPLACE PROCEDURE GET_DEPARTMENT (


IN IN_DEPTNO ANCHOR DEPARTMENT.DEPTNO,
IN IN_DEPTNAME ANCHOR DEPARTMENT.DEPTNAME
)
DYNAMIC RESULT SETS 1
BEGIN
DECLARE V_STMT VARCHAR(150);
DECLARE ERRSTATE CHAR(5);
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE C_RESULT CURSOR WITH RETURN FOR EXECQUERY;
DECLARE CONTINUE HANDLER FOR NOT FOUND, SQLWARNING,
SQLEXCEPTION
SET ERRSTATE = SQLSTATE;
SET V_STMT = 'SELECT * FROM DEPARTMENT WHERE 1=1';
IF (IN_DEPTNO<>'all') THEN
SET V_STMT= V_STMT || ' AND DEPTNO=''' || IN_DEPTNO
|| '''';
END IF;
IF (IN_DEPTNAME<>'all') THEN
SET V_STMT= V_STMT || ' AND DEPTNAME=''' ||
IN_DEPTNAME || '''';
END IF;
PREPARE EXECQUERY FROM V_STMT;
EXECUTE EXECQUERY;
OPEN C_RESULT;
END

Store procedure di atas memanfaatkan keuntungan store procedure untuk


meningkatkan fleksibilitas. Statement dibangun secara dinamis saat program
berjalan.
7.1.2

Contoh dynamic sql multiple execute


CREATE OR REPLACE PROCEDURE UPD_BACKUP (
IN IN_EMPNO ANCHOR BACKUP_EMP.EMPNO,
IN IN_FIRSTNME ANCHOR BACKUP_EMP.FIRSTNME
)
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE V_STMT VARCHAR(150);
SET V_STMT = 'UPDATE BACKUP_EMP SET FIRSTNME = ''' ||
IN_FIRSTNME || ''' WHERE EMPNO = ''' || IN_EMPNO || '''';--(1)
EXECUTE IMMEDIATE V_STMT;--(2)
END P1

40

Pada variable v_stmt di-set untuk string yang mewakili pernyataan SQL :
1. Set string v_stmt dengan inpuan dari variable in_firstnme untuk kolom
firstnme dan variable in_empno untuk kolom empno.
2. Eksekusi string v_stmt dengan execute immediate. Execute immediate
menggabungkan fungsi dasar dari PREPARE dan pernyataan EXECUTE. Hal
ini dapat digunakan untuk mempersiapkan dan menjalankan pernyataan SQL
yang tidak mengandung host variabel atau parameter markers.

condition handling dan dynamic sql pada store procedure:


CREATE OR REPLACE PROCEDURE
DYNAMIC RESULT SETS 1

DEL_EMPLOYEE(IN v_VEMPNO CHAR(6))

BEGIN
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE

SQLSTATE CHAR(5)DEFAULT '00000' ;


MSG VARCHAR(1000);
MYQUERY VARCHAR(1000);
ERRSTATE CHAR(5) DEFAULT '00000';
CUR CURSOR WITH RETURN FOR A;

DECLARE CONTINUE HANDLER FOR NOT FOUND


SET ERRSTATE=SQLSTATE;
DECLARE CONTINUE HANDLER FOR SQLWARNING
SET ERRSTATE=SQLSTATE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET ERRSTATE=SQLSTATE;
BEGIN
DELETE FROM EMPLOYEE WHERE EMPNO = v_VEMPNO;
IF(ERRSTATE = '00000') THEN
SET MSG = 'DATA BERHASIL DIHAPUS';
ELSEIF(ERRSTATE = '02000') THEN
SET MSG = 'DATA NOT FOUND';
ELSEIF(ERRSTATE = '23001') THEN
SET MSG = 'DATA GAGAL DIHAPUS KARENA PARENT ROW DARI SUATU RELASI';
END IF;
SET MYQUERY = 'SELECT ''' CONCAT MSG CONCAT ''' AS PESAN FROM SYSIBM.DUAL';
PREPARE A FROM MYQUERY;
OPEN CUR;
END;
END@

41

LATIHAN
1. Seorang pengembang aplikasi ingin meletakkan suatu proses bisnis logika input dan
update suatu tabel menggunakan store procedure. Pengembang tersebut menginginkan
sebuah store procedure untuk input dan update data employee pada database sample.
Penentuan proses input atau update ini secara otomatis dilakukan oleh program, jika
key yang diinput sudah ada maka program melakukan proses update. Begitu pula
sebaliknya jika key belum ada maka program melakukan insert. Pengembang tersebut
juga menginginkan output dari store procedure berupa result set yang berisi kode error
(SQLSTATE) dan pesan berhasil atau gagal. Buatlah store procedure yang diinginkan
pengembang aplikasi tersebut!

2. Pengembang aplikasi ingin melakukan pencarian untuk mendapatkan data employee


dan departemen disertai manager dari employee tersebut. Pencarian dapat dilakukan
dengan parameter id employee, nama employee, dan nama department. Jika parameter
tersebut (bisa salah satu parameter) diisi dengan all berarti semua data dengan
parameter yang dimaksud masuk dalam pencarian. Buatlah store procedure tersebut!

42

BAB VIII NESTED SQL PROCEDURE


TUJUAN BELAJAR :
-Dapat mendeskripsikan dan menjelaskan nested stored procedure
-Mengembalikan dan menerima result sets dalam nested SQL procedures
-Membuat SQL procedure rekursif

8.1 PEMANGGILAN SQL PROCEDURE


Sebelum masuk nested SQL procedure ada baiknya kita mereview bagaimana SQL procedure
dipanggil dan digunakan. Adapun syntax yang digunakan adalah:

Syntax diatas dapat digunakan di aplikasi atau pad dynamic SQL yang dapat di prepare
secara dinamis.
Procedure Name menspesifikasikan nama prosedur yang akan dipanggil. Nama procedure
tersebut harulah yang sudah terdaftar di catalog dengan kata lain ssudah dibuat.
Parameter Name adalah nama parameter argumen mana yang akan diisi. Ketika satu
argumen diisi menggunakan parameter name maka argument lainnya juga harus diisi
menggunakan parameter name.
CREATE PROCEDURE P1(x INT, y DEFAULT 1);
CALL P1(10);
CALL P1(10, DEFAULT);
CALL P1(x => 100, y => 20);
Semua nama parameter yang digunakan haruslah didefinisikan satu kali (secara implisit atau
eksplisi) pada pembuatan stored procedure.
Procedure dapat memanggil procedure yang lain maksimal sampai 16 level untuk
meningkatkan performa, keamanan atau modularisasi kode.
Procedure dapat diidentifikasi berdasarkan schemanya, namanya dan jumlah parameternya.
43

CREATE PROCEDURE SCHEMA1.P2();


CREATE PROCEDURE SCHEMA2.P2();
CREATE PROCEDURE SCHEMA2.P2(x INT);
Contoh diatas akan membuat 3 procedure yang berbeda.
8.2 DASAR NESTED SQL PROCEDURE
CREATE PROCEDURE count_projects (IN P_empno CHAR(6), OUT p_total
INT)
LANGUAGE SQL
BEGIN
-- Procedure Logic
SELECT COUNT (*) INTO p_total
FROM emp_act
WHERE empno = p_empno;
END@

CREATE PROCEDURE bonus (IN p_empno CHAR(6), OUT p_bonus CHAR(1))


LANGUAGE SQL
BEGIN
-- Declare variables
DECLARE v_min INT DEFAULT 5;
DECLARE v_total INT DEFAULT 0;
-- Procedure logic
CALL count_projects(p_empno, v_total);
IF (v_total >= v_min) THEN
SET p_bonus = Y;
ELSE
SET p_bonus = N;
END IF;
END@

Pada procedure bonus terdapat sintak pemanggilan procedure count project, yaitu
CALL

count_projects(p_empno,

v_total);

dimana p_empno merupakan


44

parameter in dan v_total merupakan parameter out pada procedure count_projects. Pada
procedure bonus v_total menampung result dari pemanggilan procedure count_project,
karena merupakan parameter out pada procedure count_projects, sehingga proses selanjutnya
dapat menggunakan result dari pemanggilan procedure count_projects menggunakan variable
v_total.

8.3 LOCATOR VARIABLE


Sebuah prosedur yang dipanggil dapat mengembalikan nol atau beberapa result sets. Ketika
sebuah prosedur yang dipanggil mengembalikan resultsets, prosedur yang memanggil harus
mendefinisikan satu variabel locator untuk tiap result sets yang dikembalikan.
Contoh Pendeklarasian :
CREATE PROCEDURE CALLING_PROC
(IN inParm SMALLINT, OUT outParm DOUBLE)
LANGUAGE SQL
BEGIN
DECLARE loc1, loc2 RESULT_SET_LOCATOR VARYING;

Jika prosedur dipanggil berulang kali dalam pemanggil yang sama, maka resultset yang
tersedia adalah result set dari pemanggilan terakhir.
Setelah variabel locator didefinisikan selanjutnya adalah mengasosiasikan atau memasangkan
(mengisi variabel locator dengan resultset dari prosedur yang dipanggil). Hal tersebut dapat
dilakukan dengan syntax ASSOCIATE. Contoh:
CALL CALLED_PROC ;
ASSOCIATE RESULT SET LOCATORS (loc1, loc2)
WITH PROCEDURE CALLED_PROC;

Contoh diatas akan memanggil procedur CALLED_PROC kemudian mengecek SQLCODE


yang dikembalikan. Jika

SQLCODE

yang dikembalikan +466,

berarti

prosedur

mengembalikan result sets. Syntax ASSOCIATE akan menghubungkan variabel locator


dengan result sets yang dikembalikan. Jika jumlah variabel locator yang dispesifikasikan
lebih banyak daripada result set yang dikembalikan maka kelebihan locator akan di Ignore.
Seperti pada bab sebelumnya untuk bisa memanipulasi data yang ada pada result set maka
kita harus menggunakan CURSOR. Hal yang sama juga berlakuk pada NESTED

45

PROCEDURE. Untuk itu kita perlu mengalokasikan cursor untuk setiap variabel locator. Hal
ini dapat dilakukan dengan syntax ALLOCATE.

Contoh:
ALLOCATE C1 CURSOR FOR RESULT SET loc1;
ALLOCATE C2 CURSOR FOR RESULT SET loc2;

Satu ALLOCATE statement untuk memproses setiap result set. Nama cursor dapat berbeda
dengan nama cursor yang ada di stored procedure.
Adapun aturan yang harus diperhatikan saat menggunakan allocate cursor antara lain:

Allocate Cursor tidak bisa dibuka dengan perintah Open (SQLSTATE 24502).

Allocate Cursor dapat ditutup dengan perintah Close. Menutup allocate cursor akan
menutup cursor yang berasosiasi dengannya di stored procedure.

Hanya satu cursor yang dapat dialokasikan untuk setiap result set.

Allocate Cursor akan terus terbuka sampa terjadi operasi rollback, ditutup secara
implisit dan ditutup secara explisit.

Operasi commit

akan menutup allocate cursor yang tidak didefinisikan dengan

perintah HOLD dalam stored procedure.


Setelah cursor teralokasikan maka kita dapat memanipulasi data yang ada didalamnya salah
satunya kita dapat mendapatkan data tiap-tiap barisnya dengan perintah FETCH. Contoh:
FETCH C1 INTO var1;
FETCH C2 INTO var2;

Perintah FETCH pada nested procedure sama dengan perintah FETCH pada bab-bab
sebelumnya.
Setelah kita memanipulasi data pada result set maka kita dapat mengakhirinya dengan
menutup cursor. Walaupun pada setiap akhir proses semua cursor yang terbuka akan
otomatis ditutup, namun adalah lebih baik jika segera menutup cursor saat cursor tersebut
tidak lagi dibutuhkan. Karena cursor yang terbuka akan mempengaruhi data availability di
database.

46

8.4 CONTOH NESTED SQL PROCEDURE


Procedure 1 :
CREATE PROCEDURE PROC1 (IN v_dept CHAR(3))
DYNAMIC RESULT SETS 1
P1: BEGIN
-- Declare cursor
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT FIRSTNME, LASTNAME, WORKDEPT
FROM EMPLOYEE
WHERE WORKDEPT = v_dept;
-- Cursor left open for client application
OPEN cursor1;
END P1

Procedure 2 :
CREATE PROCEDURE proc2 ()
LANGUAGE SQL
SPECIFIC proc2
DYNAMIC RESULT SETS 1
-- procedure logic
p1: BEGIN
-- Procedure Logic
DECLARE v_workdept CHAR(3) DEFAULT C01;
DECLARE v_fname CHAR(15) DEFAULT ;
DECLARE v_lname CHAR(15) DEFAULT ;
DECLARE SQLSTATE CHAR(5) DEFAULT 00000;
DECLARE v_rs1 RESULT_SET_LOCATOR VARYING;
CALL proc1(v_workdept);
ASSOCIATE RESULT SET LOCATOR (v_rs1) WITH PROCEDURE
proc1;
ALLOCATE v_rs1cur CURSOR FOR RESULT SET v_rs1;
WHILE (SQLSTATE = 00000) DO
FETCH FROM v_rs1cur INTO v_fname, v_lname,
v_workdept;
END WHILE;
CLOSE v_rs1cur;
END p1

47

8.5 RECURSIVE
Sama seperti di pemrograman recursive adalah stored procedure yang memanggil dirinya
sendiri.

Sebetulnya

dapat

digantikan

dengan

penggunaan

LOOP

dan

maksimal

penggunaannya adalah 16 level. Contoh:

CREATE PROCEDURE managers (In p_deptno CHAR(3),


OUT p_report_chain VARCHAR(100))
LANGUAGE SQL
SPECIFIC managers
P1: BEGIN
DECLARE v_manager_name VARCHAR(15);
DECLARE v_admrdept CHAR(3);
DECLARE v_report_chain VARCHAR(100);
DECLARE v_stmt VARCHAR(100) DEFAULT CALL managers(?,?);
--Procedure logic
SELECT admrdept
INTO v_admrdept
FROM org
WHERE deptno=p_deptno;
SELECT lastname
INTO v_manager_name
FROM staff, org
WHERE empno = mgrno
AND deptno = p_deptno;

IF (v_manager_name IS NULL) THEN


SET v_manager_name = VACANT;
END IF;
IF (v_admrdept IS NULL) THEN
SET p_report_chain = Department || p_deptno ||
not found.; --(4)
ELSEIF (vadmrdept = p_deptno) THEN --(5)
SET p_report_chain = v_manager_name;
ELSE
PREPARE v_st from v_stmt; --(6)
EXECUTE v_st INTO v_report_chain using v_admrdept; --(7)
Set p_report_chain = v_manager_name || -> ||
v_report_chain;
END IF;
END P1

48

LATIHAN :
1. Buatlah tabel history yang terdiri dari kolom_a, kolom_b, kolom_c varchar(100)!
2. Buatlah tabel history2 yang kolomnya sama dengan history !
3. Buatlah stored procedure menusql dengan parameter in pilihan bertipe karakter,
didalam procedue tersebut terdapat kondisi yang memanggil procedure, antara lain :
a. insertemp untuk insert tabel history2 tanpa parameter, menggunakan loop dan
cursor jika sukses tampilkan insert data successed jika gagal insert data
failed
(employee_name(firstnme,lastname),nama_departemen (deptname) sex dari table
employee dan department)
b. viewtemp(table backup2) tanpa parameter dengan ketentuan data dari kolom
sex jika m diganti laki-laki dan f diganti perempuan( jika tidak ada data
maka tampilkan data not found, jika ada data maka tampilkan seluruh data
pada table backup)
jangan lupa beri screenshot untuk tampilan pesan !

49

BAB IX - USER DEFINED FUNCTION


TUJUAN BELAJAR :
-Memahami Definisi User Defined Function
-Memahami Dan Menerapkan Pembuatan User Defined Function
-Memahami Tipe-Tipe Dari User Defined Function

9.1 DEFINISI USER DEFINED FUNCTION


User Defined Function (UDF) merupakan sebuah database aplikasi objek yang
memungkinkan user untuk memperkaya fungsionalitas database manager dengan
menambahkan fungsi-fungsi baru dalam kumpulan built-in function.
Perbedaan mendasar antara function dan procedure adalah function harus
mengembalikan nilai tertentu kepada pemanggilnya. Nilai ini dikembalikan dengan
menggunakan sintaks RETURN. Perlu diketahui bahwa UDF memiliki batasan-batasan
yang tidak bisa menggantikan fungsi stored procedure karena secara fungsi stored
procedure lebih kuat dibandingkan dengan UDF. Namun UDF juga memiliki beberapa
keuntungan :
1. Dieksekusi dalam perintah SELECT
2. Dieksekusi dari berbagai bagian perintah SQL (WHERE/HAVING, CASE)
3. Output UDF (table functions) dapat digunakan sebagai Rowset dalam perintah
FROM
4. Dapat digunakan seperti view yang berparameter
Pembuatan UDF ini sangat berguna dalam proses pengolahan database, karena
dengan sekali pembuatan UDF, maka UDF tersebuta dapat digunakan untuk keperluan
yang sama pada blok-blok SQL lainnya, stored procedure, maupun pada function yang
lainnya.

9.2 PEMBUATAN USER DEFINED FUNCTION

9.2.1 CREATE UDF


Perintah umum untuk membuat sebuah function adalah sebagai berikut :

50

Sintaks:
CREATE [OR REPLACE] FUNCTION nama_function
[(argumen [IN|OUT|IN OUT] tipe_data,
argumen [IN|OUT|IN OUT]tipe_data,
...)]
RETURN tipe_data
BEGIN

RETURN ekspresi; //badan fungsi


END;

RETURN adalah nilai yang dikembalikan oleh function. Jika terdapat


RETURN dalam badan fungsi, maka itu berfungsi untuk mengembalikan kontrol
kepada pemanggil fungsi bersama nilai yang dikembalikan fungsi.
Dalam satu fungsi dimungkinkan penggunaan RETURN yang lebih dari satu
tetapi bila di dalam badan fungsi tidak terdapat pernyataan RETURN maka akan
terjadi error.

Contoh :
CREATE FUNCTION FUNCTION1( )
RETURNS INTEGER
BEGIN ATOMIC
RETURN SELECT sum(salary)
FROM STAFF;
END@

Contoh pemanggilan Fungsi :


VALUES FUNCTION1()@
--ATAU
SELECT DISTINCT FUNCTION1() FROM STAFF@

Hasil:

9.2.2 MODIFYING UDF


Pada bahasa pemrograman SQL pada DB2, UDF tidak dapat modifikasi
dengan menggunakan perintah ALTER. Saat memerlukan perrubahan pada UDF
yang telah dibuat, maka harus menghapus / drop function terlebih dahulu
kemudian membuatny ulang atau dengan cara membuatnya ulang dengan
menggunakan sintak CREATE OR REPLACE.
51

9.2.3 DROP UDF


Cara untuk menghapus function berdasarkan nama function dapat digunakan
sintak berikut :
Sintaks:
DROP FUNCTION nama_function;

Sedangkan jika terdapat function dimana function tersebut memiliki nama


yang sama tetapi mempunyai parameter berbeda (function ini disebut function
overloading), maka cara menghapus function berdasarkan nama fungsi dan
parameternya dapat menggunakan sintak berikut :
Sintaks:
DROP FUNCTION nama_function1(type_data);

Contoh:
DROP FUNCTION GET_TOTAL_SALARY(VARCHAR(10))@

9.3 TIPE-TIPE USER DEFINED FUNCTION


Berdasarkan

pada pengembalian nilai atau pengembalian nilai-nilai, UDF bisa

diklasifikasikan menjadi beberapa bagian, yaitu :

User defined scalar functions

User defined table functions

52

9.3.1 User defined scalar functions


Fungsi ini hanya me-return single value. Fungsi scalar ini tidak dapat mengubah
kondisi state dari database ( tidak dapat menggunakan query INSERT, UPDATE,
dan DELETE dalam function). Contoh fungsi scalar yang telah built-in adalah
SUM(), AVG(), DIGITS(), COALESCE(), dan SUBSTR().
Berikut adalah contoh penggunaan User defined scalar functions :
9.3.1.1

Pembuatan

Contoh :
CREATE OR REPLACE FUNCTION GET_TOTAL_SALARY
(
IN IN_EMPNO VARCHAR(10)
)
RETURNS DOUBLE
BEGIN ATOMIC
RETURN SELECT SALARY+BONUS+COMM
FROM EMPLOYEE
WHERE EMPNO = IN_EMPNO;
END@

9.3.1.2

Pemanggilan

Terdapat 2 cara pemanggilan pada fungsi scalar ini yaitu dengan menggunkan
merintah SELECT dan menggunakan perintah VALUES.
Contoh :
SELECT EMPNO, FIRSTNME, SALARY, BONUS, COMM,
GET_TOTAL_SALARY('000010') AS HASIL_FUNCTION
FROM EMPLOYEE
WHERE EMPNO = '000010'@

Atau:
VALUES GET_TOTAL_SALARY('000010')@

9.3.1.3

Hasil

Hasil pemanggilan fungsi diatas adalah sama (dengan menggunakan empno


000010) yaitu :

dan

53

9.3.2

User defined table functions


Fungsi ini mengembalikkan sejumlah baris nilai dalam format table (temporary
tabel) dan dapat mengubah state dari database (memungkinkan menggunakan
insert, update, delete) dalam function. Fungsi ini menggunakan clausa FROM
dalam

query.

Contoh

fungsi

tabel

yang

telah

built-in

adalah

SNAPSHOT_DYN_SQL() dan MQREADALL().


Berikut adalah contoh penggunaan User defined table functions :
9.3.2.1

Pembuatan

Contoh :
CREATE FUNCTION INS_RESULT
(
IN IN_EMPNO VARCHAR(10)
)
RETURNS TABLE
(
EMPNO CHAR(6),
FIRSTNME VARCHAR(12),
TOTAL_SALARY DOUBLE
)
F1: BEGIN ATOMIC
RETURN SELECT EMPNO, FIRSTNME, GET_TOTAL_SALARY(IN_EMPNO)
FROM EMPLOYEE
WHERE EMPNO = IN_EMPNO;
END@

9.3.2.2

Pemanggilan

Contoh :
SELECT T.EMPNO, T.FIRSTNME, TOTAL_SALARY, DEPTNAME
FROM TABLE(INS_RESULT('000010'))T, EMPLOYEE E, DEPARTMENT D
WHERE T.EMPNO = E.EMPNO AND
E.WORKDEPT = D.DEPTNO AND
T.EMPNO = '000010'@

9.3.2.3

Hasil

Hasil pemanggilan fungsi diatas (dengan menggunakan nama project account


programming) yaitu :

54

LATIHAN
1. Buat sebuah fungsi yang berfungsi untuk mengambil total penghasilan dari :
a. manager pada department tertentu, dengan menggunakan inputan
deptno.
b. employee, dengan menggunakan inputan empno.
2. Buat sebuah fungsi yang berfungsi untuk mendapatkan :
a. rata-rata penghasilan employee berdasarkan department yang dimiliki.
b. total penghasilan masing employee.
c. total penghasilan manager setiap departmentnya.
3. Buat sebuah fungsi yang berfungsi untuk mendapatkan empno, nama, masa
bekerja (berapa tahun), dan total penghasilan dari employee yang mempunyai
masa bekerja > masa kerja tertentu (inputan) dan salary > salary tertentu
(inputan). (menggunakan nested function)
4. Buat sebuah procedure yang berfungsi untuk mendapatkan deptno, nama
deptname, salary manager, dan rata-rata salary dari department yang memiliki
salary manager lebih kecil atau sama dengan rata-rata salary department
tersebut. Menggunakan fungsi yang telah dibuat.

55

BAB X MODULE
TUJUAN BELAJAR :
Membuat, menghapus, dan alter module

10.1 MODULE
MODULE adalah rangkaian objek-objek yang terkait satu dengan lainnya seperti SP
(Stored Procedure), UDF (User-Defined Function), variable global dan cursor, type,
condition. Modul terutama digunakan untuk mendefinisikan objek grup bersama-sama
yang memiliki tujuan penggunaan umum. Module mengekspor tipe, Stored Procedure,
dan User-Defined Function.
a. Membuat modul.
CREATE MODULE inventory;
Statement diatas digunakan untuk membuat Module dengan nama inventory.

b. Mengalter modul.
ALTER MODULE inventory PUBLISH
TYPE myRowTyp AS ANCHOR ROW myTab;
Mengubah module myMode dengan menambahkan TYPE dengan nama myRowTyp.
ALTER MODULE inventory PUBLISH
FUNCTION myFunc (val1 ANCHOR myTab.col1)
RETURNS myRowTyp;
Mengubah module myMode dengan menambahkan FUNCTION dengan nama
myFunc.
ALTER MODULE inventory PUBLISH
PROCEDURE myProc (OUT parm1 ANCHOR myTab.col2);
Mengubah module myMode dengan menambahkan PROCEDURE dengan nama
myProc.

Berikut ini adalah contoh lain dari alter module:


ALTER MODULE inventory
PUBLISH PROCEDURE p(IN c1 INT, IN c2 INT, IN c3 CHAR) @

56

ALTER MODULE inventory


PUBLISH PROCEDURE q(IN c1 INT, IN c2 VARCHAR(8))@
ALTER MODULE inventory
ADD PROCEDURE p(IN c1 INT, IN c2 INT, IN c3 CHAR)
LANGUAGE SQL
BEGIN
IF c1 > 10 THEN
CALL q(1, 'hello')
ELSE IF c2 > 5 THEN
SET c3 = CHAR(c2);
END IF;
END@
ALTER MODULE inventory
ADD PROCEDURE r(c1 INT, c2 INT, c3 CHAR)
LANGUAGE SQL
BEGIN
CALL q(1, 'hello');
END@

c. Menghapus module maupun isi module.


DROP MODULE inventory;
Menghapus module myMod beserta isinya.
ALTER MODULE inventory DROP BODY;
Menghapus hanya isi dari module myMod namun modulenya masih tetap ada.
ALTER MODULE inventory DROP PROCEDURE myProc;
Menghapus objek procedure dengan myProc di dalam module myMod.

d. Memberi hak.
GRANT EXECUTE ON MODULE myMod TO Joe;
Memberi hak untuk mengakses module myMode kepada Joe.

e. Memanggil suatu procedure dalam module.


CALL (inventory.p(1, 2, 3)

Memanggil procedure p yang ada di dalam inventory dengan memasukkan parameter


tiga input yang dibutuhkan procedure tersebut.
57

LATIHAN
1. Buatlah sebuah modul dengan nama mod_4DigitNimBelakang.
2. Buat sebuah tabel MHS_4DigitNimBelakang yang berisi kolom NIM Varchar (16).
3. Buat sebuah stored procedure dengan nama gen_4DigitNimBelakang yang berfungsi
sebagai suatu generator nim dengan ketentuan:
a. Bagian depan nim adalah 11506100
b. Angka selanjutnya diisi berdasar seleksi masuk (reguler = 0, PSB = 1, dan SPMK
= 7)
c. Angka selanjutnya adalah 111
d. Angka berikutnya secara otomatis bertambah berdasar berapa banyak nim yang
mau dibuat
e. Masukkan stored procedure ini dalam module yang sudah anda buat
4. Buat sebuah fungsi tabel dengan nama table_4DigitNimBelakang di dalam modul
yang sudah dibuat berisikan EMPID, FIRSTNME, dan SALARY dari tabel
EMPLOYEE.
5. Buat sebuah stored procedure dengan nama emp_4DigitNimBelakang menampilkan
data dari pemanggilan fungsi table_4DigitNimBelakang beserta DEPTNAME-nya.
Kemudian masukkan dalam module.
6. Panggil dua prosedur yang telah anda buat.

58

BAB XI TRIGGER
TUJUAN BELAJAR :
-Setelah mempelajari materi dalam bab ini, mahasiswa diharapkan mampu :
-Menjelaskan tentang trigger
-Mengetahui mengapa menggunakan trigger
-Mengetahui keuntungan menggunakan trigger
-Menggunakan trigger

11.1 TRIGGER
Trigger merupakan database objek yang didefinisikan pada sebuah table dan
diaktifkan ketika operasi INSERT, UPDATE, atau DELETE dilakukan. Trigger
diaktifkan secara otomatis. Operasi yang menyebabkan trigger aktif disebut triggering
SQL statement.

Prototype trigger
CREATE TRIGGER [nome trigger] [activation time][trigger event]
ON [subject table]
REFERENCING [object] AS [name] [granularity]
MODE DB2SQL
WHEN [condition]
BEGIN ATOMIC
[triggered action ]
END

Tipe trigger
o BEFORE
Diaktifkan sebelum INSERT, UPDATE atau DELETE.
o

AFTER
Diaktifkan setelah triggering SQL statement dieksekusi dengan sukses.

INSTEAD OF
-

Didefinisikan di dalam VIEW.

Didefinsikan secara logical dalam trigger yang dieksekusi dalam


triggering SQL statement.
59

11.1.1 Contoh BEFORE trigger

Sebelumnya :
CREATE TABLE BACKUP_EMP LIKE EMPLOYEE
CREATE TRIGGER in_backup_emp
NO CASCADE BEFORE INSERT ON backup_emp
REFERENCING NEW AS n
FOR EACH ROW
MODE DB2SQL
WHEN (n.salary IS NULL)
SET n.salary = 50000

11.1.2 Contoh AFTER trigger

Sebelumnya :
CREATE

TABLE

audit

(mytimestamp

timestamp,

comment

varchar (1000))
CREATE TRIGGER audit_emp_sal
AFTER UPDATE OF salary ON employee
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
INSERT INTO audit
VALUES (CURRENT TIMESTAMP, ' Employee ' || o.empno ||
' salary changed from ' || CHAR(o.salary) || ' to ' ||
CHAR(n.salary) || ' by ' || USER)

Trigger audit_emp_sal digunakan untuk melakukan auditing pada kolom


SALARY di table EMPLOYEE. Ketika seseorang melakukan perubahan pada
kolom tersebut, trigger akan daktifkan untuk menulis informasi tentang
perubahan yang terjadi pada salary ke dalam table lain yang bernama AUDIT.
Baris OLD as o NEW as n menyatakan bahwa prefix o akan digunakan untuk
merepresentasikan nilai sebelumnya yang terdapat pada table, dan prefix n akan
digunakan untuk merepresentasikan nilai baru dari UPDATE statement.

60

11.1.3 Contoh INSTEAD OF trigger


Trigger INSTEAD OF aktif ketika terjadi perubahan pada VIEW.
Sebelumnya :

CREATE TABLE countries (


id int,
country varchar(50),
region varchar (50),
average_temp int
)
CREATE VIEW view1 (id, continent, temperature) as
SELECT
id,
region,
average_temp
from
countries
CREATE TRIGGER update_view1
INSTEAD OF UPDATE ON view1
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
UPDATE countries
SET region = n.region
WHERE region = o.region;
END

61

LATIHAN
1. Buatlah sebuah trigger untuk men-generate gaji pegawai dengan nilai 150000 jika
seseorang menambahkan pegawai dengan gaji null.
2. Buatlah sebuah tabel yang nantinya akan menyimpan semua perubahan (insert,
update, dan delete) yang terjadi pada table employee, tabel tersebut menyimpan data
sebelum dan sesudah perubahan. kemudian buatlah trigger untuk membuat log dari
tabel employee tersebut.

62

Anda mungkin juga menyukai