ข้อผิดพลาด not a variable or NEW pseudo-variable ใน MySQL Stored Procedure เกิดขึ้นเมื่อพยายามใช้ตัวแปรผู้ใช้ (user-defined variable) ที่ไม่ได้ขึ้นต้นด้วย @ หรือใช้ตัวแปรในบริบทที่ไม่รองรับ
สาเหตุและวิธีแก้ไข
ใน Stored Procedure ต้องแยกเป็น 2 ประเภท:
- ตัวแปรท้องถิ่น (Local Variable) - ประกาศด้วย
DECLAREใช้ได้เฉพาะใน procedure ไม่ต้องมี @ - ตัวแปรผู้ใช้ (User Variable) - เริ่มต้นด้วย
@ใช้ได้ทั่ว session ต้องมี @
ข้อผิดพลาดมักเกิดเมื่อ:
- ใช้
@variableในDECLARE(ผิด - DECLARE ไม่ต้องมี @) - ใช้ตัวแปรท้องถิ่นใน
CALL ... INTO @var(ผิด - INTO ต้องเป็น user variable) - อ้างอิง
NEW.variableนอก trigger
ตัวอย่างที่ถูกต้อง: Stored Procedure กับ OUT Parameter
1. สร้างตาราง
CREATE TABLE StoredProcedureDemo (
Id INT,
Name VARCHAR(10)
);
INSERT INTO StoredProcedureDemo VALUES (1, 'John'), (2, 'Carol');
2. สร้าง Stored Procedure ที่มี OUT parameter
DELIMITER //
CREATE PROCEDURE Update_table(
IN p_Id INT,
IN p_Name VARCHAR(20),
OUT p_Message VARCHAR(50)
)
BEGIN
SET p_Message = 'DATABASE HAS BEEN UPDATED';
INSERT INTO StoredProcedureDemo VALUES (p_Id, p_Name);
END //
DELIMITER ;
IN- พารามิเตอร์เข้า (อ่านอย่างเดียว)OUT- พารามิเตอร์ออก (ส่งค่ากลับ) ไม่ต้องมี @
3. เรียกใช้ Procedure และรับค่ากลับใน User Variable (@)
CALL Update_table(3, 'Larry', @UserMessage);
4. ดูค่าที่ได้รับ
SELECT @UserMessage;
ผลลัพธ์:
+---------------------------+
| @UserMessage |
+---------------------------+
| DATABASE HAS BEEN UPDATED |
+---------------------------+
5. ตรวจสอบข้อมูลที่เพิ่มเข้ามา
SELECT * FROM StoredProcedureDemo;
+------+-------+
| Id | Name |
+------+-------+
| 1 | John |
| 2 | Carol |
| 3 | Larry |
+------+-------+
สรุปกฎสำคัญ
| บริบท | รูปแบบตัวแปร | ตัวอย่าง |
|---|---|---|
| DECLARE ใน SP | ไม่มี @ | DECLARE v_count INT; |
| SET ใน SP | ไม่มี @ (local) / มี @ (user) | SET v_count = 1; / SET @v = 1; |
| CALL ... INTO | ต้องมี @ | CALL sp(...) INTO @result; |
| OUT parameter | ไม่มี @ | OUT p_msg VARCHAR(50) |
| Trigger (NEW/OLD) | NEW.col / OLD.col | SET NEW.name = 'x'; |
ปฏิบัติตามกฎเหล่านี้จะหลีกเลี่ยงข้อผิดพลาด "not a variable or NEW pseudo-variable" ได้