Function (ฟังก์ชัน)
Function ในบริบทภาษาโปรแกรมคอมพิวเตอร์ คือ ชุดคำสั่งที่รับค่าอินพุต (Input) และดำเนินการงานเฉพาะเจาะจง ใน SQL Function จะ คืนค่า (Return Value) กลับไปเสมอ
Procedure (กระบวนงาน/ขั้นตอน)
Procedure ก็คือ ชุดคำสั่งที่รับอินพุตและดำเนินการงาน แต่ใน SQL Procedure ไม่คืนค่า (Return Control Only) ใน Java Procedure และ Function เรียกว่า Sub-routines คล้ายกัน
ตารางเปรียบเทียบความแตกต่างสำคัญ
| ลำดับ | หัวข้อ | Function | Procedure |
|---|---|---|---|
| 1 | นิยาม | ใช้คำนวณผลลัพธ์จากอินพุตที่ให้มา | ใช้ดำเนินการงานตามลำดับขั้นตอน |
| 2 | การเรียกใช้ (Call) | สามารถเรียกจาก Procedure ได้ | ไม่สามารถเรียกจาก Function ได้ |
| 3 | DML Statements | ไม่สามารถรัน INSERT/UPDATE/DELETE ได้ | รัน DML ได้ |
| 4 | ใช้ใน Query | เรียกใน SELECT/WHERE/ORDER BY ได้ | ไม่สามารถเรียกใน Query ได้ |
| 5 | การคอมไพล์ | คอมไพล์ทุกครั้งที่ถูกเรียก | คอมไพล์ครั้งเดียว เรียกซ้ำได้โดยไม่คอมไพล์ใหม่ |
| 6 | การคืนค่า | คืนค่าและ Control ให้ Caller | คืน Control เท่านั้น ไม่คืนค่า |
| 7 | Try-Catch | ไม่รองรับ | รองรับ Try-Catch Blocks |
| 8 | SELECT Statement | สามารถมี Function Call ได้ | ไม่สามารถมี Procedure Call ได้ |
| 9 | Transaction Handling | ไม่สามารถจัดการ Transaction เองได้ | จัดการ Transaction เองได้ (Explicit) |
สรุปการเลือกใช้
- ใช้ Function เมื่อ: ต้องการคำนวณค่า คืนค่ากลับ ใช้ใน Query ได้ ตรรกะไม่ซับซ้อน
- ใช้ Procedure เมื่อ: ต้องการดำเนินการหลายขั้นตอน (Business Logic) มี DML/Transaction ไม่ต้องคืนค่า ต้องการ Error Handling
ตัวอย่างใน MySQL
-- Function
CREATE FUNCTION CalculateTax(amount DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
RETURN amount * 0.07;
-- Procedure
CREATE PROCEDURE ProcessOrder(IN order_id INT, OUT status VARCHAR(20))
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(price) INTO total FROM order_items WHERE order_id = order_id;
IF total > 1000 THEN
UPDATE orders SET status = 'APPROVED' WHERE id = order_id;
SET status = 'SUCCESS';
ELSE
SET status = 'REJECTED';
END IF;
END;