#mysql #if-statement #not-exists
Вопрос:
Я работаю на SQL Server, но сейчас разрабатываю на базе MySQL. У меня есть хранимая процедура, с помощью которой я хотел бы содержать следующую конструкцию:
DROP PROCEDURE IF EXISTS CreateLicence;
DELIMITER //
CREATE PROCEDURE CreateLicence
(OUT pLicenceID INT,
INOUT pUsrID INT,
INOUT pMethodCode VARCHAR(10),
INOUT pPaymentReference VARCHAR(50),
INOUT pPaymentAmount DECIMAL(13, 2),
INOUT pProductCode VARCHAR(5),
OUT pMessage VARCHAR(200)
)
/*
Creates a new user record, which needs to have its email verified.
*/
entire_sproc:
BEGIN
DECLARE vRecCount INT;
START TRANSACTION;
-- is the MethodCode valid?
IF (pMethodCode <> 'PAYPAL') THEN
BEGIN
ROLLBACK;
SET pMessage = 'Invalid MethodCode.';
SET pLicenceID = NULL;
LEAVE entire_sproc;
END IF;
-- is the ProductCode valid?
IF (NOT EXISTS (SELECT ProductCode FROM Product WHERE ProductCode = pProductCode)) THEN
BEGIN
ROLLBACK;
SET pMessage = 'Invalid ProductCode.';
SET pLicenceID = NULL;
LEAVE entire_sproc;
END IF;
INSERT INTO Licence
(UsrID,
MethodCode,
Status,
PaymentReference,
PaymentDateTime,
PaymentAmount,
ProductCode)
VALUES
(pUsrID,
pMethodCode,
'UNAPPLIED',
pPaymentReference,
NOW(),
pPaymentAmount,
pProductCode);
SET pLicenceID = (SELECT LAST_INSERT_ID());
COMMIT;
END;
//
DELIMITER ;
Я получаю эту ошибку во время компиляции:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'IF;
-- is the ProductCode valid?
IF (NOT EXISTS (SELECT ProductC...' at line 27
Что такого недопустимого в этой конструкции SQL? Как мне проверить наличие записи в IF…ТОГДА заявление?
Комментарии:
1. Что у тебя есть до этого? Убедитесь, что вы закончили предыдущее утверждение
;
.2.Научитесь завершать все заявления, как прокомментировал @Barмар. Также: Синтаксис
IF <condition> THEN <some statements> END IF;
(как и в большинстве процедурных расширений СУБД), а неIF <condition> BEGIN <some statements> END;
(более или менее исключительно в SQL Server и, возможно, в Sysbase). Хотя, все же бессмысленно, можетBEGIN ... END
быть, внутриTHEN
будет разрешен блок иEND IF
.3. @stickybit Прокрутите вправо, есть
THEN
. Но это действительно нужноEND IF
послеEND
.4. @Бармар: Да, я это уже видел. Но есть, как вы также заметили, нет
END IF;
, по крайней мере, не в показанном коде.5. Я изменил, чтобы включить весь код хранимой процедуры и ошибку.
Ответ №1:
Оператор IF не требует начала. Синтаксис, который я использовал выше, таков:
IF <condition> THEN
BEGIN
END IF;
Это должно было быть:
IF <condition> THEN
END IF;