Anda di halaman 1dari 38

Stored Procedure & Cursor

MySQL

Stored Procedure
Stored Procedure memiliki nama, parameter,
dan dapat diisi banyak perintah SQL
memilik, variabel lokal, error handling, loop,
dan kondisi IF

CREATE PROCEDURE procedure1()

BEGIN

/* procedure body */
END;

Pemanggilan stored procedure dilakukan


dengan perintah CALL
CALL procedure1();

Delimiter
adalah karakter atau string ang
digunakan untuk memberitahu
MySQL bahwa pengetikan suatu
statemen SQL telah selesai. ;
Untuk membedakan akhir dari stored
procedure dan statemen SQL, perlu
dilakukan perubahan delimiter.
Misalnya dengan menggunakan //.

DELIMITER //
CREATE PROCEDURE procedure1()
BEGIN
SQLStatement1;
SQLStatement2;
END//
DELIMITER ;

Create Procedure
CREATE PROCEDURE p1 () SELECT *
FROM t;
stored procedure dengan nama p1
berisi statemen SELECT * FROM t
BEGIN dan END tidak diperlukan di
sini karena statemen tunggal.

Stored Procedure
Nama stored procedure tidak case sensitif, jadi p1 dan
P1 adalah sama.
Tidak boleh menggunakan dua stored procedure
dengan nama yang sama dalam MySQL.
Boleh menggunakan bentuk
nama_database.nama_stored_procedure, misalkan
db4.sp1.
Boleh menggunakan spasi, dengan catatan harus
berada diantara tanda `. Panjang tidak lebih dari 64
karakter.
CREATE PROCEDURE `long p1`() SELECT * FROM t;
CALL `long p1`();

Procedure Body
Semua DML dan DDL statemen pada
level tabel boleh digunakan dalam
procedure body. Yang tidak
diperbolehkan antara lain: CREATE
PROCEDURE, ALTER PROCEDURE,
DROP PROCEDURE, CREATE
FUNCTION, DROP FUNCTION, CREATE
TRIGGER, DROP TRIGGER.

Variables
Variabel diletakkan di dalam
procedure body (diantara BEGIN dan
END).
Deklarasi variable diawali dengan
DECLARE.
Variabel dapat diberikan nilai
DEFAULT.
Dalam tiap blok BEGIN-END, dapat
digunakan variabel yang sama.
Variable a (system variables)

Variables
Variable a hanya dapat digunakan di
dalam STORED PROCEDURE
Bersifat local
Harus menggunakan DECLARE
Variable @a dapat digunakan dimana
saja
Bersifat global

Variables

Variables

DELIMITER //
CREATE PROCEDURE prc_test ()
BEGIN
DECLARE var2 INT DEFAULT 1;
SET var2 = var2 + 1;
SELECT var2;
END//
DELIMITER ;

Variables

DELIMITER //
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT;
DECLARE b INT DEFAULT 5;
SET a = 10;
SET a = a * b;
SELECT a;
END//

CALL p1();

DELIMITER //
CREATE PROCEDURE prc_test ()
BEGIN
DECLARE var2 INT DEFAULT 1;
SET var2 = var2 + 1;
SET @var2= 10;
SET @var2 = @var2 + 1;
SELECT var2, @var2;
END//
DELIMITER ;

Variables

DELIMITER //
CREATE PROCEDURE p1()
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'outer';
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'inner';
SELECT x1;
END;
SELECT x1;
END //

DELIMITER ;
CALL p1();
Output?

Variables

Parameter
Stored Procedure memiliki 3 jenis
parameter yaitu IN, OUT, dan INOUT.
CREATE PROCEDURE p1 (IN parameter1
INTEGER, OUT parameter2 varchar)
SELECT * FROM t;

Parameter
IN digunakan untuk menandai bahwa
parameter digunakan sebagai input.

DELIMITER //
CREATE PROCEDURE p1 (IN i1 INTEGER)
BEGIN
DECLARE a INT DEFAULT 5;
SET a = a * i1;
SELECT a;
END//

DELIMITER ;
CALL p1(5);

Parameter
OUT digunakan untuk menandai bahwa
parameter digunakan sebagai output.

DELIMITER //
CREATE PROCEDURE p2 (OUT o1 INTEGER)
BEGIN
DECLARE b INT DEFAULT 5;
SET o1 = b;
END//

DELIMITER ;
CALL p2(@a);
SELECT @a;

Parameter
INOUT digunakan untuk menandai bahwa
parameter digunakan sebagai input sekaligus
output.

DELIMITER //
CREATE PROCEDURE p1 (INOUT io1 FLOAT)
BEGIN
SET io1 = io1 * pi();
END//

DELIMITER ;
SET @a=7;
CALL p1(@a);
SELECT @a;

IF THEN ELSE

CREATE PROCEDURE p12 (IN parameter1 INT)


BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
IF variable1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; //

CASE ELSE

CREATE PROCEDURE p13 (IN parameter1 INT)


BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
CASE variable1
WHEN 0 THEN INSERT INTO t VALUES (17);
WHEN 1 THEN INSERT INTO t VALUES (18);
ELSE INSERT INTO t VALUES (19);
END CASE;
END; //

WHILE END WHILE

CREATE PROCEDURE p14 ()


BEGIN
DECLARE v INT;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END; //

REPEAT END REPEAT

CREATE PROCEDURE p15 ()


BEGIN
DECLARE v INT;
SET v = 0;
REPEAT
INSERT INTO t VALUES (v);
SET v = v + 1;
UNTIL v >= 5 END REPEAT;
END; //

LOOP END LOOP

CREATE PROCEDURE p16 ()


BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END; //

ITERATE

CREATE PROCEDURE p20 ()


BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
IF v = 3 THEN
SET v = v + 1;
ITERATE loop_label;
END IF;
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END; //

CURSOR
Cursor adalah fitur dari stored
procedure. Cursor mampu melakukan
iterasi sepanjang row data dari suatu
tabel.
Penggunaan cursor tidak disarankan
selama masih ada cara lain, karena
relatif lambat.

CURSOR
Misalkan terdapat sebuah tabel
member yang berisi id_member dan
nama.
Tabel member tersebut berelasi
dengan tabel transaksi yang berisi
id_transaksi dan jumlah tiap
transaksi.

CURSOR
Seorang DBA ditugaskan membuat
laporan tahunan dengan menghitung
total transaksi tiap member.

Buat tabel baru (temporary) yang


berkolom id_new, nama_new, dan
jumlah_new.
Tabel ini untuk menampung id,
nama, dan total transaksi member.

Total pembelian dapat diperoleh


dengan perintah sum().
SELECT sum(jumlah) where id_member=???

Masalah:
Bagaimana bisa mendapat id nya dan
Bagaimana mengambil hasil sum() nya.

Buat stored procedure dengan IN dan OUT.


DELIMITER //
CREATE PROCEDURE counttotal(IN id INTEGER, OUT ct INTEGER)
BEGIN

SET ct:= (SELECT SUM(jumlah) FROM transaksi WHERE


id_member=id);
END//
DELIMITER ;
CALL (1,@a);

Ketika prosedur ini dipanggil, dengan id_member


sebagai input, akan menghasilkan total jumlah yang
bersesuaian.

Selesai?

DELIMITER //
CREATE PROCEDURE cursor1 ()
BEGIN
DECLARE id_c INT;
DECLARE nama_c VARCHAR(100);
DECLARE done INT DEFAULT 0;
DECLARE prodrecord
CURSOR FOR SELECT id_member, nama FROM member ORDER BY id_member;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN prodrecord;
WHILE NOT done DO
FETCH prodrecord INTO id_c, nama_c;
CALL counttotal(id_c,@a);
IF @a IS NULL THEN
SET @a=0;
END IF;
IF NOT done THEN
INSERT INTO curtest VALUES (id_c, nama_c, @a);
END IF;
END WHILE;
CLOSE prodrecord;
END//
DELIMITER ;
CALL cursor1();

Cursor

DECLARE id_c INT;


DECLARE nama_c VARCHAR(100);
DECLARE done INT DEFAULT 0;
DECLARE prodrecord
CURSOR FOR SELECT id_member, nama FROM member
ORDER BY id_member;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET
done = 1;

Deklarasi harus dilakukan berurutan


dari deklarasi variabel, cursor,
kemudian handler.

DECLARE prodrecord

CURSOR FOR SELECT id_member, nama FROM


member ORDER BY id_member;

dibuat cursor yang berisi id_member dan


nama. Tidak selalu harus seluruh kolom,
boleh hanya data yang diperlukan.
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
SET done = 1;

Dibuat handler ketika pembacaan row


mencapai akhir

OPEN prodrecord;
Open cursor
FETCH prodrecord INTO id_c,
nama_c;
Masukkan nilai cursor ke dalam
variabel id_c dan nama_c

CALL counttotal(id_c,@a);

Panggil stored procedure untuk


menghitung jumlah total dengan
parameter IN id_c dan OUT @a.
IF NOT done THEN

INSERT INTO curtest VALUES (id_c,


nama_c, @a);
END IF;

Masukkan data ke dalam tabel baru.

CALL cursor1()

Buat kasus berbeda yang sekiranya


tidak bisa dilakukan denga query
biasa atau stored procedure biasa.
1 Kelompok 2 orang
Minggu depan demo

Anda mungkin juga menyukai