modul pbd bab.pdf

62
1 MODUL PRAKTIKUM PEMROGRAMAN BASIS DATA SIF 15202 LABORATORIUM SISTEM INFORMASI PROGRAM TEKNOLOGI INFORMASI DAN ILMU KOMPUTER UNIVERSITAS BRAWIJAYA MALANG 2014

Upload: sanya-nabiela

Post on 09-Jul-2016

40 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MODUL PBD BAB.pdf

1

MODUL PRAKTIKUM

PEMROGRAMAN BASIS DATA

SIF 15202

LABORATORIUM SISTEM INFORMASI

PROGRAM TEKNOLOGI INFORMASI DAN ILMU KOMPUTER

UNIVERSITAS BRAWIJAYA

MALANG

2014

Page 2: MODUL PBD BAB.pdf

2

DAFTAR ISI

BAB I – STORED PROCEDURE INTRODUCTION 1

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

Page 3: MODUL PBD BAB.pdf

3

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

Page 4: MODUL PBD BAB.pdf

4

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

Page 5: MODUL PBD BAB.pdf

5

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

Page 6: MODUL PBD BAB.pdf

6

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

Page 7: MODUL PBD BAB.pdf

7

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!

Page 8: MODUL PBD BAB.pdf

8

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;

Page 9: MODUL PBD BAB.pdf

9

2.1.2 Tipe Data Array

Tipe data array terbagi menjadi dua, yaitu :

1. Array konvensional

Berikut ini adalah contoh untuk membuat array konvensional.

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.

CREATE TYPE arrType AS INTEGER ARRAY[1000];

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 dept.r_deptno = theDeptNo;

SET dept.r_reportNo = reportNo;

SET dept.r_deptname = theName;

SET dept.r_mgrno = '';

SET dept.r_location = '';

Page 10: MODUL PBD BAB.pdf

10

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

2. Baris

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

CREATE TABLE tab1(col1 INT, col2 CHAR);

INSERT INTO tab1 VALUES (1,2);

INSERT INTO tab1 VALUES (3,4);

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

CREATE PROCEDURE ADD_EMP ()

BEGIN

DECLARE emp ANCHOR ROW employee;

SET emp.empno= ‘000100’;

SET emp.lastname= ‘McClung’;

SET emp.firstname= ‘Naomi’;

END;

Page 11: MODUL PBD BAB.pdf

11

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

Page 12: MODUL PBD BAB.pdf

12

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;

Page 13: MODUL PBD BAB.pdf

13

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

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

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

Page 14: MODUL PBD BAB.pdf

14

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

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

CASE exspression

WHEN condition THEN statement

ELSE statement

END CASE

Page 15: MODUL PBD BAB.pdf

15

Contoh

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

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.

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

CASE

WHEN condition THEN statement

ELSE statement

END CASE

Page 16: MODUL PBD BAB.pdf

16

Contoh

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

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

Page 17: MODUL PBD BAB.pdf

17

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)

Page 18: MODUL PBD BAB.pdf

18

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.

Contoh penggunaan WHILE

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

WHILE [conditions]

DO

[SQL-procedure-statement]

END 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@

Page 19: MODUL PBD BAB.pdf

19

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.

Contoh penggunaan REPEAT

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan

WHILE sebelumnya, tetapi diimplementasikan dengan menggunakan pengulangan

REPEAT.

[Label :]

REPEAT

[SQL-procedure-statement]

UNTIL [conditions]

END REPEAT [Label];

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@

Page 20: MODUL PBD BAB.pdf

20

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:

Contoh penggunaan LOOP:

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan

WHILE dan REPEAT sebelumnya, tetapi diimplementasikan dengan menggunakan

pengulangan LOOP.

[label] LOOP

SQL-procedure-statement(s);

END LOOP [label]

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@

Page 21: MODUL PBD BAB.pdf

21

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:

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:

Contoh diatas merupakan permasalahan yang sama dengan contoh dalam penggunaan

WHILE, REPEAT dan LOOP sebelumnya, tetapi diimplementasikan dengan

menggunakan pengulangan FOR.

