首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.0 存儲過程入門教程:從基礎語法到異常處理實戰

     編輯:MySQL 資料庫相關知識

MySQL 5.0 存儲過程系統化學習指南

MySQL 5.0 引入存儲過程支持,本教程從零開始構建概念,覆蓋語法規範、變量聲明、流程控制、異常處理與實戰案例。

代碼規範與執行環境

  • 客戶端顯示風格:mysql> 提示符,-> 續行符
  • 測試環境:Suse 9.2 Linux + MySQL 5.0.3 公共版
  • 跨平台兼容:Windows、Sparc、HP-UX 等主流 OS

存儲過程體中合法的 SQL 語句分類

類別說明示例
標準 SQL DDL核心功能,可移植CREATE PROCEDURE p() DELETE FROM t;
事務控制SET、COMMIT、ROLLBACKCREATE PROCEDURE p() SET @x = 5;
MySQL 擴展 DDL非核心可選組件CREATE PROCEDURE p() DROP TABLE t;
MySQL 擴展 DML直接 SELECT 返回結果集CREATE PROCEDURE p() SELECT 'a';

包含 MySQL 擴展功能的代碼將失去跨數據庫移植性,架構設計時需權衡。

變量聲明:DECLARE

僅在 BEGIN ... END 複合語句塊內有效(類似局部變量/形參)。

CREATE PROCEDURE p8()
BEGIN
    DECLARE a INT;
    DECLARE b INT;
    SET a = 5;
    SET b = 5;
    INSERT INTO t VALUES (a);
    SELECT s1 * a FROM t WHERE s1 >= b;
END;

異常處理核心機制

場景:外鍵約束違規日誌記錄

-- 主鍵表
CREATE TABLE t2 (s1 INT, PRIMARY KEY (s1)) ENGINE=InnoDB;
-- 外鍵表
CREATE TABLE t3 (s1 INT, KEY (s1), FOREIGN KEY (s1) REFERENCES t2(s1)) ENGINE=InnoDB;
-- 插入不存在的外鍵值觸發錯誤
INSERT INTO t3 VALUES (5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails

錯誤日誌表設計

CREATE TABLE error_log (error_message CHAR(80));

異常處理器聲明語法

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
BEGIN
    INSERT INTO error_log VALUES (CONCAT('FK Error: ', SQLERRM));
END;

進階主題預覽

  • 條件處理器:DECLARE ... HANDLER FOR condition_value ...
  • 條件值類型:SQLSTATE、MYSQL_ERRNO、SQLEXCEPTION、SQLWARNING、NOT FOUND
  • 動作類型:CONTINUE(繼續執行)、EXIT(退出當前塊)、UNDO(回滾,暫未實現)
  • 游標循環與動態 SQL(PREPARE/EXECUTE)

最佳實踐建議

  1. 業務邏輯下沉:高頻、多步、需事務一致性的操作優先考慮存儲過程
  2. 參數化防注入:所有外部輸入通過參數傳遞,拼接 SQL 風險歸零
  3. 錯誤碼標準化:統一使用 SQLSTATE 而非 MySQL 特有錯誤碼,提升可移植性
  4. 版本兼容:生產環境確認目標 MySQL 版本支持所用特性(如 5.0+ 支持存儲過程,8.0+ 增強了 JSON、CTE 等)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved