Kesalahan sintaksis MySql pada parameter prosedur

Saya mencoba menulis prosedur sederhana tetapi saya mengalami kesalahan sintaksis pada parameter pertama. Sejauh yang saya tahu, saya mengikuti sintaks CREATE PROCEDURE dengan benar.

Saya terbatas dalam mengakses database saya dengan phpMyAdmin. Ini skrip pembuatan yang saya coba jalankan:

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

Saya menggunakan opsi di phpMyAdmin untuk mengubah pembatas menjadi /.

Saya menerima kesalahan sintaksis "dekat '@id INT, @oldIndex INT....". Saya pikir saya mungkin menemukan lebih banyak kesalahan pembatas karena saya tidak sepenuhnya memahami cakupannya. Saya yakin jika itu masalahnya, kesalahannya akan terjadi pada baris baru dalam prosedur ketika gagal memahami titik koma, bukan pada deklarasi parameter.


person Fr33dan    schedule 08.12.2017    source sumber
comment
Hapus saja @.   -  person Paul Spiegel    schedule 08.12.2017


Jawaban (2)


Anda menggunakan konvensi Microsoft SQL Server yang menempatkan @ sebelum semua parameter dan variabel lokal. MySQL tidak melakukan ini.

Dalam sintaks MySQL, parameter prosedur tidak memiliki sigil.

Parameter juga biasanya dideklarasikan IN atau OUT atau INOUT.

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

Variabel MySQL yang memiliki tanda @ adalah variabel sesi.

Lihat juga:

person Bill Karwin    schedule 08.12.2017

Di MySQL, variabel @var adalah variabel tingkat sesi.

Gunakan variabel normal tanpa @ dan pastikan Anda tidak mengalami konflik dengan nama kolom:

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