メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

การใช้งาน Stored Procedure เบื้องต้น

บทความนี้แนะนำ Stored Procedure ใน MySQL ซึ่งเป็นชุดคำสั่ง SQL ที่ถูกจัดเก็บไว้ในฐานข้อมูล ทำให้สามารถเรียกใช้งานได้ง่ายและมีประสิทธิภาพมากกว่าการส่ง SQL statem...

การใช้งาน Stored Procedure เบื้องต้น

ในบทเรียนนี้ เราจะมาเรียนรู้เกี่ยวกับ Stored Procedure ใน MySQL ซึ่งเป็นเครื่องมือสำคัญในการจัดการฐานข้อมูลที่มีประสิทธิภาพและช่วยให้โค้ดของเราเป็นระเบียบมากยิ่งขึ้น Stored Procedure คือชุดคำสั่ง SQL ที่ถูกจัดเก็บไว้ในฐานข้อมูล ทำให้เราสามารถเรียกใช้งานชุดคำสั่งเหล่านี้ได้ง่ายๆ เพียงแค่เรียกชื่อ Stored Procedure แทนที่จะต้องเขียนชุดคำสั่ง SQL ซ้ำๆ ทุกครั้ง

Stored Procedure คืออะไร?

Stored Procedure เปรียบเสมือนฟังก์ชันหรือ subroutine ในภาษาโปรแกรมอื่นๆ เป็นกลุ่มของคำสั่ง SQL ที่ถูกคอมไพล์และจัดเก็บไว้ในฐานข้อมูล เมื่อเราเรียกใช้ Stored Procedure MySQL จะทำการ execute ชุดคำสั่งที่ถูกจัดเก็บไว้ ทำให้การทำงานรวดเร็วและมีประสิทธิภาพมากกว่าการส่งชุดคำสั่ง SQL ไปยัง Server ทุกครั้ง

ข้อดีของการใช้ Stored Procedure:

  • Reuseability: สามารถเรียกใช้งานชุดคำสั่ง SQL เดิมได้หลายครั้ง โดยไม่ต้องเขียนโค้ดซ้ำ
  • Security: สามารถกำหนดสิทธิ์การเข้าถึง Stored Procedure ได้ ทำให้ควบคุมการเข้าถึงข้อมูลได้ดีขึ้น
  • Performance: Stored Procedure ถูกคอมไพล์และจัดเก็บไว้ใน Server ทำให้การทำงานรวดเร็วกว่าการส่ง SQL statements ทีละชุด
  • Maintainability: การแก้ไขชุดคำสั่ง SQL ทำได้ง่าย เพียงแค่แก้ไข Stored Procedure ที่เดียว

ข้อเสียของการใช้ Stored Procedure:

  • Debugging: การ Debug Stored Procedure อาจทำได้ยากกว่าการ Debug SQL statements ธรรมดา
  • Portability: Stored Procedure อาจแตกต่างกันไปในแต่ละ Database Management System (DBMS) ทำให้การย้ายฐานข้อมูลอาจต้องปรับแก้ Stored Procedure

CREATE PROCEDURE

คำสั่ง CREATE PROCEDURE ใช้เพื่อสร้าง Stored Procedure ใน MySQL รูปแบบคำสั่งพื้นฐานคือ:

CREATE PROCEDURE procedure_name (
    [IN | OUT | INOUT] parameter_name data_type[,...]
)
BEGIN
    -- SQL statement(s)
END;

คำอธิบาย:

  • procedure_name: ชื่อของ Stored Procedure
  • parameter_name: ชื่อของ parameter ที่ Stored Procedure รับ (optional)
  • data_type: ชนิดข้อมูลของ parameter (เช่น INT, VARCHAR, DATE)
  • IN: parameter ที่ส่งค่าเข้าไปใน Stored Procedure (ค่าเริ่มต้น)
  • OUT: parameter ที่ส่งค่าออกจาก Stored Procedure
  • INOUT: parameter ที่ส่งค่าเข้าไปและออกจาก Stored Procedure
  • BEGIN ... END: บล็อกที่เก็บชุดคำสั่ง SQL

