Помощь по объединению и хранимым процедурам MySQL - PullRequest
0 голосов
/ 12 мая 2011

Я (пытаюсь) написать хранимую процедуру 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' - это переменная, которую я объявляю в начале процедуры, а затем назначается динамически с помощью курсора, который проходит мои промежуточные данные. Полную хранимую процедуру можно посмотреть здесь .

Я уверен, что упускаю что-то простое и буду признателен за любую помощь.

1 Ответ

1 голос
/ 12 мая 2011

Попробуйте обернуть еще один () вокруг внутренних SELECT операторов в ваших COALESCE аргументах.В противном случае они обрабатываются не как подзапросы, которые должны выполняться первыми, а возвращаемое значение, а как объекты запроса, передаваемые в COALESCE, который не является допустимым типом аргумента для COALESCE:

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