2011-05-12 210 views
11

我在写一个使用多个IF/THEN语句的存储过程,如果它们的计算结果为true,也需要执行多个查询。问题是,我似乎无法找到合适语法的任何示例。从MySQL dev handbook看来,我似乎可以在“statement_list”中有多个查询,但到目前为止,我无法使其工作。存储过程中的MySQL:IF/THEN语句

这里就是我想要做的事:

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

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

回答

21

你有一些问题,据我可以看到:

  1. 正如David指出,每一个语句需要。如果你做一个SELECT要由;
  2. 终止,最好确保它只能通过执行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)。该功能更加通用。
 
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 ; 
+0

好极了,谢谢! – tchaymore 2011-05-13 02:27:52

2

您的第一个SET语句后没有分号。