gpt4 book ai didi

MySQL:存储过程中的 IF/THEN 语句

转载 作者:IT老高 更新时间:2023-10-29 00:19:53 24 4
gpt4 key购买 nike

我正在编写一个使用多个 IF/THEN 语句的存储过程,如果它们的计算结果为 true,则还需要执行多个查询。问题是,我似乎找不到任何合适语法的例子。来自 MySQL dev handbook ,似乎我可以在“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;

错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF agency IS NULL THEN
INSERT INTO orgs (org_name,org_name_length,org_type,'
at line 53

有什么想法吗?我知道它必须是一些简单的东西,所以我非常感谢任何人的意见。

最佳答案

据我所知,您遇到了一些问题:

  1. 正如 David 所指出的,每条语句都需要以 ;
  2. 结束
  3. 如果您执行SELECT,最好通过LIMIT 1 确保它只能选择一个值;如果您有像 min() 这样的聚合函数,那么只能得出一个值。
  4. 如果您使用 CREATE PROCEDURE ... 语法编写过程,请不要忘记在 CREATE PROCEDURE ... 之前设置 DELIMITER $$ END $$ 正文和 DELIMITER ; 之后。
  5. 如果您的IF THEN ... END IF block 中有多个语句,最好将它们放在BEGIN ... END; block 中。
  6. 如果你有一个返回值,比如这里的 agency,为什么不让它成为 FUNCTION name (arg1: INTEGER) RETURNS INTEGER 而不是 PROCEDURE name (IN arg1 INTEGER, OUT agency整数)。该功能更加通用。
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 ;

关于MySQL:存储过程中的 IF/THEN 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5983600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com