SQLSTATE 函数

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 状态是由两阶段过程决定的。在第一阶段,检查异常信息并忽略任何合并的异常(即,说明发生异常时代理正在执行什么操作的信息),直到发现描述根源错误的异常。

第二个阶段如下所示:
  1. 如果所选的异常是一个数据库异常,SQL 状态将由数据库提供并且前缀是字母 “D” 以避免与代理中出现的异常发生混淆。SQL 代码、本机错误和错误文本由数据库提供。
  2. 如果所选的异常是用户异常(即,源于 THROW 语句),则从异常中插入的前四项按顺序获取 SQL 代码、状态、本机错误和错误文本。按原样取出结果状态值(其前缀不是字母 “U”)。事实上,代理不使用字母 “U” 作为起源指示符。如果要定义唯一的 SQL 状态而不是模仿现有的状态,请使用以字母 “U” 开头的 SQL 状态。使用以字母 “U” 开头的 SQL 状态时,处理程序可使用 LIKE’U%’运算符匹配所有用户定义的异常和抛出的异常。
  3. 如果所选的异常是在消息传输过程中或者 ESQL 实现本身发生的,SQL 代码、状态、本机错误和错误文本将如下表中所述。
  4. 对于所有其他异常,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 用于用户异常,除非模仿上面定义的某个异常。
空字符串
所有其他错误。
相关概念
消息流概述
ESQL 概述
相关任务
定义消息流内容
正在开发 ESQL
捕获数据库状态
相关参考
SQLCODE 函数
SQLERRORTEXT 函数
SQLNATIVEERROR 函数
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak17990_