DAFTAR ISI
BAB I STORED PROCEDURE INTRODUCTION
240
34
39
BAB X MODULE
52
BAB XI TRIGGER
595
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];
Condition declaration
Contoh: DECLARE not_found CONDITION FOR SQLSTATE 02000;
1.3.3
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
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. 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
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
Contoh
CREATE PROCEDURE UPDATE_SALARY_IF
(IN employee_number CHAR(6), INOUT rating SMALLINT)
LANGUAGE SQL
BEGIN
SET rating = -1;
IF rating = 1
--(1)
--(2)
--(3)
(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
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
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 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
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;
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
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 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 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
Nama-nama kolom dalam select statement harus unik dan tabel yang digunakan
pada select statement harus ada terlebih dahulu.
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
Cursor yang dideklarasikan di dalam Store Procedure dapat diproses seperti halnya cursor
pada konvensional program.
24
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
25
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
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.
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
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
28
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
30
LATIHAN
1. Buatlah tabel pegawai yang memiliki struktur seperti tabel employee. kemudian buat
prosedur dengan nama multiple_4digitnimbelakang dengan ketentuan :
buat cursor untuk memasukkan data dari tabel employee ke tabel pegawai
(gunakan perulangan while atau loop)
2. Buatlah prosedur yang berfungsi untuk mengupdate salary pegawai tertentu dengan
menggunakan cursor kemudian tampilkan hasilnya dengan multiple result sets
31
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.
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
BEGIN
DECLARE
DECLARE
DECLARE
DECLARE
35
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'.
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
pada
sebuah
keadaan
membangun
statement
SQL
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
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
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.
BEGIN
DECLARE
DECLARE
DECLARE
DECLARE
DECLARE
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!
42
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
Pada procedure bonus terdapat sintak pemanggilan procedure count project, yaitu
CALL
count_projects(p_empno,
v_total);
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.
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;
SQLCODE
berarti
prosedur
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
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
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
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
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
Contoh :
CREATE FUNCTION FUNCTION1( )
RETURNS INTEGER
BEGIN ATOMIC
RETURN SELECT sum(salary)
FROM STAFF;
END@
Hasil:
Contoh:
DROP FUNCTION GET_TOTAL_SALARY(VARCHAR(10))@
52
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
dan
53
9.3.2
query.
Contoh
fungsi
tabel
yang
telah
built-in
adalah
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
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.
56
d. Memberi hak.
GRANT EXECUTE ON MODULE myMod TO Joe;
Memberi hak untuk mengakses module myMode kepada Joe.
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
-
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
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)
60
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