Bạn có một số vấn đề theo như tôi thấy:
- Như David đã chỉ ra, mỗi và mọi câu lệnh cần được kết thúc bằng
;
- Nếu bạn thực hiện
SELECT
, tốt hơn hãy đảm bảo rằng nó chỉ có thể chọn một giá trị bằng cách thực hiệnLIMIT 1
; Nếu bạn có một hàm tổng hợp nhưmin()
thì chỉ một giá trị có thể xuất hiện. - Nếu bạn viết quy trình bằng
CREATE PROCEDURE ...
cú pháp, đừng quên đặtDELIMITER $$
trướcCREATE PROCEDURE ... END $$
nội dung và mộtDELIMITER ;
sau. - Nếu bạn có nhiều câu lệnh bên trong
IF THEN ... END IF
, bạn nên đặt chúng bên trongBEGIN ... END;
khối. - Nếu bạn có giá trị trả về, chẳng hạn như đại lý ở đây, tại sao không đặt nó làm tên
FUNCTION name (arg1: INTEGER) RETURNS INTEGER
thay vì tênPROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER)
. Chức năng này linh hoạt hơn nhiều.
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 ;