"DECLARE" is not valid at this position expecting an identifier
한시간 넘게 이유를 찾았다..위 에러는 그냥 sql문법 적으로 문제 있다고 알려주는 것이라 정확한 원인을 찾지 못하고 수많은 에러 원인 중 하나로 적어 둔다.
ELSE뒤에 있던 DECLARE문을 BEGIN 바로 뒤로 옮겨주었다.

DELIMITER //
CREATE PROCEDURE borrow
(
IN book_in INTEGER,
IN user_in INTEGER
)
BEGIN
DECLARE borrow_num INT default 0;
DECLARE resultmsg VARCHAR(30) DEFAULT '대출 완료';
DECLARE is_book_available VARCHAR(10);
DECLARE b_date DATE;
DECLARE finished INT DEFAULT 0;
SELECT COUNT(*) INTO borrow_num FROM borrows WHERE user_id = user_in;
SELECT book_status INTO is_book_available FROM book WHERE book_id = book_in;
IF is_book_available = '대출' THEN
SET resultmsg = '대출 실패: 이미 대출 중인 도서입니다.';
ELSEIF borrow_num >= 5 THEN
SET resultmsg = '대출 실패: 최대 권수 초과';
ELSE
DECLARE cur1 CURSOR FOR SELECT borrow_date FROM borrows WHERE user_id = user_in;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN cur1;
my_loop: LOOP
FETCH cur1 INTO b_date;
IF finished = 1 THEN
LEAVE my_loop;
END IF;
IF CURDATE() > b_date THEN
SET resultmsg = '대출 실패: 반납 지연 도서 존재';
CLOSE cur1;
LEAVE my_loop;
END IF;
END LOOP my_loop;
CLOSE cur1;
END IF;
if resultmsg='대출 완료' then
INSERT INTO borrows (book_id, user_id, borrow_date, return_date) VALUES (book_in, user_in, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 14 DAY));
end if;
SELECT resultmsg;
END;
//
DELIMITER ;