MySQL SIGNAL RESIGNAL

2025年3月17日 | 阅读 3 分钟

本文将介绍如何在存储程序中使用 SIGNAL 和 RESIGNAL 语句来引发错误条件。

MySQL SIGNAL 语句

SIGNAL 查询是一种机制,用于在存储程序(如存储过程、触发器或事件,或存储函数)执行期间返回警告或错误消息。此语句将错误信息提供给错误处理程序、应用程序的外部部分或客户端。它还提供对存储过程中的错误特性的控制,例如错误编号、SQLSTATE、值和消息。SIGNAL 语句执行不需要任何权限

语法

以下是使用 SIGNAL 语句的基本语法

在这里,SQLSTATE 或 DECLARE CONDITION 语句声明的condition_name 指示要返回的错误值。需要注意的是,SIGNAL 语句必须具有 SQLSTATE 值或已定义 SQLSTATE 值的命名条件。

SQLSTATE 由五个字母数字字符组成。我们不使用带有'00'的 SQLSTATE 代码,因为它表示成功,这不适用于引发错误。当值无效时,会发现一个错误的 SQLSTATE。如果我们想进行通用错误处理,我们必须将 SQLSTATE 代码'45000'分配给它,它表示一个未处理的用户定义异常。

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

condition_information_item_name 可以是以下任何一项,并且必须在 SET 子句中仅指定一次。否则,将返回重复的条件信息项错误。

  • CLASS_ORIGIN
  • MESSAGE_TEXT
  • MYSQL_ERRNO
  • CONSTRAINT_NAME
  • SCHEMA_NAME
  • TABLE_NAME
  • CURSOR_NAME 等。

让我们通过一个例子来理解 SIGNAL 的实现。

示例

在这里,我们将首先创建一个名为 addStudent 的过程。此过程首先计算使用我们传递到存储过程中的输入 student id 的总学生数。其次,它会在表中进行检查,如果学生数量不为 1,它将返回一个带有 SQLSTATE 45000 的错误,以及消息student id does not exist in the student_info table。我们会注意到 45000 是未处理的用户定义异常的通用 SQLSTATE。

以下是完整的过程代码

当我们使用提供的学生详细信息调用该过程时,我们将收到一条错误消息。

这是输出

MySQL SIGNAL RESIGNAL

MySQL RESIGNAL 语句

MySQL 提供了 RESIGNAL 语句,用于引发与 SIGNAL 语句类似(在功能和语法上)的警告或错误条件区别在于

  • RESIGNAL 语句必须在错误或警告处理程序内部使用。否则,MySQL 将生成一条错误消息:当处理程序不活跃时, RESIGNAL。
  • RESIGNAL 语句可以使用而无需任何属性,甚至无需像 SIGNAL 语句那样指定 SQLSTATE 值或属性。

如果我们仅在存储程序中使用 RESIGNAL 语句,则所有属性都与传递给条件处理程序的属性相同。

示例

让我们通过一个过程在发出错误消息给调用者之前更改错误消息的示例来理解这一点。

如果我们使用以下语句调用该过程,我们将收到一条错误消息

这是结果:

MySQL SIGNAL RESIGNAL