2017-12-08 2 views
1

単純なプロシージャを作成しようとしていますが、最初のパラメータで構文エラーが発生しています。最高の私はCREATE PROCEDUREの構文を正しく従っていると私は言うことができます。プロシージャパラメータのMySql構文エラー

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...."の構文エラーが表示されます。私は、私がそれらの範囲で完全にはっきりしていないので、より多くのデリミタエラーに遭遇するかもしれないと思った。もしそれが問題であれば、プロシージャの新しい行にエラーがあり、セミコロンを理解できなかったときはパラメータ宣言ではなく、エラーであると思います。

+0

ただ、 '@'を削除します。 –

答えて

1

すべてのパラメータとローカル変数の前に@を入れるというMicrosoft SQL Serverの規則を使用しています。 MySQLはこれをしません。

MySQL構文では、手続きパラメータにsigilはありません。

また、パラメータは通常INまたはOUTまたはINOUTと宣言されています。 @印章を持って

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

MySQLの変数はセッション変数です。

も参照してください:MySQLで

0

、@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