[label] FOR for-loop-name AS [cursor-name CURSOR FOR]

select-statement DO

SQL-procedure-statement(s);

END FOR [label]

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@

Page 22: MODUL PBD BAB.pdf

22

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.

Page 23: MODUL PBD BAB.pdf

23

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.

Page 24: MODUL PBD BAB.pdf

24

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

Cursor yang dideklarasikan di dalam Store Procedure dapat diproses seperti halnya cursor

pada konvensional program.

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;

Page 25: MODUL PBD BAB.pdf

25

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

Page 26: MODUL PBD BAB.pdf

26

5.1.2 Contoh Cursor

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

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

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

Page 27: MODUL PBD BAB.pdf

27

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.

5.3 POSITIONED UPDATE

Dalam sebuah positioned update, cursor harus updatable. cursor updatable jika semua

pernyataan berikut benar :

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

Page 28: MODUL PBD BAB.pdf

28

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

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

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

Page 29: MODUL PBD BAB.pdf

29

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

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

Page 30: MODUL PBD BAB.pdf

30

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.

Page 31: MODUL PBD BAB.pdf

31

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

Page 32: MODUL PBD BAB.pdf

32

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

Page 33: MODUL PBD BAB.pdf

33

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 SQL-

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

Page 34: MODUL PBD BAB.pdf

34

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

Page 35: MODUL PBD BAB.pdf

35

Contoh penerapan dalam store procedure:

CREATE OR REPLACE PROCEDURE DEL_EMPLOYEE(IN v_VEMPNO CHAR(6),OUT MSG

VARCHAR(1000))

DYNAMIC RESULT SETS 1

BEGIN

DECLARE SQLSTATE CHAR(5)DEFAULT '00000' ;

DECLARE MYQUERY VARCHAR(1000);

DECLARE ERRSTATE CHAR(5) DEFAULT '00000';

DECLARE 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 di”undo” 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.

Page 36: MODUL PBD BAB.pdf

36

Contoh:

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

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)

Page 37: MODUL PBD BAB.pdf

37

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.

Page 38: MODUL PBD BAB.pdf

38

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 perintah-

perintah 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

Page 39: MODUL PBD BAB.pdf

39

single execute:

PREPARE

EXECUTE

multiple times execute :

EXECUTE IMMEDIATE

7.1.1 Contoh dynamic sql single execute

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.

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

Page 40: MODUL PBD BAB.pdf

40

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

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

Page 41: MODUL PBD BAB.pdf

41

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 DEL_EMPLOYEE(IN v_VEMPNO CHAR(6))

DYNAMIC RESULT SETS 1

BEGIN

DECLARE SQLSTATE CHAR(5)DEFAULT '00000' ;

DECLARE MSG VARCHAR(1000);

DECLARE MYQUERY VARCHAR(1000);

DECLARE ERRSTATE CHAR(5) DEFAULT '00000';

DECLARE 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@

Page 42: MODUL PBD BAB.pdf

42

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!

Page 43: MODUL PBD BAB.pdf

43

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.

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.

CREATE PROCEDURE P1(x INT, y DEFAULT 1);

CALL P1(10);

CALL P1(10, DEFAULT);

CALL P1(x => 100, y => 20);

Page 44: MODUL PBD BAB.pdf

44

Contoh diatas akan membuat 3 procedure yang berbeda.

8.2 DASAR NESTED SQL PROCEDURE

Pada procedure bonus terdapat sintak pemanggilan procedure count project, yaitu

CALL count_projects(p_empno, v_total); dimana p_empno merupakan

CREATE PROCEDURE SCHEMA1.P2();

CREATE PROCEDURE SCHEMA2.P2();

CREATE PROCEDURE SCHEMA2.P2(x INT);

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@

Page 45: MODUL PBD BAB.pdf

45

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 :

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:

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

CREATE PROCEDURE CALLING_PROC

(IN inParm SMALLINT, OUT outParm DOUBLE)

LANGUAGE SQL

BEGIN

DECLARE loc1, loc2 RESULT_SET_LOCATOR VARYING;

