0

大きなテキスト ファイルを解析する 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」は、プロシージャの最初に宣言する変数であり、ステージング データを通過するカーソルを使用して動的に割り当てられます。完全なストアド プロシージャは、ここで表示できます。

私は基本的な何かが欠けていると確信しており、助けていただければ幸いです。

4

1 に答える 1

1

引数()の内部SELECTステートメントを別のステートメントでラップしてみてください。COALESCEそれ以外の場合、最初に実行されて値が返されるサブクエリとしては扱われず、 に渡されるクエリ オブジェクトとして扱われますCOALESCE。これは、 の有効な引数の型ではありませんCOALESCE

 SET agency = COALESCE((SELECT ..), (SELECT ..))
于 2011-05-12T18:04:04.607 に答える