Você tem alguns problemas até onde eu posso ver:
- Como David apontou, toda e qualquer instrução precisa ser encerrada por um
;
- Se você fizer um
SELECT
, certifique-se de que ele pode selecionar apenas um valor fazendo umLIMIT 1
; Se você tem uma função agregada comomin()
então apenas um valor pode sair. - Se você estiver escrevendo o procedimento usando o
CREATE PROCEDURE ...
sintaxe, não se esqueça de definirDELIMITER $$
antes doCREATE PROCEDURE ... END $$
corpo e umDELIMITER ;
depois. - Se você tiver várias instruções dentro de seu
IF THEN ... END IF
bloco, é uma boa idéia colocá-los dentro de umBEGIN ... END;
bloquear. - Se você tem um valor de retorno, como agência aqui, por que não torná-lo um
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
em vez de umPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. A função é muito mais versátil.
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 ;