你有几个问题,我可以看到:

>正如大卫所指出的那样,每一个陈述都需要被终止.

>如果你做一个SELECT,最好确保它只能通过做LIMIT 1来选择一个值;如果您有一个聚合函数,如min(),那么只有一个值可以出来.

>如果使用CREATE PROCEDURE …语法编写过程,请不要忘记在CREATE PROCEDURE … END $$正文和DELIMITER之前设置DELIMITER $$;后.

>如果您的IF THEN … END IF块中有多个语句,则将它们放在BEGIN … END中是个好主意;块.

>如果你有一个返回值,就像这里的代理,为什么不使它成为一个FUNCTION名字(arg1:INTEGER)RETURNS INTEGER而不是一个PROCEDURE名称(IN arg1 INTEGER,OUT agency INTEGER).该功能更加通用.

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 ;