กฎการประกาศตัวแปรใน MySQL Stored Procedure
ใน MySQL DECLARE ตัวแปรต้องอยู่ ระหว่าง BEGIN ... END และต้องเป็น คำสั่งแรก ก่อนคำสั่งอื่นๆ (SET, SELECT, INSERT, ฯลฯ) ไม่สามารถประกาศกลางโค้ดได้
ตัวอย่างที่ถูกต้อง
mysql> DELIMITER //
mysql> CREATE PROCEDURE showVariablesValue()
-> BEGIN
-> DECLARE output VARCHAR(100); -- ต้องเป็นคำสั่งแรกใน BEGIN
-> SET output = 'Hello MySQL';
-> SELECT output;
-> END //
Query OK, 0 rows affected (0.25 sec)
mysql> DELIMITER ;
เรียกใช้ Procedure:
mysql> CALL showVariablesValue();
+-------------+
| output |
+-------------+
| Hello MySQL |
+-------------+
1 row in set (0.03 sec)
กฎสำคัญ
- ต้องอยู่ใน BEGIN ... END (Compound Statement)
- ต้องเป็นคำสั่งแรกๆ ก่อน SET, SELECT, IF, LOOP, ฯลฯ
- ประกาศหลายตัวแปรได้:
DECLARE a INT DEFAULT 0; DECLARE b VARCHAR(50); - รองรับ
DEFAULT valueตอนประกาศ - Scope = ภายใน BEGIN ... END Block นั้นๆ (Block-scoped)
ตัวอย่างผิด (Error)
CREATE PROCEDURE wrong()
BEGIN
SET @x = 1; -- ผิด: คำสั่งอื่นมาก่อน DECLARE
DECLARE y INT; -- Error: DECLARE not at start
SELECT y;
END;
ตัวแปรชนิดต่างๆ
| ประเภท | Syntax | Scope | คงอยู่นาน |
|---|---|---|---|
| Local Variable | DECLARE var TYPE [DEFAULT val]; | BEGIN...END Block | แค่ใน Procedure |
| User Variable | SET @var = value; | Session | จนกว่า Disconnect |
| System Variable | SET GLOBAL/SESSION var = value; | Global/Session | ตาม Scope |
| Parameter | CREATE PROC(IN/OUT/INOUT param TYPE) | Procedure Call | แค่ใน Call |
Best Practice
- ประกาศตัวแปรครบหมดที่ต้น Block ก่อน Logic
- ใช้ DEFAULT เพื่อป้องกัน NULL ไม่ตั้งใจ
- ตั้งชื่อชัดเจน:
v_count,v_name(Prefix v_) - หลีกเลี่ยงชื่อชนกับ Column Name (ใช้ Prefix)