MySQL 存储过程的异常处理

mysql>

mysql> delimiter $$

mysql>

mysql> CREATE PROCEDURE myProc

    ->     (p_first_name          VARCHAR(30),

    ->       p_last_name           VARCHAR(30),

    ->       p_city                VARCHAR(30),

    ->       p_description         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 id

    ->         FROM employee

    ->        WHERE first_name=p_first_name

    ->              AND last_name=p_last_name;

    ->

    -> /* 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

    ->     INSERT INTO employee (first_name,id,city)

    ->     VALUES(p_first_name,l_manager_id,p_city);

    ->

    ->     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$$

Query OK, 0 rows affected (0.02 sec)

mysql>

mysql> delimiter ;

mysql> set @myCode = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> set @myMessage = 0;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> call myProc(‘Jason‘,‘Martin‘,‘New City‘,‘New Description‘,@myCode,@myMessage);

Query OK, 1 row affected (0.00 sec)

mysql>

mysql> select @myCode, @myMessage;

+---------+------------+

| @myCode | @myMessage |

+---------+------------+

| 0       | NULL       |

+---------+------------+

1 row in set (0.00 sec)

mysql>

mysql> drop procedure myProc;

Query OK, 0 rows affected (0.00 sec)

http://www.oschina.net/code/snippet_54100_27

时间: 2024-10-27 06:26:30

MySQL 存储过程的异常处理的相关文章

mysql存储过程之异常处理篇

mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPT

MySQL存储过程的“异常处理”

Q:何为异常? A:程序在执行过程中有可能出错,运行时错误叫做异常. 默认情况下,当存储过程运行出错时,过程会立即终止,并打印系统错误消息. 实验环境: mysql> use TENNIS Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> 

MySQL存储过程之异常处理

当insert失败时,你可能希望将其错误信息记录在日志文件中,如出错原因,出错时间等.如下代码,先创建主键表及一外键表.然后抛入非主键表中的值时会失败: 1 mysql> CREATE TABLE t2 ( 2 s1 INT, PRIMARY KEY (s1) 3 ) engine=innodb;// 4 mysql> CREATE TABLE t3 ( 5 s1 INT, KEY (s1), 6 FOREIGN KEY (s1) REFERENCES t2 (s1) 7 ) engine=i

第12章 mysql 存储过程

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Chapter 20 Stored Programs and Views [6]

Mysql存储过程(转)

一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b",返回这两个参数的和. drop procedure if exists pr_add; -- 计算两个数之和 create procedure pr_add(   a int,   b int)begin   declare c int; if a is null then      set a = 0; 

mysql存储过程之游标遍历数据表

原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹. 1 BEGIN 2 DECLARE Done INT DEFAULT 0; 3 4 DECLARE CurrentLingQi INT; 5 6 DECLARE ShizuName VARCHAR(30); 7 /* 声明游标 */ 8 DECLARE rs CURSOR FOR SELECT

MySQL存储过程之细节

1. ALTER and DROP 1 ALTER PROCEDURE p6 COMMENT 'Unfinished' // 2 DROP PROCEDURE p6 // 2. 与Oracle / SQL Server / DB2 / ANSI比较 1) 与Oracle比较 1> 摘要: a. Oracle允许在打开后再声明;MySQL必须在开始的时候使用 b. Oracle允许"CURSOR cursorname IS"这样的声明方式;MySQL必须使用"DECLAR

MYSQL存储过程怎么写

MySQL存储过程 DELIMITER $$     DROP PROCEDURE IF EXISTS HelloWorld$$   CREATE PROCEDURE HelloWorld()   BEGIN        SELECT "Hello World!";   END$$   DELIMITER ; 3,变量 DECLARE声明,SET赋值 可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL DECLARE counter INT DEFAULT 0; 

MySQL存储过程定义及调用

#MySQL存储过程 ##最简单的存储过程 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() COMMENT '最简单的存储过程' SELECT 1; ##调用 CALL sp1 (); ##带输入参数的存储过程 DROP PROCEDURE IF EXISTS sp2; CREATE PROCEDURE sp2(IN p INT) COMMENT '带输入参数的存储过程' SELECT p; ##调用 CALL sp2(1); #带输出参