ตัวอย่าง:

สมมติว่าเราต้องการสร้าง Stored Procedure ที่รับค่า id ของลูกค้าและแสดงข้อมูลของลูกค้าคนนั้น

DELIMITER //  -- เปลี่ยน delimiter ชั่วคราว

CREATE PROCEDURE GetCustomerById (
    IN customer_id INT
)
BEGIN
    SELECT * FROM Customers WHERE id = customer_id;
END //

DELIMITER ;  -- คืนค่า delimiter เดิม

คำอธิบาย:

  • DELIMITER // และ DELIMITER ; ใช้เพื่อเปลี่ยน delimiter ชั่วคราว เนื่องจาก Stored Procedure มี ; อยู่ภายใน ทำให้ MySQL เข้าใจผิดว่าคำสั่งสิ้นสุดก่อนเวลาอันควร การเปลี่ยน delimiter เป็น // (หรืออย่างอื่นที่ไม่ใช่ ;) ช่วยให้ MySQL เข้าใจว่า Stored Procedure ยังไม่สิ้นสุดจนกว่าจะเจอ //
  • GetCustomerById คือชื่อของ Stored Procedure
  • IN customer_id INT คือ parameter ที่รับค่า id ของลูกค้าเข้ามา
  • SELECT * FROM Customers WHERE id = customer_id; คือ SQL statement ที่ดึงข้อมูลลูกค้าจากตาราง Customers โดยใช้ customer_id เป็นเงื่อนไข

เหตุผลเชิงออกแบบ: การใช้ parameter IN ทำให้ Stored Procedure สามารถรับค่าจากภายนอกได้ ซึ่งทำให้มีความยืดหยุ่นและสามารถนำไปใช้กับลูกค้าคนอื่นๆ ได้

CALL

คำสั่ง CALL ใช้เพื่อเรียกใช้งาน Stored Procedure รูปแบบคำสั่งคือ:

CALL procedure_name(argument_list);

คำอธิบาย:

  • procedure_name: ชื่อของ Stored Procedure ที่ต้องการเรียกใช้งาน
  • argument_list: ค่าที่ส่งให้กับ parameter ของ Stored Procedure (ถ้ามี)

ตัวอย่าง:

หากต้องการเรียกใช้งาน Stored Procedure GetCustomerById ที่เราสร้างไว้ก่อนหน้านี้ โดยส่งค่า 1 เป็น customer_id:

CALL GetCustomerById(1);

คำสั่งนี้จะแสดงข้อมูลของลูกค้าที่มี id เท่ากับ 1 จากตาราง Customers

ตัวอย่างการใช้ OUT parameter:

สมมติว่าเราต้องการสร้าง Stored Procedure ที่นับจำนวนลูกค้าทั้งหมดในตาราง Customers และส่งค่ากลับมา

DELIMITER //

CREATE PROCEDURE GetTotalCustomers (
    OUT total INT
)
BEGIN
    SELECT COUNT(*) INTO total FROM Customers;
END //

DELIMITER ;

คำอธิบาย:

  • OUT total INT คือ parameter ที่ใช้ส่งค่าจำนวนลูกค้ากลับออกมา
  • SELECT COUNT(*) INTO total FROM Customers; คือ SQL statement ที่นับจำนวนลูกค้าและเก็บค่าไว้ใน parameter total

ในการเรียกใช้งาน Stored Procedure นี้ เราจะต้องประกาศตัวแปรเพื่อรับค่าที่ส่งออกมา:

SET @total_customers = 0;  -- ประกาศตัวแปร

CALL GetTotalCustomers(@total_customers);  -- เรียกใช้ Stored Procedure

SELECT @total_customers;  -- แสดงค่า

