Du har et par problemer, så vidt jeg kan se:
- Som David påpegede, skal hvert eneste udsagn afsluttes med en
;
- Hvis du laver en
SELECT
, sørg for, at den kun kan vælge én værdi ved at lave enLIMIT 1
; Hvis du har en samlet funktion sommin()
så kan der kun komme én værdi ud. - Hvis du skriver proceduren ved hjælp af
CREATE PROCEDURE ...
syntaks, glem ikke at indstilleDELIMITER $$
førCREATE PROCEDURE ... END $$
body og enDELIMITER ;
efter. - Hvis du har flere udsagn i din
IF THEN ... END IF
blok, er det en god idé at sætte dem i enBEGIN ... END;
blokere. - Hvis du har en returværdi, f.eks. bureau her, hvorfor så ikke gøre det til et
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
i stedet for etPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. Funktionen er meget mere alsidig.
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 ;