2011-05-12 211 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語句後沒有分號。