mysql 存储过程 with_mysql存储过程学习笔记--错误处理

定义:

DECLARE {CONTINUE | EXIT} HANDLER FOR {SQLSTATE sqlstate_code| MySQL error code| condition_name} handler_actions

上述定义包括:

· Handler type (CONTINUE, EXIT)//处理类型,继续或退出

· Handler condition (SQLSTATE, MySQL error code, named condition) //触发条件

· Hander actions(错误触发的操作)

注意:

a、 exit只退出当前的block。

b、 如果定义了handler_action,会在continue或exit之前执行

发生错误的条件有:

· mysql错误代码

· ANSI-standard SQLSTATE code.

· 命名条件,可自定可使用系统内置的SQLEXCEPTION, SQLWARNING,和 NOT FOUND.

例:

//当错误代码为1062时将duplicate_key的值设为1,并继续执行当前任务

DECLARE CONTINUE HANDLER FOR 1062 SET duplicate_key=1;

//下面的跟上面的一样,只是使用的条件为ansi标准错误代码 DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET duplicate_key=1;

//当发生SQLEXCEPTION时,将l_error设为1,并继续 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET l_error=1;

小提示:

当你在mysql客户端执行命令并产生错误时,会得到mysql和ANSI的SQLSTATE code,如:

mysql> CALL nosuch_sp(  );

ERROR 1305 (42000): PROCEDURE sqltune.nosuch_sp does not exist

附,常见错误号对照表

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

命名条件:

DECLARE condition_name CONDITION FOR {SQLSTATE sqlstate_code | MySQL_error_code};

例:

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

优先级:

当同时使用MySQl错误码,标准SQLSTATE错误码,命名条件(SQLEXCEPTION)来定义错误处理时,其捕获顺序是(只可捕获一条错误):

MYSQL码->SQLSTATE->命名条件

作用域:

1、包括begni..end;内的语句

DECLARE CONTINUE HANDLER FOR 1048 SELECT 'Attempt to insert a null value';

BEGIN

INSERT INTO a  VALUES (6,NULL);

END;

若a表第二字段定义为非空,则会触发1048错误

2、若错误处理在begin..end内定义,则在之外的语句不会触发错误发生

BEGIN

BEGIN

DECLARE CONTINUE HANDLER FOR 1216 select

'Foreign key constraint violated';

END;

INSERT INTO departments (department_name,manager_id,location)

VALUES ('Elbonian HR','Catbert','Catbertia');

END;

3、能够捕获其它存储过程抛出的错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 存储过程是一种预先编译好的 SQL 代码块,可以通过单个调用执行多个 SQL 语句。存储过程可以接收参数,可以使用条件、循环等语句实现复杂的业务逻辑。下面是 MySQL 存储过程的基本用法: 1. 创建存储过程 使用 CREATE PROCEDURE 语句创建存储过程,语法如下: ``` CREATE PROCEDURE procedure_name ([IN|OUT|INOUT] parameter_name data_type) BEGIN -- 存储过程的 SQL 语句 END; ``` 其中,procedure_name 为存储过程名,parameter_name 为参数名,data_type 为参数数据类型,可以是 MySQL 支持的任何数据类型。 2. 执行存储过程 使用 CALL 语句执行存储过程,语法如下: ``` CALL procedure_name(parameter_value); ``` 其中,procedure_name 为存储过程名,parameter_value 为参数值,可以是一个常量、变量或表达式。 3. 删除存储过程 使用 DROP PROCEDURE 语句删除存储过程,语法如下: ``` DROP PROCEDURE procedure_name; ``` 其中,procedure_name 为存储过程名。 4. 示例 下面是一个简单的 MySQL 存储过程示例,实现了对用户表的插入操作: ``` CREATE PROCEDURE insert_user(IN name VARCHAR(50), IN age INT, IN gender VARCHAR(10)) BEGIN INSERT INTO user(name, age, gender) VALUES(name, age, gender); END; CALL insert_user('张三', 20, '男'); ``` 该存储过程接收三个参数,分别为 name、age 和 gender,将这些参数插入到 user 表中。最后使用 CALL 语句调用该存储过程,插入一条记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值