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

12

我正在编写一个存储过程,其中使用了多个IF/THEN语句,如果它们评估为真,则还需要执行多个查询。问题是,我似乎找不到适当语法的示例。根据MySQL开发手册,似乎可以在“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服务器版本对应的手册,以获取在第53行使用正确语法的方法,例如:'IF agency IS NULL THEN INSERT INTO orgs (org_name,org_name_length,org_type,'

有任何想法吗?我知道这肯定是一些简单的东西,所以非常感谢大家的帮助。

2个回答

23

我看到了几个问题:

  1. 正如David指出的那样,每个语句都需要以;结尾
  2. 如果你执行SELECT查询语句,最好通过使用LIMIT 1来确保只能选择一个值; 如果你有一个像min()这样的聚合函数,那么只有一个值可以输出。
  3. 如果你使用CREATE PROCEDURE ...语法编写过程,请不要忘记在CREATE PROCEDURE ... END $$体之前设置DELIMITER $$和在之后设置DELIMITER ;
  4. 如果你的IF THEN ... END IF块中有多个语句,最好将它们放在一个BEGIN ... END;块中。
  5. 如果你有一个返回值,例如这里的agency,为什么不将其设为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 ;

2

在第一个SET语句后不要加分号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接