Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: แก้ไขข้อผิดพลาด "not a variable or NEW pseudo-variable" ใน Stored Procedure

ข้อผิดพลาด not a variable or NEW pseudo-variable ใน MySQL Stored Procedure เกิดขึ้นเมื่อพยายามใช้ตัวแปรผู้ใช้ (user-defined variable) ที่ไม่ได้ขึ้นต้นด้วย @ หรือใช้ตัวแปรในบริบทที่ไม่รองรับ

สาเหตุและวิธีแก้ไข

ใน Stored Procedure ต้องแยกเป็น 2 ประเภท:

  • ตัวแปรท้องถิ่น (Local Variable) - ประกาศด้วย DECLARE ใช้ได้เฉพาะใน procedure ไม่ต้องมี @
  • ตัวแปรผู้ใช้ (User Variable) - เริ่มต้นด้วย @ ใช้ได้ทั่ว session ต้องมี @

ข้อผิดพลาดมักเกิดเมื่อ:

  1. ใช้ @variable ใน DECLARE (ผิด - DECLARE ไม่ต้องมี @)
  2. ใช้ตัวแปรท้องถิ่นใน CALL ... INTO @var (ผิด - INTO ต้องเป็น user variable)
  3. อ้างอิง 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.colSET NEW.name = 'x';

ปฏิบัติตามกฎเหล่านี้จะหลีกเลี่ยงข้อผิดพลาด "not a variable or NEW pseudo-variable" ได้