ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ (SQL Server : Stored Procedure) |
ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ (SQL Server : Stored Procedure) สำหรับค่า Parameters หรือ Variable ชนิดแบบ OUTPUT เมื่อประกาศค่านี้แล้ว เมื่อทำการเรียกใช้งานระหว่าง Stored Procedure ด้วยกันเอง มันจะส่งค่ากลับมายังตัวแปรนั้น ๆ ด้วย ถ้าเข้าใจง่าย ๆ ก็เหมือนตัวแปรชนิด ByRef ในภาษายุคของ VB หรือจะสามารถส่งค่ากลับไปยัง Application ที่เรียกใช้งาน Stored Procedure ได้ เช่น นอกจากจะส่งค่า Result ที่ผ่านการ SELECT แล้ว ยังสามารถส่งค่า Parameters อื่น ๆ กลับไปอีกด้วย
โครงสร้างของตาราง CUSTOMER และ COUNTRY
Table : CUSTOMER
Table : COUNTRY
OUTPUT or OUT Syntax
@CountCustomer INT OUTPUT -- return this variable
@CountCustomer INT OUT-- return this variable
Example 1 : ตัวอย่างการใช้ OUTPUT เพื่อส่งกลับค่าตัวแปรระหว่าง Stored Procedure
สร้าง Stored Procedure ขึ้นมา 2 ตัวคือ getCustomerCount และ myStoredProcedure
getCustomerCount
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].[getCustomerCount]
@pCountryCode VARCHAR(2),
@CountCustomer INT OUTPUT -- return this variable
AS
BEGIN
-- set count customer
SELECT @CountCustomer = COUNT(*) FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
END
ประกาศ Parameters ชื่อว่า @CountCustomer แบบ OUTPUT และจะส่งค่านี้กลับไปยัง Stored ที่เรียกใช้งาน
myStoredProcedure
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]
@pCountryCode VARCHAR(2)
AS
BEGIN
DECLARE @iRowCustomer INT
-- call stored procedure getCustomerCount
EXEC getCustomerCount @pCountryCode,@iRowCustomer OUTPUT
SELECT 'Total customer : ' + CAST(@iRowCustomer AS VARCHAR(10))
END
@iRowCustomer OUTPUT จะส่งชื่อตัวแปรที่ไปยัง Stored เป็นแบบ OUTPUT แล้วมันจะถูกส่งค่ากลับมายังตัวแปรนี้
EXEC myStoredProcedure 'US'
Result
Example 2 : ตัวอย่างการใช้ OUTPUT เพื่อส่งกลับค่าตัวแปรกลับไปยังตัวที่เรียกใช้งาน Stored
getCustomer
USE [mydatabase]
GO
/****** Object: StoredProcedure [dbo].[getCustomer] Script Date: 10/23/2015 22:22:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[getCustomer]
@pCountryCode VARCHAR(2),
@pRowFound INT OUTPUT
AS
BEGIN
-- set rowcount
SELECT @pRowFound = COUNT(*) FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
-- set customer
SELECT * FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode
END
ประกาศ Parameters ชื่อว่า @pRowFound แบบ OUTPUT และจะส่งค่านี้กลับไปยังอะไรก็ตามที่เรียกใช้งาน Stored
DECLARE @pRowFound int
EXEC getCustomer @pCountryCode = 'US',@pRowFound = @pRowFound OUTPUT
SELECT @pRowFound AS 'pRowFound';
Result
จากตัวอย่างนี้จะส่งกลับมา 2 ค่าคือ ค่าที่ได้จากการ SELECT ข้อมูล และค่าที่ได้จาก Parameters
Example 3 : ตัวอย่างการใช้ OUTPUT เพื่อส่งค่ากลับมาตั้งแต่ 2 ค่าขึ้นไป
insertCustomer
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
ALTER 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
ประกาศ Parameters ชื่อว่า @pResult และ @pMessage แบบ OUTPUT และจะส่งค่านี้กลับไปยังอะไรก็ตามที่เรียกใช้งาน Stored โดยส่งค่าผลลัพธ์ของการ Insert ข้อมูล และ Message ที่ส่งกลับ
DECLARE @pResult INT,
@pMessage VARCHAR(500)
EXEC [insertCustomer] 'C005','Fun Wipa','[email protected]','TH','100000','0',@pResult=@pResult OUTPUT,@pMessage=@pMessage OUTPUT
SELECT @pResult AS 'pResult'
SELECT @pMessage AS 'pMessage'
Result
กรณีที่ Insert ข้อมูลสำเสร็จ
กรณีที่ Insert ข้อมูลไม่สำเร็จ
|