SQLCA(SQL 通信区)

SQLCA 是在每个 SQL 语句执行结束时更新的变量的集合。

包含可执行 SQL 语句并使用选项 LANGLEVEL SAA1 (缺省值) 或 MIA 进行预编译的程序必须仅提供一个 SQLCA ,但通过在多线程应用程序中每个线程有一个 SQLCA ,可以有多个 SQLCA。

当使用选项 LANGLEVEL SQL92E预编译程序时,可以在 SQL 声明部分中声明 SQLCODE 或 SQLSTATE 变量,也可以在程序中的某个位置声明 SQLCODE 变量。

使用 LANGLEVEL SQL92E时不应提供 SQLCA。 SQL INCLUDE 语句可用于以除 REXX 外的所有语言提供 SQLCA 的声明。 SQLCA 在 REXX 中自动提供。

要在通过命令行处理器执行每个命令之后显示 SQLCA ,请发出命令 db2 -a。 然后,将 SQLCA 作为后续命令的输出的一部分提供。 SQLCA 也会转储在 db2diag 日志文件中。

SQLCA 字段描述

表 1. SQLCA的字段。 显示的字段名称是通过 INCLUDE 语句获取的 SQLCA 中的字段名称。
Name 数据类型 字段值
sqlcaid CHAR(8) 包含 SQLCA的存储器转储的 眼睛捕获器 。 如果从解析 SQL 例程, SQL 触发器或动态复合 SQL 语句返回行号信息,那么第六个字节为 L 。 如果从执行编译型 SQL 例程,编译型 SQL 触发器或动态复合 SQL (编译型) 语句返回行号和对象标识信息,那么第六个字节为 M
sqlcabc INTEGER 包含 SQLCA 的长度, 136。
sqlcode INTEGER 包含 SQL 返回码:
0
成功执行 (尽管可以设置一个或多个 SQLWARN 指示符)。
执行成功,但带有警告条件。
负数
错误情况。
sqlerrml SMALLINT sqlerrmc的长度指示符,范围为 0 到 70。 0 表示 sqlerrmc 的值不相关。
sqlerrmc VARCHAR(70) 包含一个或多个以 X'FF '分隔的标记,这些标记将替换为错误条件描述中的变量。

成功完成连接时,也会使用此字段。

当发出 NOT AT具复合 SQL 语句时,它可以包含有关 7 个或更少错误的信息。

最后一个标记可能后跟 X'FF 'sqlerrml 值将包含任何尾部 X'FF '

sqlerrp CHAR(8) 从 V11.1开始, SQLERRP 字段的格式将更改为 SQLvvrrmm,其中:
  • vv 表示版本号
  • rr 表示发行版号
  • m 表示修改值

以下示例说明了产品特征符与 SQLERRP 字段中的新令牌之间的关系。 给定 Mod Pack 的所有后续修订包返回相同的 SQLERRP 值。

Product           SQLERRP
signature         token
Db2 10.5.0.7      SQL10057
Db2 11.0.0.0      SQL11010
Db2 11.1.1.1      SQL11011
Db2 11.1.2.0      SQL11012
sqlerrd ARRAY 提供诊断信息的六个 INTEGER 变量。 如果没有错误,那么这些值通常为空,但分区数据库中的 sqlerrd (6) 除外。
SQLERRD(1) INTEGER 如果调用连接并成功,那么当从应用程序代码页转换为数据库代码页时,包含混合字符数据 (CHAR 数据类型) 的最大预期长度差异。 值为 0 或 1 指示没有扩展;值大于 1 指示长度可能扩展;负数值指示可能收缩。

从 SQL 过程成功返回时,包含 SQL 过程的返回状态值。

SQLERRD(2) INTEGER

