D'après ce que je peux voir, vous avez quelques problèmes :
- Comme l'a souligné David, chaque instruction doit être terminée par un
;
- Si vous faites un
SELECT
, assurez-vous qu'il ne peut sélectionner qu'une seule valeur en faisant unLIMIT 1
; Si vous avez une fonction d'agrégation commemin()
alors une seule valeur peut sortir. - Si vous écrivez la procédure en utilisant le
CREATE PROCEDURE ...
syntaxe, n'oubliez pas de définirDELIMITER $$
avant leCREATE PROCEDURE ... END $$
body et unDELIMITER ;
après. - Si vous avez plusieurs déclarations dans votre
IF THEN ... END IF
bloc, c'est une bonne idée de les mettre à l'intérieur d'unBEGIN ... END;
bloquer. - Si vous avez une valeur de retour, comme l'agence ici, pourquoi ne pas en faire un
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
au lieu d'unPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. La fonction est beaucoup plus polyvalente.
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 ;