Je hebt een paar problemen voor zover ik kan zien:
- Zoals David aangaf, moet elke verklaring worden afgesloten met een
;
- Als je een
SELECT
doet , zorg er dan voor dat het maar één waarde kan selecteren door eenLIMIT 1
. te doen; Als je een verzamelfunctie hebt zoalsmin()
dan kan er maar één waarde uitkomen. - Als u de procedure schrijft met behulp van de
CREATE PROCEDURE ...
syntaxis, vergeet nietDELIMITER $$
in te stellen vóór deCREATE PROCEDURE ... END $$
body en eenDELIMITER ;
na. - Als je meerdere uitspraken hebt in je
IF THEN ... END IF
blok, is het een goed idee om ze in eenBEGIN ... END;
. te plaatsen blok. - Als u een retourwaarde heeft, zoals bureau hier, waarom maakt u er dan geen
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
van in plaats van eenPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. De functie is veel veelzijdiger.
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 ;