【问题标题】:MySQL: IF / THEN statements in stored proceduresMySQL:存储过程中的 IF/THEN 语句
【发布时间】:2011-05-12 19:46:43
【问题描述】:

我正在编写一个使用多个 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,' 附近使用正确的语法

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

【问题讨论】:

    标签: mysql stored-procedures if-statement


    【解决方案1】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 2011-10-08
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        相关资源
        最近更新 更多