19 มิถุนายน 2552

DB2 Trigger

      ตอนนี้ มา Tuneup ระบบให้กับ โปรแกรมของชาวบ้านเค้าครับ ซึ่งระบบนี้ใช้ database DB2 ทดลองจับเวลาในขั้นตอนของการ save ข้อมูลลง database ดู ปรากฏว่า ใช้เวลาประมาณ 3 นาที ทั้งๆ ที่ข้อมูลมีแค่ประมาณ 2000 record, field ก็ไม่ได้เยอะมาก แถม save ลง table เดียวอีกต่างหาก
      ลองไปลองมา ก็ไปพบว่า table นี้มีการใช้ triggerr เยอะมาก ก็เลยลองเปลี่ยนให้ trigger ไปเรียก store procedure แทน ผลปรากฏว่า เร็วขึ้น 70 - 80% เลยที่เดียว
      ที่เป็นแบบนี้ เพราะว่า การทำงานของ เจ้า trigger นี้ จะ compile ใหม่ทุกครั้ง ทำให้ มี overhead ในการทำงานสูงครับ ยิ่ง trigger มี step การทำงานเยอะ ยิ่งใช้เวลานาน

11 มิถุนายน 2552

DB2 Throws Exception in Store Procedure

DB2 ไม่มีวิธี try catch หรือ throw exception ตรงๆ นะครับ วิธีการที่สามารถทำได้คือ การใช้ SIGNAL

CREATE PROCEDURE SP_THROW_MESSAGE(pInput smallint)
begin
if(pInput = 1) then
insert into tablename values('x');
else
--throw exception
SIGNAL SQLSTATE '99999' SET MESSAGE_TEXT = 'test throw exception';
end if;
end


call SP_THROW_MESSAGE(2)


หรือ ถ้าต้องการให้ throw exception หากเกิด exception จริงๆ ก็ เขียนแบบนี้ครับ

CREATE PROCEDURE SP_THROW_MESSAGE(pInput smallint)
begin

declare exit handler for sqlexception
p1:begin
SIGNAL SQLSTATE '12345' SET MESSAGE_TEXT = 'TEST';
end p1;

insert into tablename values('x');

end

call SP_THROW_MESSAGE()


โดย store นี้จะเข้าทำงาน ที่ คำสั่ง insert แต่หากมี exception เกิดขึ้นก็จะเข้าไปทำที่ signal ซึ่งถ้า program ที่เขียนมีการ try catch เอาไว้ก็จะได้ sqlException ออกมา