2011-05-12 109 views
0

我(試圖)編寫一個解析大型文本文件的MySQL存儲過程。這個過程的一部分是檢查每個記錄中命名的實體(在本例中是政府承包商)是否已經包含在數據庫中。 (這是一個跟進到this question。)這是我的第一個存儲過程,所以我確信我在這裏試過了,我會很感激任何幫助。幫助MySQL合併和存儲過程

這就是我現在所擁有的(聲明變量後):

-- try and fetch first organization (a government agency) 
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))) 
-- check to see if that worked 
IF agency = NULL THEN 
    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; 
-- try and fetch second organization 
SET org = COALESCE(SELECT MIN(org_id) FROM orgs WHERE org_name IN (vendorname, vendoralternatename, vendorlegalorganizationname, vendordoingasbusinessname), SELECT MIN(org_alias_org_id) FROM orgs_aliases WHERE org_alias in (endorname, vendoralternatename, vendorlegalorganizationname, vendordoingasbusinessname)) 
IF org = NULL THEN 
    INSERT INTO orgs(org_name,org_name_length,org_type,org_sub_types,org_created) VALUES (vendorname,LENGTH(vendorname),'org','org',DATE()); 
    SET org = LAST_INSERT_ID(); 
END IF 

現在MySQL是上線拋出一個錯誤:

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))) 

「maj_agency_cat」是一個變量,我在過程開始時聲明,然後使用經過我的臨時數據的遊標動態分配。完整的存儲過程可以查看here

我敢肯定我錯過了一些基本的東西,並希望有任何幫助。

回答

1

嘗試圍繞COALESCE參數中的內部SELECT陳述圍繞另一個()。否則,他們不被視爲子查詢被執行第一和返回值,但作爲查詢對象傳遞到COALESCE,這是不是COALESCE有效的參數類型:

SET agency = COALESCE((SELECT ..), (SELECT ..)) 
+0

十分感謝!現在我需要弄清楚我的IF語句有什麼問題。 – tchaymore 2011-05-12 19:25:26

+1

@tchaymore:你需要使用'IF org IS NULL'。你不能直接比較'NULL',它永遠不會工作。 – mellamokb 2011-05-12 19:27:05

+0

這是有道理的,但仍然會拋出一個錯誤:您的SQL語法中有錯誤; INSERT INTO orgs(org_name,org_name_length,org_type,'at line 53 – tchaymore 2011-05-12 19:36:44