ตอนที่ 13 : การใช้ Transaction บน Oracle Stored Procedure (Oracle : Stored Procedure) |
ตอนที่ 13 : การใช้ Transaction บน Oracle Stored Procedure (Oracle : Stored Procedure) อีกฟีเจอร์หนึ่งที่น่าสนใจบน Oracle Stored Procedure คือการจัดการกับความถูกต้องในการทำงานของ SQL Statement ด้วย Transaction โดยปกติแล้ว Oracle Database จะมีการทำงานในรูปแบบของ Transaction และ Auto Commit ได้แบบอัตโนมัติอยู่แล้ว แต่ในขณะเดียวกัน เราสามารถที่จะทำการ เปิด SAVEPOINT เพื่อที่จะ ROLLBACK ไปยัง SAVEPOINT นั้นได้ ซึ่งประโยชน์ของมันคือ จะสามารถควบคุมการทำงานของ Query ที่เกิดขึ้น ในกรณีที่มีการ Error หรือ เกิดเงื่อนไขที่ไม่ต้องการ เราจะสามารถทำการ ROLLBACK ย้อนกลับข้อมูลที่เกิดขึ้นระหว่างการทำงาน เช่น INSERT, UPDATE และ DELETE ให้กลับมายังจุดก่อนที่ Stored Procedure ที่จะทำได้
ถ้าจะพูดถึงเรื่อง Transaction บน Oracle Database เราสามารถใช้การทำงานผ่านโปรแกรมที่เรียกใช้งานได้ เช่นแทนที่จะใช้ Transaction บน Stored Procedure ก็ไปประกาศบน PHP, .NET หรืออื่น ๆ ซึ่งจะทำให้การควบคุม Transaction นั้นได้ดีกว่า เพราะสามารถ Rollback ได้ทั้งหมดของ Process ที่เกิดขึ้น
Table : CUSTOMER
Transaction Syntax
BEGIN
// Statement 1
// Statement 2
// Statement 3
-- Commit
COMMIT;
-- Exception
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
END;
END;
Example : ตัวอย่างการใช้ TRANSACTION และ SAVEPOINT ในรูปแบบที่ง่าย ๆ บน Oracle Store Procedure
CREATE OR REPLACE PROCEDURE INSERT_CUSTOMER
(
pCustomerID IN VARCHAR2,
pName IN VARCHAR2,
pEmail IN VARCHAR2,
pCountryCode IN VARCHAR2,
pBudget IN DECIMAL,
pUsed IN DECIMAL
)
AS
BEGIN
-- Create save point
SAVEPOINT save_point;
-- Delete Customer
DELETE FROM CUSTOMER WHERE COUNTRY_CODE = 'US';
-- Insert Statement 1
INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
-- Insert Statement 2
INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
-- Commit
COMMIT;
-- Exception
EXCEPTION
WHEN OTHERS THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Error : ' || SQLERRM);
ROLLBACK TO save_point;
END;
END;
จากตัวอย่างนี้จะมีการประกาศ SAVEPOINT ไว้แล้วและหลังจากนั้นจะ Delete ข้อมูลและ Insert ข้อมูลลงในตารางจำนวน 2 ครั้ง ซึ่งจะ Error ของ WHEN OTHERS THEN เกิดขึ้น แน่นอนเพราะ Key ซ้ำ และเมื่อ Error จะถูกจัดกจับด้วย EXCEPTION โดยเงื่อนไขจะถูก ROLLBACK TO save_point;
Call
EXEC INSERT_CUSTOMER('C005','Fun Wipa','[email protected]','TH','100000','0');
Error ที่เกิดขึ้นเพราะ Stored ทำงานผิดแน่นอน
ข้อมูลก่อนและหลังไม่เปลี่ยนแปลง
|