ตอนที่ 9 : การใช้พารามิเตอร์ชนิด OUT เพื่อส่งค่ากลับ (MySQL : Stored Procedure) |
ตอนที่ 10 : การใช้ OUTPUT และ OUT เพื่อส่งค่ากลับ MySQL : Stored Procedure) สำหรับค่า Parameters หรือ Variable ชนิดแบบ OUT เมื่อประกาศค่านี้แล้ว เมื่อทำการเรียกใช้งานระหว่าง Stored Procedure ด้วยกันเอง มันจะส่งค่ากลับมายังตัวแปรนั้น ๆ ด้วย ถ้าเข้าใจง่าย ๆ ก็เหมือนตัวแปรชนิด ByRef ในภาษายุคของ VB หรือจะสามารถส่งค่ากลับไปยัง Application ที่เรียกใช้งาน Stored Procedure ได้ เช่น นอกจากจะส่งค่า Result ที่ผ่านการ SELECT แล้ว ยังสามารถส่งค่า Parameters อื่น ๆ กลับไปอีกด้วย
โครงสร้างของตาราง customer และ country
Table : customer
Table : country
OUT Syntax
OUT Parameter_Name DataType(size) -- return this variable
Example 1 : ตัวอย่างการใช้ OUT เพื่อส่งกลับค่าตัวแปรระหว่าง Stored Procedure
สร้าง Stored Procedure ขึ้นมา 2 ตัวคือ getCustomerCount และ getCustomer
getCustomerCount
DROP PROCEDURE IF EXISTS getCustomerCount;
DELIMITER //
CREATE PROCEDURE getCustomerCount(IN pCountryCode VARCHAR(2),
OUT pCustomerCount INT)
BEGIN
# Count Customer by CountryCode
SELECT COUNT(*) INTO pCustomerCount FROM customer WHERE COUNTRY_CODE = pCountryCode;
END //
DELIMITER ;
ประกาศ Parameters ชื่อว่า pCustomerCount แบบ OUT และจะส่งค่านี้กลับไปยัง Stored ที่เรียกใช้งาน
getCustomer
DROP PROCEDURE IF EXISTS getCustomer;
DELIMITER //
CREATE PROCEDURE getCustomer(IN pCountryCode VARCHAR(2))
BEGIN
# Declare Variable
DECLARE pCustomerCount INT DEFAULT 0;
# Call stored procedure getCustomerCount
CALL getCustomerCount(pCountryCode,pCustomerCount); // call and return pCustomerCount
# Print
SELECT CONCAT('Customer Count = ',pCustomerCount);
END //
DELIMITER ;
pCustomerCount [จะส่งชื่อตัวแปรที่ไปยัง Stored เป็นแบบ OUTPUT แล้วมันจะถูกส่งค่ากลับมายังตัวแปรนี้
CALL getCustomer('US');
Result
Example 2 : ตัวอย่างการใช้ OUTPUT เพื่อส่งกลับค่าตัวแปรกลับไปยังตัวที่เรียกใช้งาน Stored
getCustomer
DROP PROCEDURE IF EXISTS getCustomer;
DELIMITER //
CREATE PROCEDURE getCustomer(IN pCountryCode VARCHAR(2),
OUT pRowFound INT)
BEGIN
# Return SELECT
SELECT * FROM customer WHERE COUNTRY_CODE = sCountryCode;
# Return pRowFound
SET pRowFound = FOUND_ROWS();
END //
DELIMITER ;
ประกาศ Parameters ชื่อว่า pRowFound แบบ OUT หรือ OUTPUT และจะส่งค่านี้กลับไปยังอะไรก็ตามที่เรียกใช้งาน Stored
SET @p0='US'; CALL `getCustomer`(@p0, @p1); SELECT @p1 AS `pRowFound`;
Result
จากตัวอย่างนี้จะส่งกลับมา 2 ค่าคือ ค่าที่ได้จากการ SELECT ข้อมูล และค่าที่ได้จาก Parameters
Example 3 : ตัวอย่างการใช้ OUTPUT เพื่อส่งค่ากลับมาตั้งแต่ 2 ค่าขึ้นไป
insertCustomer
DROP PROCEDURE IF EXISTS insertCustomer;
DELIMITER //
CREATE PROCEDURE insertCustomer(IN pCustomerID VARCHAR(4),
IN pName VARCHAR(150),
IN pEmail VARCHAR(150),
IN pCountryCode VARCHAR(2),
IN pBudget DECIMAL(18,2),
IN pUsed DECIMAL(18,2),
OUT pResult INT,
OUT pMessage VARCHAR(500))
BEGIN
# Declare Variable
DECLARE errCode CHAR(5) DEFAULT '00000';
DECLARE errMsg TEXT;
DECLARE effRows INT;
# Declare Handler Exception
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
errCode = RETURNED_SQLSTATE, errMsg = MESSAGE_TEXT;
END;
# Statement
INSERT INTO customer (CUSTOMER_ID, NAME, EMAIL, COUNTRY_CODE, BUDGET, USED)
VALUES (pCustomerID, pName, pEmail, pCountryCode, pBudget, pUsed);
# Set Result
IF errCode = '00000' THEN
GET DIAGNOSTICS effRows = ROW_COUNT;
SET pResult = effRows;
SET pMessage = 'Insert Data Successfully';
ELSE
SET pResult = 0;
SET pMessage = CONCAT('Error, Code = ',errCode,', Message = ',errMsg);
END IF;
END //
DELIMITER ;
ประกาศ Parameters ชื่อว่า pResult และ pMessage แบบ OUTPUT และจะส่งค่านี้กลับไปยังอะไรก็ตามที่เรียกใช้งาน Stored โดยส่งค่าผลลัพธ์ของการ Insert ข้อมูล และ Message ที่ส่งกลับ
SET @p0='C005'; SET @p1='Fun Wipa'; SET @p2='[email protected]'; SET @p3='TH'; SET @p4='100000'; SET @p5='0'; CALL `insertCustomer`(@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7); SELECT @p6 AS `pResult`, @p7 AS `pMessage`;
Result
กรณีที่ Insert ข้อมูลสำเสร็จ
กรณีที่ Insert ข้อมูลไม่สำเร็จ
|