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

时间:2011-05-12 19:46:43

标签: mysql stored-procedures if-statement

我正在编写一个使用多个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;

错误:

  

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

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

2 个答案:

答案 0 :(得分:21)

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

  1. 正如大卫指出的那样,每个陈述都需要由;
  2. 终止
  3. 如果您执行SELECT,最好确保只能通过LIMIT 1选择一个值;如果你有一个像min()这样的聚合函数,那么只能出现一个值。
  4. 如果您使用CREATE PROCEDURE ...语法编写程序,请不要忘记在DELIMITER $$正文之前设置CREATE PROCEDURE ... END $$并在之后设置DELIMITER ;
  5. 如果您的IF THEN ... END IF块中有多个语句,最好将它们放在BEGIN ... END;块中。
  6. 如果您有返回值,例如此处的代理机构,为什么不将其设为FUNCTION name (arg1: INTEGER) RETURNS INTEGER而不是PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)。该功能更加通用。
  7. 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 ;
    

答案 1 :(得分:2)

第一次SET语句后没有分号。