2011-05-12 22 views
11

मैं एक संग्रहित प्रक्रिया लिख ​​रहा हूं जो एकाधिक IF/THEN कथन का उपयोग करता है, यदि वे सत्य का मूल्यांकन करते हैं तो एकाधिक क्वेरी निष्पादित करने की आवश्यकता होती है। समस्या यह है कि, मुझे उपयुक्त वाक्यविन्यास के कोई उदाहरण नहीं मिल रहे हैं। MySQL dev handbook से, ऐसा लगता है कि मुझे "कथन_सूची" में कई प्रश्न हो सकते हैं, लेकिन अब तक मैं इसे काम नहीं कर सकता।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. डेविड के रूप में बताया, हर बयान एक ;
  2. द्वारा समाप्त किया जा करने के लिए आप एक SELECT करते हैं, बेहतर सुनिश्चित करें की जरूरत है यह केवल LIMIT 1 करके एक मान का चयन कर सकता है; यदि आपके पास min() जैसे कुल फ़ंक्शन हैं तो केवल एक मान ही आ सकता है।
  3. यदि आप CREATE PROCEDURE ... सिंटैक्स का उपयोग कर प्रक्रिया लिख ​​रहे हैं, तो शरीर और DELIMITER ; से पहले DELIMITER $$ सेट करना न भूलें।
  4. यदि आपके IF THEN ... END IF ब्लॉक के अंदर कई कथन हैं, तो उन्हें BEGIN ... END; ब्लॉक के अंदर रखना अच्छा विचार है।
  5. यदि आपके पास वापसी मूल्य है, तो यहां एजेंसी की तरह, PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) के बजाय इसे FUNCTION name (arg1: INTEGER) RETURNS 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

2

आपके पहले एसईटी स्टेटमेंट के बाद कोई अर्धविराम नहीं।

संबंधित मुद्दे