如果调用连接并成功,那么当从数据库代码页转换为应用程序代码页时,包含混合字符数据 (CHAR 数据类型) 的最大预期长度差异。 值为 0 或 1 指示没有扩展;值大于 1 指示长度可能扩展;负数值指示可能收缩。 如果 SQLCA 来自迂到一个或多个错误的 NOT ATatomic 复合 SQL 语句,那么该值将设置为失败的语句数。

sqlerrd (3) INTEGER 如果调用 PREPARE 并成功,那么包含将返回的行数的估算值。 在 INSERT , UPDATE , DELETE 或 MERGE 之后,包含符合操作条件的实际行数。 对于TRUNCATE语句,其值为 -1。 如果调用复合 SQL ,那么包含所有子语句行的累积。 如果调用 CONNECT ,那么包含 1 (如果可以更新数据库) 或 2 (如果数据库为只读)。

如果调用了 OPEN 语句,并且游标包含 SQL 数据更改语句,那么此字段包含符合嵌入式插入,更新,删除或合并操作条件的行数总和。

如果在编译 SQL 例程,触发器或动态复合 SQL (直接插入或编译) 语句期间迂到错误,那么 sqlerrd (3) 包含迂到错误的行号。 sqlcaid 的第六个字节必须是 L ,此条目才能是有效的行号。

如果在执行已编译的 SQL 例程,触发器或动态 SQL (已编译) 语句期间迂到错误,那么 sqlerrd (3) 包含发生错误的行号。 sqlcaid 的第六个字节必须是 M ,这样才能成为有效的行号。

sqlerrd (4) INTEGER

如果调用 PREPARE 并成功,那么包含处理该语句所需的资源的相对成本估算。 如果调用复合 SQL ,那么包含成功子语句数的计数。 如果调用 CONNECT ,那么对于来自客户机的非最新级别的一阶段落实,包含 0; 对于一阶段落实,包含 1; 对于一阶段只读落实,包含 2; 对于两阶段落实,包含 3。

如果在执行已编译的 SQL 例程或触发器期间迂到错误,那么 sqlerrd (4) 包含一个整数,用于唯一地标识发生错误的例程或触发器。 要使此条目成为有效行号, sqlcaid 的第六个字节必须为 M

sqlerrd (5) INTEGER
包含由于下列操作而删除、插入或更新的总行数:
  • 在删除操作成功后强制执行约束
  • 处理通过激活的直接插入触发器触发的 SQL 语句
如果调用了复合 SQL 语句,那么它包含所有子语句的这种行数的总和。 在某些情况下,在遇到错误时,此字段包含一个负数值,它是内部错误指针。 如果调用 CONNECT ,那么包含认证类型值:
  • 0 用于服务器认证
  • 用于客户机认证的 1
  • 2 ,用于使用 Db2® Connect 进行认证
  • SERVER_ENCRYPT 认证的 4
  • 5 ,用于使用 Db2 Connect with encryption 进行认证;
  • 7 用于 KERBEROS 认证
  • 9 用于 GSSPLUGIN 认证
  • 11 用于 DATA_ENCRYPT 认证
  • 255 表示未指定的认证。
重要: DATA_ENCRYPT 和 DATA_ENCRYPT_CMP 身份验证类型已过时,可能会在未来版本中删除。 为了加密客户端和 Db2之间的传输数据,我们建议您使用传输层安全性(TLS)的 Db2系统支持。 更多信息,请参阅 “传输中的数据加密”
sqlerrd (6) INTEGER 对于分区数据库,包含迂到错误或警告的数据库分区的分区号。 如果未迂到任何错误或警告,那么此字段包含协调程序分区的分区号。 此字段中的数字与在 db2nodes.cfg 文件中为数据库分区指定的数字相同。
sqlwarn 数组 一组警告指示符,每个都包含一个空白或 W。 如果调用复合 SQL ,那么包含为所有子语句设置的警告指示符的累积。
sqlwarn0 CHAR(1) 如果所有其他指示符都是空白,那么为空白; 如果至少有一个其他指示符不是空白,那么包含 W
sqlwarn1 CHAR(1) 如果在分配给主变量时截断了字符串列的值,那么包含 W 。 如果截断了空终止符,那么包含 N 。 如果 CONNECT 或 ATTACH 成功,并且连接的授权名称超过 8 字节,那么包含 A 。 如果存储在 sqlerrd (4) 中的 PREPARE 语句相对成本估计值超过了可以存储在 INTEGER 中的值或小于 $TAG4 ,并且 CURRENT EXPLAIN MODE 或 CURRENT EXPLAIN SNAPSHOT 专用寄存器设置为非 NO 值,那么包含 P
sqlwarn2 CHAR(1) 如果从聚集函数的自变量中消除了空值,那么包含 W软件

