Soweit ich sehen kann, hast du ein paar Probleme:
- Wie David betonte, muss jede einzelne Anweisung mit einem
;
abgeschlossen werden - Wenn Sie ein
SELECT
machen , stellen Sie besser sicher, dass nur ein Wert ausgewählt werden kann, indem Sie einLIMIT 1
ausführen; Wenn Sie eine Aggregatfunktion wiemin()
haben dann kann nur ein Wert herauskommen. - Wenn Sie die Prozedur mit
CREATE PROCEDURE ...
schreiben Syntax, vergessen Sie nicht,DELIMITER $$
zu setzen vor demCREATE PROCEDURE ... END $$
body und einDELIMITER ;
nach. - Wenn Sie mehrere Anweisungen in Ihrem
IF THEN ... END IF
haben -Block, ist es eine gute Idee, sie in einenBEGIN ... END;
einzufügen blockieren. - Wenn Sie einen Rückgabewert haben, wie hier eine Agentur, warum machen Sie ihn nicht zu einem
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
anstelle einesPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. Die Funktion ist viel vielseitiger.
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 ;