MySQL: операторы IF / THEN в хранимых процедурах
Я пишу хранимую процедуру, которая использует несколько операторов IF / THEN, которые также должны выполнять несколько запросов, если они оцениваются как true. Проблема в том, что я не могу найти примеров соответствующего синтаксиса. От MySQL dev руководство, похоже, у меня может быть несколько запросов в "statement_list", но пока я не могу заставить его работать.
вот что я пытаюсь сделать:
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;
ошибки:
у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с
'IF agency IS NULL THEN INSERT INTO orgs (org_name,org_name_length,org_type,'
в строке 53
какие идеи? Я знаю, что это должно быть что-то простое, поэтому я был бы очень признателен за чей-либо вклад.
2 ответов
у вас есть несколько вопросов, Насколько я вижу:
- как отметил Дэвид, каждое утверждение должно быть прекращено
;
- если вы
SELECT
, лучше убедитесь, что он может выбрать только одно значение, выполнивLIMIT 1
; если у вас есть агрегатная функция, какmin()
тогда может выйти только одно значение. - если вы пишете процедуру, используя
CREATE PROCEDURE ...
синтаксис, не забудьте установитьDELIMITER $$
доCREATE PROCEDURE ... END $$
тело иDELIMITER ;
после. - если у вас есть несколько инструкций внутри
IF THEN ... END IF
блок, это хорошая идея, чтобы поместить их внутриBEGIN ... END;
блок. - если у вас есть возвращаемое значение, как Агентство здесь, почему бы не сделать его
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 ;