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

tch*_*ore 11 mysql stored-procedures if-statement

我正在编写一个使用多个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;
Run Code Online (Sandbox Code Playgroud)

错误:

您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便'IF agency IS NULL THEN INSERT INTO orgs (org_name,org_name_length,org_type,'在第53行附近使用正确的语法

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

Joh*_*ica 22

就我所见,你遇到了一些问题:

  1. 正如大卫指出的那样,每一个陈述都需要以a来终止 ;
  2. 如果你这样做SELECT,最好确保它只能通过做一个选择一个值LIMIT 1; 如果你有一个聚合函数,min()那么只有一个值可以出来.
  3. 如果您使用CREATE PROCEDURE ...语法编写过程,请不要忘记DELIMITER $$CREATE PROCEDURE ... END $$正文和DELIMITER ;之后设置.
  4. 如果IF THEN ... END IF块内有多个语句,最好将它们放在一个BEGIN ... END;块中.
  5. 如果你有一个返回值,比如代理商,那么为什么不把它变成一个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 ;
Run Code Online (Sandbox Code Playgroud)