Ответ 1
У вас есть несколько вопросов, насколько я могу видеть:
- Как указывал Дэвид, каждое утверждение должно быть завершено с помощью
;
- Если вы выполните
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 ;