【发布时间】:2021-10-20 10:36:42
【问题描述】:
我来自 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...THEN 语句中是否存在记录?
【问题讨论】:
-
在那之前你有什么?确保以
;结束上一条语句。 -
如@Barmar 评论的那样学习终止所有语句。另外:语法是
IF <condition> THEN <some statements> END IF;(就像在大多数DBMS 的程序扩展中一样),而不是IF <condition> BEGIN <some statements> END;(或多或少只在SQL Server 和可能的Sysbase 中)。虽然,也许BEGIN ... END块将被允许在THEN和END IF内,但毫无意义。 -
@stickybit 向右滚动,有
THEN。但在END之后确实需要END IF。 -
@Barmar:是的,我已经看到了。但是,正如您也注意到的那样,没有
END IF;,至少在显示的代码中没有。 -
我已经修改为包含存储过程的所有代码和错误。
标签: mysql if-statement not-exists