MySQL
Stored Procedure
Stored Procedure memiliki nama, parameter,
dan dapat diisi banyak perintah SQL
memilik, variabel lokal, error handling, loop,
dan kondisi IF
BEGIN
/* procedure body */
END;
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
CASE ELSE
ITERATE
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.
Masalah:
Bagaimana bisa mendapat id nya dan
Bagaimana mengambil hasil sum() nya.
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 prodrecord
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);
CALL cursor1()