CALL CALLED_PROC ;

ASSOCIATE RESULT SET LOCATORS (loc1, loc2)

WITH PROCEDURE CALLED_PROC;

Page 46: MODUL PBD BAB.pdf

46

PROCEDURE. Untuk itu kita perlu mengalokasikan cursor untuk setiap variabel locator. Hal

ini dapat dilakukan dengan syntax ALLOCATE.

Contoh:

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:

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.

ALLOCATE C1 CURSOR FOR RESULT SET loc1;

ALLOCATE C2 CURSOR FOR RESULT SET loc2;

FETCH C1 INTO var1;

FETCH C2 INTO var2;

Page 47: MODUL PBD BAB.pdf

47

8.4 CONTOH NESTED SQL PROCEDURE

Procedure 1 :

Procedure 2 :

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

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

Page 48: MODUL PBD BAB.pdf

48

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

Page 49: MODUL PBD BAB.pdf

49

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 !

Page 50: MODUL PBD BAB.pdf

50

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 :

Page 51: MODUL PBD BAB.pdf

51

Sintaks:

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 :

Contoh pemanggilan Fungsi :

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.

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;

CREATE FUNCTION FUNCTION1( )

RETURNS INTEGER

BEGIN ATOMIC

RETURN SELECT sum(salary)

FROM STAFF;

END@

VALUES FUNCTION1()@

--ATAU

SELECT DISTINCT FUNCTION1() FROM STAFF@

Page 52: MODUL PBD BAB.pdf

52

9.2.3 DROP UDF

Cara untuk menghapus function berdasarkan nama function dapat digunakan

sintak berikut :

Sintaks:

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:

Contoh:

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

DROP FUNCTION nama_function;

DROP FUNCTION nama_function1(type_data);

DROP FUNCTION GET_TOTAL_SALARY(VARCHAR(10))@

Page 53: MODUL PBD BAB.pdf

53

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 :

9.3.1.2 Pemanggilan

Terdapat 2 cara pemanggilan pada fungsi scalar ini yaitu dengan menggunkan

merintah SELECT dan menggunakan perintah VALUES.

Contoh :

Atau:

9.3.1.3 Hasil

Hasil pemanggilan fungsi diatas adalah sama (dengan menggunakan empno

‘000010’) yaitu :

dan

SELECT EMPNO, FIRSTNME, SALARY, BONUS, COMM,

GET_TOTAL_SALARY('000010') AS HASIL_FUNCTION

FROM EMPLOYEE

WHERE EMPNO = '000010'@

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@

VALUES GET_TOTAL_SALARY('000010')@

Page 54: MODUL PBD BAB.pdf

54

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 :

9.3.2.2 Pemanggilan

Contoh :

9.3.2.3 Hasil

Hasil pemanggilan fungsi diatas (dengan menggunakan nama project ‘account

programming’) yaitu :

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@

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

Page 55: MODUL PBD BAB.pdf

55

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.

Page 56: MODUL PBD BAB.pdf

56

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

Page 57: MODUL PBD BAB.pdf

57

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.

Page 58: MODUL PBD BAB.pdf

58

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.

Page 59: MODUL PBD BAB.pdf

59

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

Tipe trigger

o BEFORE

Diaktifkan sebelum INSERT, UPDATE atau DELETE.

o AFTER

Diaktifkan setelah triggering SQL statement dieksekusi dengan sukses.

o INSTEAD OF

- Didefinisikan di dalam VIEW.

- Didefinsikan secara logical dalam trigger yang dieksekusi dalam

triggering SQL statement.

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

Page 60: MODUL PBD BAB.pdf

60

11.1.1 Contoh BEFORE trigger

Sebelumnya :

CREATE TABLE BACKUP_EMP LIKE EMPLOYEE

11.1.2 Contoh AFTER trigger

Sebelumnya :

CREATE TABLE audit (mytimestamp timestamp, comment

varchar (1000))

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.

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

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)

Page 61: MODUL PBD BAB.pdf

61

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

Page 62: MODUL PBD BAB.pdf

62

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.