`
hideto
  • 浏览: 2692917 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL存储程序之Error Handling

阅读更多
1,简介
MySQL支持HANDLER来处理错误:
Duplicate entry Handler
CREATE PROCEDURE sp_add_location
    (in_location    VARCHAR(30),
     in_address1    VARCHAR(30),
     in_address2    VARCHAR(30),
     zipcode        VARCHAR(10),
     OUT out_status VARCHAR(30))
BEGIN
    DECLARE CONTINUE HANDLER
        FOR 1062
        SET out_status='Duplicate Entry';

    SET out_status='OK';
    INSERT INTO locations
        (location,address1,address2,zipcode)
    VALUES
        (in_location,in_address1,in_address2,zipcode);
END;


Last Row Handler
CREATE PROCEDURE sp_not_found()
    READS SQL DATA
BEGIN
    DECLARE l_last_row INT DEFAULT 0;
    DECLARE l_dept_id INT:
    DECLARE c_dept CURSOR FOR
        SELECT department_id FROM departments;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1;

    OPEN c_dept;
    dept_cursor: LOOP
        FETCH c_dept INTO l_dept_id;
        IF (l_last_row=1) THEN
            LEAVE dept_cursor;
        END IF;
    END LOOP dept_cursor;
    CLOSE c_dept;
END;


2,Handlers
语法:
DECLARE {CONTINUE | EXIT} HANDLER FOR
    {SQLSTATE sqlstate_code | MySQL error code | condition_name}
    handler_actions

Handlers类型:
1, EXIT: 发生错误时退出当前代码块(可能是子代码块或者main代码块)
2, CONTINUE: 发送错误时继续执行后续代码

Handlers条件:
1, MySQL error code,如1062
2, ANSI标准SQLSTATE code,如23000
3, 命名条件,如NOT FOUND


优先级:
MySQL Error code > SQLSTATE code > 命名条件

使用SQLSTATE还是MySQL Error Code?
1,SALSTATE是标准,貌似会更portable,但是实际上MySQL、DB2、Oracle等等的存储程序语法大相径庭,所以portable的优势不存在
2,MySQL error code与SQLSTATE并不是一一对应的,比如很多MySQL error code都映射到同一SQLSTATE code(HY000)

当MySQL客户端碰到错误时,它会报告MySQL error code和相关的SQLSATE code:
mysql > CALL nosuch_sp();
ERROR 1305 (42000): PROCEDURE sqltune.nosuch_sp does not exist

上面Error code是1305,SQLSTATE code是42000

常见的MySQL error code和SQLSTATE code:
MySQL error code        SQLSTATE code            Error message
1011                    HY000                    Error on delete of '%s' (errno: %d)
1021                    HY000                    Disk full (%s); waiting for someone to free some space...
1022                    23000                    Can't write; duplicate key in table '%s'
1027                    HY000                    '%s' is locked against change
1036                    HY000                    Table '%s' is read only
1048                    23000                    Column '%s' cannot be null
1062                    23000                    Duplicate entry '%s' for key %d
1099                    HY000                    Table '%s' was locked with a READ lock and can't be updated
1100                    HY000                    Table '%s' was not locked with LOCK TABLES
1104                    42000                    The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay
1106                    42000                    Incorrect parameters to procedure '%s'
1114                    HY000                    The table '%s' is full
1150                    HY000                    Delayed insert thread couldn't get requested lock for table %s
1165                    HY000                    INSERT DELAYED can't be used with table '%s' because it is locked with LOCK TABLES
1242                    21000                    Subquery returns more than 1 row
1263                    22004                    Column set to default value; NULL supplied to NOT NULL column '%s' at row %ld
1264                    22003                    Out of range value adjusted for column '%s' at row %ld
1265                    1000                     Data truncated for column '%s' at row %ld
1312                    0A000                    SELECT in a stored program must have INTO
1317                    70100                    Query execution was interrupted
1319                    42000                    Undefined CONDITION: %s
1325                    24000                    Cursor is already open
1326                    24000                    Cursor is not open
1328                    HY000                    Incorrect number of FETCH variables
1329                    2000                     No data to FETCH
1336                    42000                    USE is not allowed in a stored program
1337                    42000                    Variable or condition declaration after cursor or handler declaration
1338                    42000                    Cursor declaration after handler declaration
1339                    20000                    Case not found for CASE statement
1348                    HY000                    Column '%s' is not updatable
1357                    HY000                    Can't drop a %s from within another stored routine
1358                    HY000                    GOTO is not allowed in a stored program handler
1362                    HY000                    Updating of %s row is not allowed in %s trigger
1363                    HY000                    There is no %s row in %s trigger

可以在http://dev.mysql.com/doc/的MySQL reference manual的附录B找到完整的最新的error codes

3,命名条件
MySQL error code或者SQLSTATE code的可读性太差,所以引入了命名条件:
DECLARE condition_name CONDITION FOR {SQLSTATE sqlstate_code | MySQL_error_code};

使用:
# original
DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;

# changed
DECLARE foreign_key_error CONDITION FOR 1216;
DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;


4,SQL:2003的特性
可以使用SIGNAL语句来触发错误
SIGNAL SQLSTATE sqlstate_code|condition_name [SET MESSAGE_TEXT=string_or_variable];

MySQL5.2才支持 SQL:2003

5,Error Handling的例子
CREATE PROCEDURE sp_add_department
    (p_department_name     VARCHAR(30),
     p_manager_surname     VARCHAR(30),
     p_manager_firstname   VARCHAR(30),
     p_location            VARCHAR(30),
     OUT p_sqlcode         INT,
     OUT p_status_message  VARCHAR(100))
BEGIN

    /* START Declare Conditions */

    DECLARE duplicate_key CONDITION FOR 1062;
    DECLARE foreign_key_violated CONDITION FOR 1216;

    /* END Declare COnditions */

    /* START Declare variables and cursors */

    DECLARE l_manager_id INT;
    DECLARE csr_mgr_id CURSOR FOR
        SELECT employee_id FROM employees
        WHERE surname=UPPER(p_manager_surname)
        AND firstname=UPPER(p_manager_firstname);

    /* END Declare variables and cursors */

    /* START Declare Exception Handlers */

    DECLARE CONTINUE HANDLER FOR duplicate_key
    BEGIN
        SET p_sqlcode=1052;
        SET p_status_message='Duplicate key error';
    END;

    DECLARE CONTINUE HANDLER FOR foreign_key_violated
    BEGIN
        SET p_sqlcode=1216;
        SET p_status_message='Foreign key violated';
    END;

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    BEGIN
        SET p_sqlcode=1329;
        SET p_status_message='No record found';
    END;

    /* END Declare Exception Handlers */

    /* START Execution */

    SET p_sqlcode=0;
    OPEN csr_mgr_id;
    FETCH csr_mgr_id INTO l_manager_id;

    IF p_sqlcode<>0 THEN     /* Failed to get manager id */
        SET p_status_message=CONCAT(p_status_message,' when fetching manager id');
    ELSE                     /* Got manager id, we can try and insert */
        INSERT INTO departments (department_name, manager_id, location)
        VALUES(UPPER(p_department_name), l_manager_id, UPPER(p_location));
        IF p_sqlcode<>0 THEN /* Failed to insert new department */
            SET p_status_message=CONCAT(p_status_message, ' when inserting new department');
        END IF;
    END IF;

    CLOSE csr_mgr_id;

    /* END Execution */

END
分享到:
评论

相关推荐

    MySql存储过程编程.chm

    Introduction to Error Handling Section 6.2. Condition Handlers Section 6.3. Named Conditions Section 6.4. Missing SQL:2003 Features Section 6.5. Putting It All Together Section 6.6. ...

    mysql-installer-community-5.7.34.0

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其社区版提供了免费且强大的数据存储和管理功能。`mysql-installer-community-5.7.34.0` 是MySQL 5.7.34版本的社区安装程序,这个版本是MySQL 5.7系列的一个...

    mysql-connector-java-5.1.18.jar

    10. **Error and Exception Handling**: 提供详细的错误信息,帮助开发者诊断和解决连接或查询问题。 使用MySQL Connector/J 5.1.18 的基本步骤包括: 1. 添加jar文件到项目的类路径:将`mysql-connector-java-...

    MYSQL++ C++ API

    cerr (MySQL error code: " &lt;&lt; e.getErrorCode(); cerr , SQLState: " () )" ; } return 0; } ``` 这个简单的程序展示了如何连接到数据库,执行查询并打印结果。注意,你需要替换 `"user"`, `"password"` 和 `...

    mysql5.7.33社区版.zip

    - **Better Error Handling**:错误处理机制得到改善,提供了更丰富的错误信息和更好的回滚策略。 - **Memory Management**:内存管理优化,减少内存碎片,提高服务器稳定性。 在安装和使用 MySQL 5.7.33 社区版...

    MySQL安装过程

    - **错误示例**:`Error: Found option without preceding group in config file: D:/Program Files/mysql-5.6.25-winx64/my.ini at line: 1 Fatal error in defaults handling. Program aborted.`。 - **解决办法**...

    mysql-boost-5.7.33.tar.gz

    10. **Better Error Handling**:错误处理机制得到改善,提供了更丰富的错误信息,帮助开发者快速定位问题。 解压"mysql-boost-5.7.33.tar.gz"后,你可以按照提供的文档指示,在Linux环境下编译安装MySQL,期间可能...

    msql存储过程经典教程

    ### MySQL 5.0 存储过程经典教程知识点解析 #### 一、引言 本文档作为MySQL 5.0新特性的入门指南,旨在帮助MySQL的老用户们快速理解和掌握新版本中的存储过程功能。存储过程是数据库管理系统(DBMS)中一项重要的...

    MySQL 5.6 my.cnf 配置

    MySQL 5.6是MySQL数据库管理系统的一个重要版本,它的配置文件`my.cnf`是数据库服务器启动时读取的关键文件,用于定义各种参数和设置,从而影响MySQL的性能、安全性以及资源消耗。在这个版本中,`my.cnf`通常位于...

    mysqlHelpDocument.zip

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理数据。这份"mysqlHelpDocument.zip"压缩包文件包含的是一份详尽的MySQL官方手册,它提供了关于MySQL的全面指南,涵盖了从基本概念到高级特性的各种...

    jcom-cms-web:Java商品管理系统网站

    JCOM - 商品管理系统 java commodity management system web 一个商品管理系统,管理商品信息及销售统计。提供浏览器、移动端浏览器及微信小程序。...Error Handling Template Engines(Thymeleaf)

    仿彩虹授权系统.zipPHP项目程序网站源码下载

    7. **错误处理与日志记录(Error Handling and Logging)**:为了调试和监控系统的运行状况,错误处理和日志记录至关重要。PHP提供异常处理机制和日志记录函数。 8. **安全性考虑(Security Considerations)**:...

    浅谈php中mysql与mysqli的区别分析

    在功能上,`mysqli`扩展还提供了**多结果集(Multiple Result Sets)**支持,可以在单个查询中返回多个结果,以及**警告处理(Error Handling)**,能够更准确地捕获和处理数据库操作中的异常。 总结来说,`mysqli`...

    汽车之家-汽车型号数据提取工具代码

    【汽车之家-汽车型号数据提取工具代码】是一个专门用于从汽车之家网站抓取汽车型号相关数据的程序。这个工具能够帮助用户自动化地收集、整理和分析汽车的各种型号信息,为汽车行业从业者、研究者或者汽车爱好者提供...

    JDBC-doc 官方文档

    8. **Error Handling**:通过SQLException类处理数据库操作中出现的错误。 在阅读JDBC官方文档时,开发者会学习如何进行以下操作: - **连接数据库**:通过DriverManager.getConnection()方法建立连接,需要提供...

    JAVA函数官方文档refman-8.0-en.html-chapter.zip

    JAVA函数官方文档“refman-8.0-en.html-chapter.zip”是一个包含了多个与Java编程相关的HTML文件的压缩包,主要涵盖了错误处理、MySQL集群、服务器管理、SQL语法、InnoDB存储引擎、安全性以及各种函数和程序等多个...

    nodeJS_OAuth2Example:node-oauth2-server库的示例mySql实现

    5. **错误处理(Error Handling)**: 当请求无效或授权失败时,需要返回适当的错误响应。`node-oauth2-server`提供了错误处理机制,帮助开发者统一处理这些问题。 在项目中,你可能会发现以下文件和目录: - `...

    NodeJS-Express-MySQL-API

    在本项目"NodeJS-Express-MySQL-API"中,我们主要关注的是如何使用Node.js、Express框架以及MySQL数据库来构建一个API(应用程序接口)。这个项目是初学者学习Web开发技术的良好实践,它涵盖了前端到后端的基本流程...

Global site tag (gtag.js) - Google Analytics