คำอธิบาย:

  • SET @total_customers = 0; ประกาศตัวแปร @total_customers เพื่อเก็บค่าที่ส่งออกมาจาก Stored Procedure
  • CALL GetTotalCustomers(@total_customers); เรียกใช้ Stored Procedure และส่งตัวแปร @total_customers ไปให้
  • SELECT @total_customers; แสดงค่าที่อยู่ในตัวแปร @total_customers ซึ่งเป็นจำนวนลูกค้าทั้งหมด

เหตุผลเชิงออกแบบ: การใช้ OUT parameter ช่วยให้ Stored Procedure สามารถส่งค่ากลับออกมาได้ ทำให้สามารถใช้ Stored Procedure ในการคำนวณหรือประมวลผลข้อมูลต่างๆ และส่งผลลัพธ์กลับมาใช้งานต่อได้

การนำ Code กลับมาใช้ซ้ำ

Stored Procedure ช่วยให้เราสามารถนำโค้ด SQL กลับมาใช้ซ้ำได้ง่าย โดยการสร้าง Stored Procedure ที่ทำหน้าที่เฉพาะอย่าง แล้วเรียกใช้งาน Stored Procedure นั้นจากที่ต่างๆ ในโปรแกรมของเรา

ตัวอย่าง:

สมมติว่าเรามีฟังก์ชันที่ต้องใช้บ่อยๆ คือการตรวจสอบว่าลูกค้ามี Order หรือไม่ เราสามารถสร้าง Stored Procedure เพื่อทำหน้าที่นี้ได้:

DELIMITER //

CREATE PROCEDURE CustomerHasOrders (
    IN customer_id INT,
    OUT has_orders BOOLEAN
)
BEGIN
    SELECT COUNT(*) > 0 INTO has_orders FROM Orders WHERE customer_id = customer_id;
END //

DELIMITER ;

จากนั้นเราสามารถเรียกใช้งาน Stored Procedure นี้จากที่ต่างๆ ในโปรแกรมของเรา:

SET @customer_id = 1;
SET @has_orders = FALSE;

CALL CustomerHasOrders(@customer_id, @has_orders);

IF @has_orders THEN
    SELECT 'Customer has orders';
ELSE
    SELECT 'Customer has no orders';
END IF;

เหตุผลเชิงออกแบบ: การสร้าง Stored Procedure เพื่อทำหน้าที่เฉพาะอย่าง ทำให้โค้ดของเราเป็น modular มากขึ้น และง่ายต่อการบำรุงรักษา หากมีการเปลี่ยนแปลงในฟังก์ชันการตรวจสอบว่าลูกค้ามี Order หรือไม่ เราก็เพียงแค่แก้ไข Stored Procedure ที่เดียว แทนที่จะต้องแก้ไขโค้ดในหลายๆ ที่

แนวปฏิบัติที่ดี:

  • ตั้งชื่อ Stored Procedure ให้สื่อความหมาย
  • เขียน comment อธิบายการทำงานของ Stored Procedure
  • ใช้ parameter ที่มีชื่อสื่อความหมาย
  • หลีกเลี่ยงการใช้ SELECT * ใน Stored Procedure หากไม่จำเป็น
  • จัดการ error ใน Stored Procedure อย่างเหมาะสม

สรุป: Stored Procedure เป็นเครื่องมือที่มีประโยชน์ในการจัดการฐานข้อมูล MySQL ช่วยให้เราสามารถนำโค้ดกลับมาใช้ซ้ำ ปรับปรุงประสิทธิภาพ และเพิ่มความปลอดภัยให้กับโปรแกรมของเรา การเรียนรู้และใช้งาน Stored Procedure เป็นสิ่งสำคัญสำหรับนักพัฒนาที่ต้องการสร้างระบบฐานข้อมูลที่มีประสิทธิภาพและบำรุงรักษาง่าย

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る