CREATE PROCEDURE pr_dealtestnum (IN p_boxnumber VARCHAR(30)) BEGIN INSERT INTO tb_testnum SELECT boxnumber, usertype FROM tb_testnum_tmp WHERE boxnumber = p_boxnumber; END;
問題:INSERT ... SELECT 混寫、無存在性判斷、無返回狀態、未列出目標列、無錯誤檢測。
DECLARE p_usertype INT; SELECT usertype INTO p_usertype FROM tb_testnum_tmp WHERE boxnumber = p_boxnumber; INSERT INTO tb_testnum VALUES (p_boxnumber, p_usertype);
CREATE PROCEDURE pr_dealtestnum ( IN p_boxnumber VARCHAR(30), OUT p_result INT -- 0 成功,1 源無數據,2 目標已存在 )
INSERT INTO tb_testnum (boxnumber, usertype) VALUES (p_boxnumber, p_usertype);
防止未來表結構變更導致列順序錯位報錯。
INSERT INTO tb_testnum (boxnumber, usertype) VALUES (p_boxnumber, p_usertype); IF @error_count <> 0 THEN SET p_result = 3; ELSE SET p_result = 0; END IF;
存儲過程優化不只是 SQL 改寫,更是「防禦性編程」:校驗前置、狀態碼輸出、顯式列名、錯誤感知。養成規範習慣,系統壽命更長、維護更易。