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 字段描述
| Name | 数据类型 | 字段值 |
|---|---|---|
| sqlcaid | CHAR(8) | 包含 SQLCA的存储器转储的 眼睛捕获器。 如果从解析 SQL 例程, SQL 触发器或动态复合 SQL 语句返回行号信息,那么第六个字节为 L。 如果从执行编译型 SQL 例程,编译型 SQL 触发器或动态复合 SQL (编译型) 语句返回行号和对象标识信息,那么第六个字节为 M。 |
| sqlcabc | INTEGER | 包含 SQLCA 的长度, 136。 |
| sqlcode | INTEGER | 包含 SQL 返回码:
|
| 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,其中:
以下示例说明了产品特征符与 SQLERRP 字段中的新令牌之间的关系。 给定 Mod Pack 的所有后续修订包返回相同的 SQLERRP 值。
|
| 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 的第六个字节必须是 如果在执行已编译的 SQL 例程,触发器或动态 SQL (已编译) 语句期间迂到错误,那么 sqlerrd (3) 包含发生错误的行号。 sqlcaid 的第六个字节必须是 |
| sqlerrd (4) | INTEGER | 如果调用 PREPARE 并成功,那么包含处理该语句所需的资源的相对成本估算。 如果调用复合 SQL ,那么包含成功子语句数的计数。 如果调用 CONNECT ,那么对于来自客户机的非最新级别的一阶段落实,包含 0; 对于一阶段落实,包含 1; 对于一阶段只读落实,包含 2; 对于两阶段落实,包含 3。 如果在执行已编译的 SQL 例程或触发器期间迂到错误,那么 sqlerrd (4) 包含一个整数,用于唯一地标识发生错误的例程或触发器。 要使此条目成为有效行号, sqlcaid 的第六个字节必须为 |
| sqlerrd (5) | INTEGER | 包含由于下列操作而删除、插入或更新的总行数:
重要: 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 并成功,那么包含 |
| 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 ,即使消除了空值也是如此,因为结果不依赖于消除空值。 |
||
错误报告
错误报告的顺序为:
- 始终报告严重错误情况。 报告严重错误时,不会向 SQLCA 添加任何内容。
- 如果未发生严重错误,那么死锁错误优先于其他错误。
- 对于所有其他错误,将返回第一个负 SQL 代码的 SQLCA。
- 如果未检测到负 SQL 代码,那么将返回第一个警告 (即,正 SQL 代码) 的 SQLCA。
在分区数据库系统中,如果对在一个数据库分区上为空但在其他数据库分区上具有数据的表调用了数据操作操作,那么将发生此规则的异常。 仅当来自所有数据库分区的代理程序返回 SQL0100W时,才会向应用程序返回 SQLCODE +100 ,这是因为该表在所有数据库分区上都为空,或者没有更多行满足 UPDATE 语句中的 WHERE 子句。
分区数据库系统中的 SQLCA 使用情况
在分区数据库系统中,一个 SQL 语句可能由不同数据库分区上的多个代理程序执行,并且每个代理程序可能会针对不同的错误或警告返回不同的 SQLCA。 协调程序代理程序也有自己的 SQLCA。
- 对于所有错误和警告, sqlwarn 字段包含从所有代理程序接收到的警告标志。
- sqlerrd 字段中的值指示行计数是来自所有代理程序的累积。