2013-07-18 3 views
1

Я пытаюсь создать процедуру на mysql, это не так сложно, но при использовании «если» вещи сходят с ума, в нем говорится, что есть ошибка, но я не могу понять. Вот оно:mysql if Синтаксис ОШИБКА

CREATE SP_Verify_DATE (IN comp INT,IN prod INT,IN qt INT) 
BEGIN 
SELECT COUNT(cd_compra) INTO @tes FROM produto_compra WHERE cd_produto=prod AND cd_compra=comp; 

IF (@tes = 1) THEN 

UPDATE produto_compra WHERE cd_produto=prod AND cd_compra=comp SET qt_produto = qt_produto + qt; 
ELSE 

INSERT INTO produto_compra VALUES(comp,prod,qt); 

END IF; 

END 

Большое спасибо peterm !!! работает !!!! что я потерял 2 ночи, пытаясь найти ошибку, и ваша идеология лучше, чем моя процедура, которую я использовал, еще раз спасибо!

+0

Что сообщение об ошибке? –

ответ

2

Есть несколько проблем с кодом:

  1. Вы должны использовать CREATE PROCEDURE вместо просто CREATE;
  2. Неправильный синтаксис UPDATE. SET до WHERE статья.
  3. Вам нужно изменить DELIMITER

Попробуйте

DELIMITER $$ 
CREATE PROCEDURE SP_Verify_DATE (IN comp INT, IN prod INT, IN qt INT) 
BEGIN 
    SELECT COUNT(cd_compra) 
    INTO @tes 
    FROM produto_compra 
    WHERE cd_produto=prod 
    AND cd_compra=comp; 

    IF (@tes = 1) THEN 
    UPDATE produto_compra 
     SET qt_produto = qt_produto + qt 
    WHERE cd_produto=prod AND cd_compra=comp; 
    ELSE 
    INSERT INTO produto_compra VALUES(comp,prod,qt); 
    END IF; 
END$$ 
DELIMITER ; 

Другие, чем ваш код ОК.

Вот SQLFiddle демо


Теперь вы можете сводиться все к только одной инструкции вставки, если у вас есть или если вы определяете уникальный индекс (cd_produto, cd_compra) (и следуя логике кода вы должны иметь такое ограничение), используя INSERT INTO ... ON DUPLICATE KEY UPDATE синтаксис

CREATE PROCEDURE SP_Verify_DATE (IN comp INT, IN prod INT, IN qt INT) 
    INSERT INTO produto_compra (cd_produto, cd_compra, qt_produto) 
    VALUES(comp, prod, qt) 
    ON DUPLICATE KEY UPDATE qt_produto = qt_produto + VALUES(qt_produto); 

Поскольку это один-оператор SP теперь вам даже не нужно использовать BEGIN ... END блок и разделитель изменений.

Очевидно, что если вам нужно полностью отказаться от хранимой процедуры и использовать такую ​​инструкцию для вставки самостоятельно.

Вот SQLFiddle демо

Смежные вопросы