ตอนที่ 12 : การใช้ Cursor ระหว่าง (Between) Stored Procedure (SQL Server : Stored Procedure) |
ตอนที่ 12 : การใช้ Cursor ระหว่าง (Between) Stored Procedure (SQL Server : Stored Procedure) ในกรณีที่การทำงานของ Stored Procedure มีความซับซ้อน เราอาจจะใช้การแยกเป็น Procedure ย่อยอีกหลาย ๆ ตัว เพื่อแบ่งหน้าที่การทำงาน ซึ่งเราสามารถทำการเรียกการทำงานระหว่าง Stored Procedure ได้ด้วยการใช้คำสั่ง EXEC หรือ EXECUTE ส่วนในกรณีที่ต้องการส่งค่ากลับให้ใช้ตัวแปรแบบ OUTPUT จะสามารถทำการ รับ-ส่งค่าได้ในรูปแบบต่าง ๆ เช่น VARCHAR, INT รวมทั้งที่เป็นแบบ CURSOR หรือข้อมูลที่ได้จากการ SELECT
ในตัวอย่างนี้จะยกตัวอย่างการเขียน Stored Procedure เพื่อรับส่งค่า CURSOR ระหว่าง Stored Procedure แบบง่าย ๆ โดยจะสร้าง Procedure ขึ้นมา 2 ตัว และอ่านค่าจากตัวใดตัวหนึ่งเพื่อมา Loop และแสดงผลข้อมูล
Table : CUSTOMER
Table : COUNTRY
Procedure 1
CREATE PROCEDURE [dbo].[procedure1]
@pParameter1 VARCHAR(2),
@pParameter2 CURSOR VARYING OUTPUT
AS
BEGIN
-- Return cursor
SET @pParameter2 = CURSOR FORWARD_ONLY STATIC FOR
SELECT * FROM TABLE_NAME;
OPEN @pParameter2;
END
Procedure 2
CREATE PROCEDURE [dbo].[procedure2]
AS
BEGIN
-- Declare Variable
DECLARE @Col1 VARCHAR(4);
DECLARE @Col2 VARCHAR(50);
-- Declare Parameter
DECLARE @pParameter1 VARCHAR(2);
DECLARE @pParameter2 CURSOR; -- for OUTPUT
EXEC [procedure1] @pParameter1,@pParameter2 OUTPUT
FETCH NEXT FROM @pParameter2
INTO @Col1, @Col2
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @Col1 + ' ' + @Col2
FETCH NEXT FROM @pParameter2 INTO @Col1, @Col2
END
END
Example : ตัวอย่างการใช้ CURSOR การรับ-ส่งระหว่าง Stored Procedure
Procedure : getByCountry
USE [mydatabase]
GO
/****** Object: StoredProcedure [dbo].[getByCountry] Script Date: 11/27/2015 11:26:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[getByCountry]
@pCountryCode VARCHAR(2),
@pCursorCustomer CURSOR VARYING OUTPUT
AS
BEGIN
-- Return cursor
SET @pCursorCustomer = CURSOR FORWARD_ONLY STATIC FOR
SELECT * FROM CUSTOMER WHERE COUNTRY_CODE = @pCountryCode;
OPEN @pCursorCustomer;
END
Procedure : getCustomer
USE [mydatabase]
GO
/****** Object: StoredProcedure [dbo].[getCustomer] Script Date: 11/27/2015 11:07:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[getCustomer]
AS
BEGIN
-- Declare Variable
DECLARE @sCustomerID VARCHAR(4);
DECLARE @sName VARCHAR(50);
DECLARE @sEmail VARCHAR(50);
DECLARE @sCountryCode VARCHAR(2);
DECLARE @dBudget DECIMAL(18,2);
DECLARE @dUsed DECIMAL(18,2);
-- Declare Parameter
DECLARE @pCountryCode VARCHAR(2);
SET @pCountryCode = 'US';
DECLARE @pCursorCustomer CURSOR; -- for OUTPUT
EXEC [getByCountry] @pCountryCode,@pCursorCustomer OUTPUT
FETCH NEXT FROM @pCursorCustomer
INTO @sCustomerID, @sName, @sEmail, @sCountryCode, @dBudget,@dUsed
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @sCustomerID + ' ' + @sName + ' ' + @sEmail
FETCH NEXT FROM @pCursorCustomer INTO @sCustomerID, @sName, @sEmail, @sCountryCode, @dBudget,@dUsed
END
END
จากตัวอย่างนี้จะมีการ getCustomer() จะมีการเรียกใช้งานหรือ EXEC โปรซีเยอร์ getByCountry() ซึ่มีค่า OUTPUT แบบ CURSOR และนำค่าที่ได้มา Loop ใช้งาน
EXEC [getCustomer]
Result
จากตัวอย่างจะมีการ Loop ค่า Cursor ที่ได้มาจาก getByCountry
|