2017-12-08 1 views
1

간단한 프로 시저를 작성하려고하지만 첫 번째 매개 변수에서 구문 오류가 발생합니다. 가장 좋은 방법은 CREATE PROCEDURE의 구문을 올바르게 따르고 있다고 말할 수 있습니다.프로 시저 매개 변수에 MySql 구문 오류가 발생했습니다.

phpMyAdmin으로 데이터베이스에 액세스하는 것으로 제한됩니다. 여기에 생성 스크립트 나 실행하는 것을 시도하고있다 : 나는 /로 구분 기호를 변경하면 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 

.

"@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 
관련 문제