Total Tayangan Halaman

Senin, 07 Maret 2011

Table Sebagai Pengganti Array di Mysql

Salah satu hal yang kurang dari MySQL (setidaknya sampai versi 5.2) adalah ketidak adaan array. Padahal sudah mulai enjoy membuat trigger dan stored procedure di MySQL. Satu-satunya cara adalah membuat sebuah tabel sementara, yang diberi nama tabel_array_int. Oleh karena tabel ini hanya dibutuhkan sementara, maka tipe tabel yang cocok adalah MEMORY (tebel langsung dibuat di memori), tapi tetep aja agak ribet.
create table tabel_array_int
(
id_session_array int unsigned not null primary key,
index_array int unsigned not null primary key,
nilai_array int unsigned not null
) engine=memory;


delimiter $


create function get_tabel_array_int(in session int, in idx int) returns int
begin
return (select nilai_array from tabel_array_int where id_session_array=session and index_array=idx);
end$


create procedure set_tabel_array_int(in session int, inout idx int, in nilai int)
begin
insert into tabel_array_int values (session, idx, nilai);
set idx := idx + 1;
end$$

create procedure destroy_tabel_array_int(in session int)
begin
delete from tabel_array_int where id_session_array=session;
end$$

delimiter ;

id_session_array adalah id session dari array, untuk membedakan yang memiliki array tersebut. index_array adalah no indeks dari array. nilai_array adalah nilai yang disimpan ke dalam array. id_session_array adalah id unik yang dapat dibuat menggunakan rand() yang menghasilkan angka acak dari 0 hingga 1, sedangkan nilai int maksimal sekitar 4,5 milyar, sehingga untuk membuat id yang acak dapat menggunakan:
delimiter $$

create function id_gen () returns int
begin
return ceil(rand() * 4000000000);
end$$

delimiter ;
contoh penggunaan:
delimiter $

create procedure contoh_penggunaan()
begin
declare id_sess int;
declare idx_arr int;
set idx_arr := 0;
set id_sess := id_gen();
#contoh memasukkan nilai ke tabel_array_int
call set_tabel_array_int(id_sess, idx_arr, 100);
call set_tabel_array_int(id_sess, idx_arr, 200);
call set_tabel_array_int(id_sess, idx_arr, 300);
#contoh mendapatkan nilai dari tabel_array_int
get_tabel_array_int(id_sess, 2); #hasilnya adalah 200
#selesai
call destroy_tabel_array_int(id_sess);
end;

delimiter ;
Untuk array yang memiliki dimensi lebih dari 1, maka tinggal ditambahkan field nilai_array_2, ..., nilai_array_n

Tidak ada komentar: