求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 

mysql教程
MySQL快速学习入门
MySQL是什么
MySQL安装
MySQL示例数据库
MySQL导入示例数据库
MySQL基础教程
MySQL查询数据
MySQL WHERE语句
MySQL插入数据
MySQL更新表数据
MySQL删除表数据
MySQL创建与删除数据库
MySQL创建表
MySQL修改表结构
MySQL重命名表
MySQL数据类型
高级部分
MySQL技巧
MySQL存储过程
MySQL视图
MySQL触发器
MySQL管理
MySQL全文搜索
MySQL函数
应用程序连接
MySQL+Node.js连接和操作
Python+MySQL连接和操作
 
 

MySQL signal和esignal语句
627 次浏览
4次  

在本教程中,您将学习如何使用SIGNAL和RESIGNAL语句来引发存储过程中的错误条件。

MySQL SIGNAL语句

使用SIGNAL语句在存储的程序(例如存储过程,存储函数,触发器或事件)中向调用者返回错误或警告条件。 SIGNAL语句提供了对返回值(如值和消息SQLSTATE)的信息的控制。

以下说明SIGNAL语句的语法:

SIGNAL SQLSTATE | condition_name;
SET condition_information_item_name_1 = value_1,
condition_information_item_name_1 = value_2, etc;

SIGNAL关键字是由DECLARE CONDITION语句声明的SQLSTATE值或条件名称。 请注意,SIGNAL语句必须始终指定使用SQLSTATE值定义的SQLSTATE值或命名条件。

要向调用者提供信息,请使用SET子句。如果要使用值返回多个条件信息项名称,则需要用逗号分隔每个名称/值对。

condition_information_item_name可以是MESSAGE_TEXT,MYSQL_ERRORNO,CURSOR_NAME等。

以下存储过程将订单行项目添加到现有销售订单中。 如果订单号码不存在,它会发出错误消息。

DELIMITER $$

CREATE PROCEDURE AddOrderItem(in orderNo int,
in productCode varchar(45),
in qty int,in price double, in lineNo int )

BEGIN
DECLARE C INT;

SELECT COUNT(orderNumber) INTO C
FROM orders
WHERE orderNumber = orderNo;

-- check if orderNumber exists
IF(C != 1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Order No not found in orders table';
END IF;
-- more code below
-- ...
END $$
DELIMITER ;

首先,它使用传递给存储过程的输入订单号对订单进行计数。

第二步,如果订单数不是1,它会引发SQLSTATE 45000的错误以及orders表中不存在订单号的错误消息。

请注意,45000是一个通用SQLSTATE值,用于说明未处理的用户定义异常。

如果调用存储过程AddOrderItem(),但是传递不存在的订单号,那么将收到一条错误消息。

CALL AddOrderItem(10,'S10_1678',1,95.7,1);

执行上面代码,得到以下结果 -

mysql> CALL AddOrderItem(10,'S10_1678',1,95.7,1);
1644 - Order No not found in orders table
mysql>

MySQL RESIGNAL语句

除了SIGNAL语句,MySQL还提供了用于引发警告或错误条件的RESIGNAL语句。

RESIGNAL语句在功能和语法方面与SIGNAL语句相似,只是:

必须在错误或警告处理程序中使用RESIGNAL语句,否则您将收到一条错误消息,指出“RESIGNAL when handler is not active”。 请注意,您可以在存储过程中的任何位置使用SIGNAL语句。

可以省略RESIGNAL语句的所有属性,甚至可以省略SQLSTATE值。

如果单独使用RESIGNAL语句,则所有属性与传递给条件处理程序的属性相同。

以下存储过程在将发送给调用者之前更改错误消息。

DELIMITER $$

CREATE PROCEDURE Divide(IN numerator INT, IN denominator INT, OUT result double)
BEGIN
DECLARE division_by_zero CONDITION FOR SQLSTATE '22012';

DECLARE CONTINUE HANDLER FOR division_by_zero
RESIGNAL SET MESSAGE_TEXT = 'Division by zero / Denominator cannot be zero';
--
IF denominator = 0 THEN
SIGNAL division_by_zero;
ELSE
SET result := numerator / denominator;
END IF;
END $$
DELIMITER ;

下面我们来调用Divide()存储过程。

CALL Divide(10,0,@result);

执行上面语句,得到以下结果 -

mysql> CALL Divide(10,0,@result);
1644 - Division by zero / Denominator cannot be zero

在本教程中,我们向您展示了如何使用SIGNAL和RESIGNAL语句引发存储程序中的错误条件。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



627 次浏览
4次
 捐助