Per quanto posso vedere, hai riscontrato alcuni problemi:
- Come ha sottolineato David, ogni singola istruzione deve essere terminata da un
;
- Se esegui un
SELECT
, assicurati che possa selezionare solo un valore eseguendo unLIMIT 1
; Se hai una funzione aggregata comemin()
allora può uscire un solo valore. - Se scrivi la procedura usando il
CREATE PROCEDURE ...
sintassi, non dimenticare di impostareDELIMITER $$
prima delCREATE PROCEDURE ... END $$
corpo e unDELIMITER ;
dopo. - Se hai più istruzioni all'interno del tuo
IF THEN ... END IF
blocco, è una buona idea inserirli all'interno di unBEGIN ... END;
blocco. - Se hai un valore di ritorno, come l'agenzia qui, perché non renderlo un
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
invece di unPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. La funzione è molto più versatile.
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 ;