如果调用 CONNECT 并成功,那么包含 D (如果数据库处于停顿状态) 或 I (如果实例处于停顿状态)。

sqlwarn3 CHAR(1) 如果列数不等于主变量数,那么包含 W 。 如果在 ASSOCIATE LOCATORS 语句中指定的结果集定位器数量少于存储过程返回的结果集数量,则包含 Z
sqlwarn4 CHAR(1) 如果预编译 UPDATE 或 DELETE 语句不包含 WHERE 子句,那么包含 W
sqlwarn5 CHAR(1) 如果在 SQL 语句执行期间容许错误,那么包含 E
sqlwarn6 CHAR(1) 如果调整了日期计算结果以避免不可能的日期,那么包含 W
sqlwarn7 CHAR(1) 如果调用 CONNECT 并成功,如果服务器是 BigSQL ,则包含 " B ";如果服务器是 Db2 Warehouse SaaS ,则包含 "D"。
sqlwarn8 CHAR(1) 如果无法转换的字符已替换为替换字符,那么包含 W 。 如果尝试建立可信连接失败,那么包含 Y
sqlwarn9 CHAR(1) 如果在聚集函数处理期间忽略了有错误的算术表达式,那么包含 W
sqlwarn10 CHAR(1) 如果转换 SQLCA 中某个字段中的字符数据值时发生转换错误,那么包含 W
sqlstate CHAR(5) 指示最近执行的 SQL 语句的结果的返回码。

a 某些函数可能不会将 SQLWARN2 设置为 W ,即使消除了空值也是如此,因为结果不依赖于消除空值。

错误报告

错误报告的顺序为:

  1. 始终报告严重错误情况。 报告严重错误时,不会向 SQLCA 添加任何内容。
  2. 如果未发生严重错误,那么死锁错误优先于其他错误。
  3. 对于所有其他错误,将返回第一个负 SQL 代码的 SQLCA。
  4. 如果未检测到负 SQL 代码,那么将返回第一个警告 (即,正 SQL 代码) 的 SQLCA。

    在分区数据库系统中,如果对在一个数据库分区上为空但在其他数据库分区上具有数据的表调用了数据操作操作,那么将发生此规则的异常。 仅当来自所有数据库分区的代理程序返回 SQL0100W时,才会向应用程序返回 SQLCODE +100 ,这是因为该表在所有数据库分区上都为空,或者没有更多行满足 UPDATE 语句中的 WHERE 子句。

分区数据库系统中的 SQLCA 使用情况

在分区数据库系统中,一个 SQL 语句可能由不同数据库分区上的多个代理程序执行,并且每个代理程序可能会针对不同的错误或警告返回不同的 SQLCA。 协调程序代理程序也有自己的 SQLCA。

要为应用程序提供一致的视图,会将所有 SQLCA 值合并到一个结构中,并且 SQLCA 字段指示全局计数,如下所示:
  • 对于所有错误和警告, sqlwarn 字段包含从所有代理程序接收到的警告标志。
  • sqlerrd 字段中的值指示行计数是来自所有代理程序的累积。
注: 每次处理触发的 SQL 语句期间发生错误时,都可能不会返回 SQLSTATE 09000。