DELIMITER $$ DROP PROCEDURE IF EXISTS `HelloWorld`$$ CREATE PROCEDURE `HelloWorld`() BEGIN SELECT 'Hello World'; END$$ DELIMITER ;
DECLARE my_int INT DEFAULT 0; DECLARE my_decimal NUMERIC(8,2) DEFAULT 0.00; DECLARE my_str VARCHAR(30) DEFAULT 'Hello'; DECLARE my_date DATE DEFAULT '2023-01-01'; SET my_int = 20; SET my_decimal = POW(my_int, 3); -- 可用函數表達式
DECLARE 僅能在 BEGIN ... END 塊開頭;lower_case_table_names)。| 模式 | 關鍵字 | 行為 | 示例 |
|---|---|---|---|
| 輸入 | IN | 只讀,調用者傳入,修改不回傳 | CREATE PROCEDURE p(IN x INT) |
| 輸出 | OUT | 只寫,過程賦值,調用者接收 | CREATE PROCEDURE p(OUT y INT) |
| 輸入輸出 | INOUT | 可讀可寫,雙向傳遞 | CREATE PROCEDURE p(INOUT z INT) |
| 類型 | 語法 | 適用場景 |
|---|---|---|
| 簡單循環 | LOOP ... END LOOP | 配合 LEAVE label 退出 |
| 條件循環 | WHILE condition DO ... END WHILE | 預知次數或條件判斷 |
| 後測試循環 | REPEAT ... UNTIL condition END REPEAT | 至少執行一次 |
CREATE PROCEDURE `simple_loop`()
BEGIN
DECLARE counter INT DEFAULT 0;
my_loop: LOOP
SET counter = counter + 1;
IF counter = 10 THEN LEAVE my_loop; END IF;
END LOOP my_loop;
SELECT 'I can count to 10';
END;
DECLARE done INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
防止 FETCH 空結果導致過程終止。
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @msg = MESSAGE_TEXT; -- 記錄日志、設置標誌、繼續執行 END;
CONTINUE 繼續後續語句,EXIT 退出當前 BEGIN...END 塊。
SELECT col INTO var FROM t WHERE ...;SELECT ...,無 INTO;INSERT/UPDATE/DELETE 直接寫在過程中。CREATE PROCEDURE `customer_sales`(IN in_customer_id INT)
READS SQL DATA
BEGIN
DECLARE total_sales NUMERIC(8,2);
SELECT SUM(sale_value) INTO total_sales FROM sales WHERE customer_id = in_customer_id;
SELECT CONCAT('Total sales for ', in_customer_id, ' is ', total_sales);
END;
CREATE PROCEDURE `cursor_example`()
READS SQL DATA
BEGIN
DECLARE l_emp_id INT;
DECLARE l_salary NUMERIC(8,2);
DECLARE l_dept_id INT;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT employee_id, salary, department_id FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
emp_loop: LOOP
FETCH cur INTO l_emp_id, l_salary, l_dept_id;
IF done = 1 THEN LEAVE emp_loop; END IF;
-- 處理每行邏輯
END LOOP emp_loop;
CLOSE cur;
END;
CREATE TRIGGER `t3_trigger` AFTER INSERT ON `t3` FOR EACH ROW BEGIN INSERT INTO t4 SET id = NEW.id; END;
NEW 代表新行,OLD 代表舊行(UPDATE/DELETE 可用);sp_業務_動作、fn_業務_計算、trg_表_時機_事件。