ข้อผิดพลาดทางไวยากรณ์ MySql ในพารามิเตอร์ขั้นตอน

ฉันกำลังพยายามเขียนขั้นตอนง่ายๆ แต่พบข้อผิดพลาดทางไวยากรณ์ที่พารามิเตอร์แรก อย่างดีที่สุดที่ฉันสามารถบอกได้ว่าฉันกำลังติดตามไวยากรณ์ของ CREATE PROCEDURE อย่างถูกต้อง

ฉันถูกจำกัดให้เข้าถึงฐานข้อมูลของฉันด้วย phpMyAdmin นี่คือสคริปต์สร้างที่ฉันพยายามเรียกใช้:

DROP PROCEDURE IF EXISTS product_index_swap/
CREATE PROCEDURE product_index_swap (@id INT, @oldIndex INT, @newIndex INT)
BEGIN
    DECLARE @swapID;
    SET @swapID = (SELECT `id` FROM `product` WHERE `order_index` = @newIndex LIMIT 1);
    UPDATE `products` SET `order_index` = (CASE WHEN `id` = @id THEN @newIndex
                                                WHEN `id` = @swapID THEN @oldIndex END)
    WHERE `id` IN (@id, @swapID);
END

ฉันใช้ตัวเลือกบน phpMyAdmin เพื่อเปลี่ยนตัวคั่นเป็น /

ฉันได้รับข้อผิดพลาดทางไวยากรณ์ "ใกล้ '@id INT, @oldIndex INT...." ฉันคิดว่าฉันอาจพบข้อผิดพลาดเกี่ยวกับตัวคั่นมากกว่านี้เนื่องจากฉันยังไม่ชัดเจนในขอบเขตของข้อผิดพลาดเหล่านั้น ฉันเชื่อว่าหากนั่นเป็นปัญหา ข้อผิดพลาดจะขึ้นบรรทัดใหม่ในขั้นตอนเมื่อไม่สามารถเข้าใจเครื่องหมายอัฒภาค ไม่ใช่ที่การประกาศพารามิเตอร์


person Fr33dan    schedule 08.12.2017    source แหล่งที่มา
comment
เพียงลบ @   -  person Paul Spiegel    schedule 08.12.2017


คำตอบ (2)


คุณกำลังใช้แบบแผน Microsoft SQL Server ในการใส่ @ ก่อนพารามิเตอร์และตัวแปรท้องถิ่นทั้งหมด MySQL ไม่ทำเช่นนี้

ในไวยากรณ์ MySQL พารามิเตอร์ของโพรซีเดอร์ไม่มีสัญลักษณ์

โดยทั่วไปแล้วพารามิเตอร์จะถูกประกาศเป็น IN หรือ OUT หรือ INOUT

CREATE PROCEDURE product_index_swap (IN id INT, IN oldIndex INT, IN newIndex INT)
BEGIN
    DECLARE swapID;
    ...

ตัวแปร MySQL ที่มีเครื่องหมาย @ คือ ตัวแปรเซสชัน

ดูสิ่งนี้ด้วย:

person Bill Karwin    schedule 08.12.2017

ใน MySQL ตัวแปร @var คือตัวแปรระดับเซสชัน

ใช้ตัวแปรปกติโดยไม่มี @ และตรวจสอบให้แน่ใจว่าคุณไม่มีข้อขัดแย้งกับชื่อคอลัมน์:

CREATE PROCEDURE product_index_swap (in_id INT, in_oldIndex INT, in_newIndex INT)
BEGIN
    DECLARE v_swapID int;

    SELECT id into v_swapID
    FROM product 
    WHERE order_index = in_newIndex 
    LIMIT 1;

    UPDATE products
    SET order_index = CASE WHEN id = in_id THEN in_newIndex
                           WHEN id = v_swapID THEN in_oldIndex 
                      END
    WHERE id IN (in_id, v_swapID);
END
person slaakso    schedule 08.12.2017