SQLSTATE 是数据库状态函数,它返回 5 个 CHARACTER 类型的字符,缺省值为“00000”(5 个零作为字符串)。
在消息流中,可以使用 Filter、Database 和 Compute 节点中提供的 ESQL 数据库函数访问和更新外部数据库资源。调用外部数据库时,可能会发生错误,例如表不存在、数据库不可用或插入的键已存在。
发生这些错误时,代理的缺省操作是生成异常。此行为取决于属性数据库发生错误时抛出异常的设置。如果选中该复选框,代理会停止处理节点,将消息传播到节点的故障终端,并将错误的详细信息写入 ExceptionList。
如果要覆盖缺省行为,并在节点内的 ESQL 中处理数据库错误,则必须清除数据库发生错误时抛出异常复选框。如果不希望特定的 SQL 状态码出现,代理将不抛出异常,而您必须编写 THROW 语句以抛出异常。有关 THROW 的描述,请参阅 THROW 语句。
如果选择在节点中处理数据库错误,您可以使用数据库状态函数 SQLSTATE 接收关于在 ESQL 中进行的 DBMS 调用的状态信息。还可以将其包含在当前节点的 ESQL 中的条件语句内,以确认和处理可能的错误。
SQL 状态
在 ESQL 中,SQL 状态是长度可变的字符串。按照规定,它们的长度为 6 个字符并且仅包含字符 0-9、A-Z。这 6 个字符的含义分别是:
- 字符 1
- 异常的起源
- 字符 2 - 3
- 异常的类
- 字符 4 - 6
- 异常的子类
异常的 SQL 状态是由两阶段过程决定的。在第一阶段,检查异常信息并忽略任何合并的异常(即,说明发生异常时代理正在执行什么操作的信息),直到发现描述根源错误的异常。
第二个阶段如下所示:
- 如果所选的异常是一个数据库异常,SQL 状态将由数据库提供并且前缀是字母 “D” 以避免与代理中出现的异常发生混淆。SQL 代码、本机错误和错误文本由数据库提供。
- 如果所选的异常是用户异常(即,源于 THROW 语句),则从异常中插入的前四项按顺序获取 SQL 代码、状态、本机错误和错误文本。按原样取出结果状态值(其前缀不是字母 “U”)。事实上,代理不使用字母 “U” 作为起源指示符。如果要定义唯一的 SQL 状态而不是模仿现有的状态,请使用以字母
“U” 开头的 SQL 状态。使用以字母 “U” 开头的 SQL 状态时,处理程序可使用 LIKE’U%’运算符匹配所有用户定义的异常和抛出的异常。
- 如果所选的异常是在消息传输过程中或者 ESQL 实现本身发生的,SQL 代码、状态、本机错误和错误文本将如下表中所述。
- 对于所有其他异常,SQL 状态是 '',表示没有起源,没有类,也没有子类。
目前一些给出空 SQL 状态的异常可能会在以后的发行版中给出具体的状态。如果要捕获未分类的异常,则在作用域的最后一个处理程序上将 “all” 通配符(“%”)用于 SQL 状态。如果为先前未分类的异常提供新的、唯一的 SQL 状态,它将继续捕获相同的异常集。
现在已定义了以下 SQL 状态:
- Dddddd
- ddddd 是数据库返回的状态。
- SqlState = ‘S22003'
- 算法溢出。结果为数字类型的操作,它的值超出了支持的范围。
- SqlState = ‘S22004’
- 不允许 Null 值。在不允许 null 值的地方出现了 null 值。
- SqlState = ‘S22007’
- 日期时间格式无效。从字符强制转换为日期时间型的字符串发生了基本格式错误(例如,“01947-10-24”),或者它的值超出了阳历允许的范围(例如,“1947-21-24”)。
- SqlState = ‘S22008’
- 日期时间字段溢出。结果为一个日期/时间类型的操作,它的值超出了支持的范围。
- SqlState = ‘S22011’
- SUBSTRING 错误。需要遵守第一个操作数长度规定的 FROM 和 FOR 参数违反了 SUBSTRING 函数的规则。
- SqlState = ‘S22012’
- 除 0。一种结果无穷大的除操作,右操作数为零。
- SqlState = ‘S22015’
- 时间间隔字段溢出。结果为 INTERVAL 类型的操作,它的值超出了 INTERVAL 数据类型支持的范围。
- SqlState = ‘S22018’
- 进行强制类型转换的字符值无效。
- SqlState = ‘SPS001’
- 目标终端无效。终端语句的 PROPAGATE 试图使用无效的终端名。
- SqlState = ‘SPS002’
- 目标标号无效。标号语句的 PROPAGATE 试图使用无效的标号。
- SqlState = 'MQW001', SqlNativeError = 0
- 位流不满足 MQ 消息的要求。未尝试将它放入队列。重试和队列管理无法成功解决此问题。
- SqlState = 'MQW002', SqlNativeError = 0
- 目标队列或队列管理器名无效(即,无法从 Unicode 转换成队列管理器的代码页)。重试并清空队列无法解决此问题。
- SqlState = 'MQW003', SqlNativeError = 0
- 指定了请求方式,但“回复”队列或队列管理器名无效(即,无法从 Unicode 转换成消息的代码页)。重试并清空队列无法解决此问题。
- SqlState = 'MQW004', SqlNativeError = 0
- 指定了回复方式,但是从消息中取出的队列或队列管理器名无效(即,无法将它们从给定的代码页转换成 Unicode)。重试并清空队列无法解决此问题。
- SqlState = 'MQW005', SqlNativeError = 0
- 指定了目标列表方式,但是提供的目标列表不满足目标列表的基本要求。未尝试将任何消息放入队列。重试和队列管理无法成功解决此问题。
- SqlState = 'MQW101', SqlNativeError = As returned by MQ
- 无法打开目标队列管理器或队列。通过队列管理或许能成功解决此问题,但重试不能。
- SqlState = 'MQW102', SqlNativeError = as returned by MQ
- 无法写目标队列管理器或队列。通过重试和队列管理或许能成功解决此问题。
- SqlState = 'MQW201', SqlNativeError = number of destinations with an error
- 处理目标列表时发生多个错误。消息可能已被放入零个或多个队列。通过重试和队列管理或许能成功解决此问题。
- 用户已在 THROW 语句中使用的任何内容
- 将 Uuuuuuu 用于用户异常,除非模仿上面定义的某个异常。
- 空字符串
- 所有其他错误。