Zeos adalah salah satu komponen yang berfungsi memudahkan akses ke database sebagai alternatif ADOQuery.
Banyak fitur yang dimiliki oleh Zeos salah satunya adalah adalah ZStoredProcedure.
Okelah sekarang anggaplah semua menggunakan MySQL sebagai database nya (gratisan lagi tentunya), didalam MySQL terdapat fitur StoredProcedure yang biasanya digunakan untuk menjalankan proses yang cukup besar apabila dilakukan dengan koneksi yang terus menerus namun lebih ringan apabila dijalankan di server dan client hanya mengirimkan beberapa parameter.
Sebagai contoh :
DELIMITER $$
USE `owas`$$
DROP PROCEDURE IF EXISTS `iebahanriset`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `iebahanriset`(p_id INT,p_nama VARCHAR(50),p_sex CHAR(1),p_pekerjaan VARCHAR(50),p_lahir DATE,p_owas INT,p_reba INT,p_rula INT,OUT neoid INT)
BEGIN
IF p_id=0 THEN
SELECT IFNULL(MAX(id_bahanriset)+1,1) FROM bahan_riset INTO neoid;
INSERT INTO bahan_riset(id_bahanriset,nama_bahanriset,sex_bahanriset,pekerjaan_bahanriset,lahir_bahanriset,hasil_owas,hasil_reba,hasil_rula)
VALUES(neoid,p_nama,p_sex,p_pekerjaan,p_lahir,p_owas,p_reba,p_rula);
ELSE
UPDATE bahan_riset SET nama_bahanriset=p_nama,sex_bahanriset=p_sex,pekerjaan_bahanriset=p_pekerjaan,lahir_bahanriset=p_lahir,
hasil_owas=p_owas,hasil_reba=p_reba,hasil_rula=p_rula WHERE id_bahanriset=p_id;
END IF;
END$$
DELIMITER ;
Ada beberapa parameter yang harus diisikan pada saat akan memanggil storedprocedure iebahanriset dari ZStoredProcedure. Permasalahan nya apabila kita memiliki lebih dari 10 storedprocedure maka tidak mungkin kita mengcreate satu persatu nama parameter nya.
Untuk memudahkan nya berikut ada procedure untuk memudahkan create nama parameter secara runtime dan dinamis.
procedure ExecStored(const namaprocedure :string;var qry : TZQuery;var sp : TZStoredProc);
var
listParam,listSpasi : TStringList;
loopcmb : integer;
strSql : string;
begin
sp.StoredProcName:= '';
listParam := TStringList.Create;
listSpasi := TStringList.Create;
listParam.Clear;
listSpasi.Clear;
strSql := 'SELECT param_list FROM mysql.proc WHERE '+
'db=%s AND NAME=%s';
strSql := FORMAT(strSql,[
QuotedStr(DataModule1.ZConnection1.Database),
QuotedStr(namaprocedure)
]);
OpenSql(qry,strSql);
Explode(listParam,qry.Fields[0].AsString,',');
for loopcmb := sp.Params.Count-1 downto 0 do
sp.Params.Delete(loopcmb);
loopcmb := 0;
while loopcmb <= listParam.Count-1 do
begin
listSpasi.Clear;
Explode(listSpasi,listParam[loopcmb],' ');
sp.Params.Add;
if listSpasi[0]='OUT' then
begin
sp.Params[loopcmb].ParamType:=ptOutput;
if listSpasi[2]='INT' then
sp.Params[loopcmb].DataType:= ftInteger
else
sp.Params[loopcmb].DataType := ftString;
sp.Params[loopcmb].Name:= listSpasi[1];
end
else
begin
sp.Params[loopcmb].ParamType:=ptInput;
if listSpasi[1]='INT' then
sp.Params[loopcmb].DataType:= ftInteger
else
sp.Params[loopcmb].DataType := ftString;
sp.Params[loopcmb].Name:= listSpasi[0];
end;
inc(loopcmb);
end;
sp.StoredProcName:=namaprocedure;
listParam.Free;
listSpasi.Free;
end;
Lalu untuk memanggilnya dari delphi cukup mengetikanExecStored('iebahanriset',ZQuery1,ZStoredProc1);
untuk mengisi parameter nya lakukan dengan menggunakan :
ZStoredProc1.ParamByName('p_id').AsInteger := xxx;
..dst
Untuk mendapatkan parameter OUT nya gunakan :hasiloutput := ZStoredProc1.ParamByName('neoid').AsInteger;
Selamat bekerja dengan ZStoredProcedure

0 comments:
Post a Comment