$conn = mysqli_connect('localhost', 'root', 'root', 'test');
if (!$conn) die('連線失敗: ' . mysqli_connect_error());
※ 建議用 mysqli 或 PDO,舊 mysql_* 函數已棄用。
$sql = "
CREATE PROCEDURE sp_insert_user()
BEGIN
INSERT INTO user (username, sex) VALUES ('auto_user', '0');
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_insert_user()");
$sql = "
CREATE PROCEDURE sp_check_score(IN score INT)
BEGIN
IF score >= 60 THEN SELECT 'pass'; ELSE SELECT 'fail'; END IF;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_check_score(70)");
$sql = "
CREATE PROCEDURE sp_get_max_id(OUT max_id INT)
BEGIN
SELECT MAX(id) INTO max_id FROM user;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_get_max_id(@max_id)");
$res = mysqli_query($conn, "SELECT @max_id");
$row = mysqli_fetch_row($res);
echo "Max ID: $row[0]";
$sql = "
CREATE PROCEDURE sp_double(INOUT val INT)
BEGIN
SET val = val * 2;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "SET @v = 5");
mysqli_query($conn, "CALL sp_double(@v)");
$res = mysqli_query($conn, "SELECT @v");
$row = mysqli_fetch_row($res);
echo $row[0]; // 10
$sql = "
CREATE PROCEDURE sp_sum(IN a INT, IN b INT)
BEGIN
DECLARE s INT DEFAULT 0;
SET s = a + b;
SELECT s AS sum;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_sum(4, 6)");
$sql = "
CREATE PROCEDURE sp_grade(IN score INT)
BEGIN
CASE score
WHEN 100 THEN SELECT '完美';
WHEN 90 THEN SELECT '優秀';
WHEN 60 THEN SELECT '及格';
ELSE SELECT '不及格';
END CASE;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_grade(100)");
$sql = "
CREATE PROCEDURE sp_sum_loop()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE s INT DEFAULT 0;
WHILE i < 10 DO
SET s = s + i;
SET i = i + 1;
END WHILE;
SELECT s; -- 45
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_sum_loop()");
$sql = "
CREATE PROCEDURE sp_repeat_demo()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE s INT DEFAULT 0;
REPEAT
SET s = s + i;
SET i = i + 1;
UNTIL s >= 10
END REPEAT;
SELECT s;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_repeat_demo()");
$sql = "
CREATE PROCEDURE sp_loop_demo()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE s INT DEFAULT 0;
loop_label: LOOP
SET s = s + i;
SET i = i + 1;
IF i >= 5 THEN LEAVE loop_label; END IF;
END LOOP;
SELECT s; -- 10
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_loop_demo()");
mysqli_query($conn, "DROP PROCEDURE IF EXISTS sp_insert_user");
$sql = "
CREATE PROCEDURE sp_cursor_demo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_name VARCHAR(50);
DECLARE cur CURSOR FOR SELECT username FROM user WHERE sex='1';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_name;
IF done THEN LEAVE read_loop; END IF;
-- 處理單行,例如寫日誌表
INSERT INTO log (msg) VALUES (CONCAT('處理用戶: ', v_name));
END LOOP;
CLOSE cur;
END;
";
mysqli_query($conn, $sql);
mysqli_query($conn, "CALL sp_cursor_demo()");
SHOW PROCEDURE STATUS WHERE Db='test';
SHOW CREATE PROCEDURE sp_insert_user;
@var 接收,再 SELECT @var 取值。