[Err] 1064 - You have an error in your SQL syntax;
near 'DECLARE cursor_company CURSOR FOR SELECT company FROM test WHERE status =' at line 10
CREATE PROCEDURE test()
BEGIN
-- 1. 所有變數先宣告
DECLARE fid INT;
DECLARE days INT DEFAULT 1;
DECLARE s INT DEFAULT 0;
DECLARE a INT DEFAULT 0; -- 外層游標結束標記
DECLARE company_code VARCHAR(50); -- 指定長度
-- 2. 兩個游標都在這裡宣告
DECLARE cursor_company CURSOR FOR
SELECT company FROM test WHERE status = 3;
DECLARE cursor_name CURSOR FOR
SELECT id FROM test
WHERE UNIX_TIMESTAMP(check_time) < UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL -days DAY));
-- 3. 單一處理器 (無法區分兩游標,需改用標記變數)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s = 1; -- 通用 NOT FOUND
OPEN cursor_company;
FETCH cursor_company INTO company_code;
WHILE s <> 1 DO
-- 依公司設定天數
IF company_code = 'DD' THEN SET days = 2;
ELSEIF company_code = 'ZD' THEN SET days = 5;
ELSEIF company_code = 'GG' THEN SET days = 8;
END IF;
FETCH cursor_company INTO company_code;
-- 內層游標處理
OPEN cursor_name;
FETCH cursor_name INTO fid;
SET s = 0; -- 重置內層標記
WHILE s <> 1 DO
UPDATE test SET status = 8 WHERE id = fid;
FETCH cursor_name INTO fid;
END WHILE;
CLOSE cursor_name;
END WHILE;
CLOSE cursor_company;
END
游標逐行處理極慢,若資料量大請改用 **單一 SQL 陳述式**:
UPDATE test
SET status = 8
WHERE id IN (
SELECT t2.id FROM test t2
JOIN test t1 ON t1.company = t2.company
WHERE t1.status = 3
AND UNIX_TIMESTAMP(t2.check_time) < UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL -
CASE t1.company
WHEN 'DD' THEN 2
WHEN 'ZD' THEN 5
WHEN 'GG' THEN 8
ELSE 1
END DAY))
);