ตอนที่ 9 : การใช้ Try Catch บน Stored Procedure (SQL Server : Stored Procedure) |
ตอนที่ 9 : การใช้ Try Catch บน Stored Procedure (SQL Server : Stored Procedure) การใช้ Try...Catch จัดได้ว่าเป็นการเขียนโปรแกรมที่ผู้เขียนเป็นคนที่เอาใจ่ใส่ในการที่จะป้องกัน Bug ของโปรแกรม สามารถนำ Error มาทำเป็น Log ได้และนำไปใช้งานเพื่อวิเคราะห์หาสาเหตุของข้อผิดพลาดได้ ซึ่งบน Store Procedure ของ SQL Server Database ก็มีฟีเจอร์นี้เช่นเดียวกัน โดยประโยชน์หลัก ๆ ของการใช้ Try...Catch ก็คือ เราสามารถ Control เก็บ Error Log ข้อผิดพลาดของ Store Procedure ได้ และอีกทั้งยังถ้าใช้ Try...Catch โปรแกรมจะยังสามารถทำงานต่อไปได้แม้ว่าจะมีการ Error หรือทำงานไม่ถูกต้องก็ตาม เพียงแต่เราสามารถอ่านค่า Error และนำมันกลับมาใช้ โดยอาจจะเขียนลงบน Log หรือว่าแสดงผลให้ผู้ใช้งานได้ทราบ
โครงสร้างของตาราง CUSTOMER และ COUNTRY
Table : CUSTOMER
Table : COUNTRY
Try Catch Syntax
BEGIN TRY
// Statement
END TRY
BEGIN CATCH
// Exception
END CATCH
Error Exception
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
Example 1 : ตัวอย่างการใช้ Try Catch เพื่อดักจับข้อผิดพลาด Exception
USE [mydatabase]
GO
/****** Object: StoredProcedure [dbo].[myStoredProcedure] Script Date: 12-Sep-15 12:39:38 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[myStoredProcedure]
@pOne DECIMAL(10,2),
@pTwo DECIMAL(10,2)
AS
BEGIN
BEGIN TRY
SELECT @pOne/@pTwo
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
END
ตัวอย่างนี้จะรับค่า Parameters จำนวน 2 ค่าคือ @pOne และ @pTwo โดยเอาค่าแรกหารด้วยค่าที่สอง
EXEC myStoredProcedure '100','0'
ทดสองส่งค่า 100 และ 0 ซึ่งตามหลักคณิตศาสตร์ ค่าอะไรก็ตามจะหารด้วย 0 ไม่ได้ ซึ่งเป็นข้อผิดพลาดแน่นอน
Result
Example 2 : ตัวอย่างการใช้ Try Catch เพื่อดักจับข้อผิดพลาด Exception ในการ Insert ข้อมูล พร้อมกับส่งค่า OUT
USE [mydatabase]
GO
/****** Object: StoredProcedure [dbo].[insertCustomer] Script Date: 10/23/2015 22:41:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[insertCustomer]
@pCustomerID VARCHAR(4),
@pName VARCHAR(50),
@pEmail VARCHAR(50),
@pCountryCode VARCHAR(2),
@pBudget DECIMAL(18,2),
@pUsed DECIMAL(18,2),
@pResult INT OUTPUT,
@pMessage VARCHAR(500) OUTPUT
AS
BEGIN
BEGIN TRY
-- insert customer
INSERT INTO CUSTOMER VALUES (@pCustomerID,@pName,@pEmail,@pCountryCode,@pBudget,@pUsed);
SET @pResult = @@ROWCOUNT;
SET @pMessage = 'Insert Data Successfully';
END TRY
BEGIN CATCH
SET @pResult = 0;
SELECT @pMessage = ERROR_MESSAGE();
END CATCH
END
กรณีทำสำเร็จจะแสดงผลและส่งกลับ OUT
pResult = 1
pMessage = Insert Data Successfully
รณีทำไม่สำเร็จจะแสดงผลและส่งกลับ OUT
pResult = 1
pResult = 0
pMessage = ERR FROM SQL SERVER
อ่านเพิ่มเติม : ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ (SQL Server : Stored Procedure)
|