[英]MySQL: IF / THEN statements in stored procedures
我正在编写一个使用多个IF / THEN语句的存储过程,如果它们的计算结果为true,则还需要执行多个查询。 问题是,我似乎无法找到任何适当语法的例子。 从MySQL dev手册中 ,似乎我可以在“statement_list”中有多个查询,但到目前为止我无法使其工作。
这是我正在尝试做的事情:
SET agency =
COALESCE((SELECT org_agency_o_id
FROM orgs_agencies
WHERE org_agency_code = maj_agency_cat)
,(SELECT min(org_id)
FROM orgs
WHERE org_name LIKE CONCAT('U.S.',SUBSTRING(maj_agency_cat,5))))
IF agency IS NULL THEN
-- execute multiple queries
INSERT INTO orgs (org_name
,org_name_length
,org_type
,org_sub_types)
VALUES (CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5))
,LENGTH(CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5)))
,'org','Org,GovernmentEntity,Federal,Agency');
SET agency = LAST_INSERT_ID();
END IF;
错误:
您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在
'IF agency IS NULL THEN INSERT INTO orgs (org_name,org_name_length,org_type,'
第53行)附近使用正确的语法
有任何想法吗? 我知道它必须是简单的东西,所以我非常感谢任何人的意见。
就我所见,你遇到了一些问题:
;
SELECT
,最好确保它只能通过LIMIT 1
选择一个值; 如果你有像min()
这样的聚合函数,那么只有一个值可以出来。 CREATE PROCEDURE ...
语法编写过程,请不要忘记在CREATE PROCEDURE ... END $$
主体和DELIMITER ;
之前设置DELIMITER $$
DELIMITER ;
后。 IF THEN ... END IF
块中有多个语句,最好把它们放在BEGIN ... END;
块。 FUNCTION name (arg1: INTEGER) RETURNS INTEGER
而不是PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
。 该功能更加通用。 DELIMITER $$
CREATE PROCEDURE name(arg1 INTEGER, arg2 INTEGER, ...)
BEGIN
SELECT SET agency =
COALESCE((SELECT org_agency_o_id
FROM orgs_agencies
WHERE org_agency_code = maj_agency_cat) LIMIT 1,
(SELECT min(org_id) FROM orgs
WHERE org_name LIKE CONCAT('U.S.',SUBSTRING(maj_agency_cat,5))));
IF agency IS NULL THEN BEGIN
-- execute multiple queries
INSERT INTO orgs (org_name
,org_name_length
,org_type
,org_sub_types)
VALUES (CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5))
,LENGTH(CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5)))
,'org','Org,GovernmentEntity,Federal,Agency');
SET agency = LAST_INSERT_ID();
END; END IF;
END $$
DELIMITER ;
在您的第一个SET语句后没有分号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.